Better

Ethan的博客,欢迎访问交流

BufferGeometry 渲染热力图小踩坑

最近一个需求中,使用 BufferGeometry 进行热力图的绘制,踩了点小坑,简单记录一下啊。

原理

通过手动构造三角面、通过顶点上色的方式进行渲染,踩坑如下

  • 当你使用顶点索引的方式复用顶点,但又想通过顶点进行上色时(复用的点颜色不一样),即使你设置了同样顶点索引数量的颜色值,但结果依旧是不符合预期的,这时候不能使用顶点索引
  • 在 three.js 中颜色的 rgb 表示范围是 0-1,而不是 0-255,超过 1 会统统处理成白色,你可以每 3 位一组设置 r/g/b,也可以每 4 位一组,设置 r/g/b/a
  • 手动构造三角面时,顶点的顺序很重要,推荐使用右手法则(逆时针)的方式进行构造,否则会导致自动计算的法向量向里,从而渲染不对,除非设置 side 为 DoubleSide

扩展

由于粗心犯错,于是重看了一遍 Color 对象。Geometry 顶点上色中如果两点颜色不同,则会进行线性插值。有时候我们需要手动进行线性插值,这时候 Color 对象其实已经有方法了,这里把常用的 api 罗列一下吧

  • 构造函数重载,支持多种方式进行对象创建
  • r/g/b 在 0 到 1 之间,默认值为 1
  • add(color) 将自身颜色的 RGB 值与参数进行相加
  • addColors(color1, color2) 将颜色的 RGB 值设置为 color1 和 color2 的和
  • equals(color) 是否相同判断
  • fromArray(array, offset) 通过格式为 [r,g,b] 的数组进行创建
  • getHex() 得到颜色的十六进制值
  • getHexString() 得到颜色的十六进制值作为字符串返回
  • getHSL() 将 RGB 格式转换为 HSL 格式
  • getStyle() 以 CSS 样式字符串形式返回该颜色值
  • lerp(color, alpha) 将该颜色的RGB值线性插值到传入参数的RGB值。alpha参数可以被认为是两种颜色之间的比例值,其中0是当前颜色和1.0是第一个参数的颜色
  • lerpColors(color1, color2, alpha) 将该颜色设置为线性插值颜色 color1 和 color2
  • multiply(color) 对应 RGB 位值相乘
  • multiplyScalar(s) 对应 RGB 位值乘统一的标量
  • set/setHex/setHSL/setRGB/setScalar/setStyle/setColorName
  • sub(color) 从该颜色的RGB分量中减去传入颜色的RGB分量。如果分量结果是负,则该分量为零

MathUtils 中也有类似 api

  • clamp(value, min, max) 限制 value 处于 min 和 max 之间
  • lerp(x, y, t) 线性插值
  • mapLinear(x, a1, a2, b1, b2) x 从范围 [a1, a2] 到 [b1, b2] 的映射
  • ……


留言