Javascript Three.js-什么是平面几何体
什么是平面几何,它与平面几何有何不同?(r69)Javascript Three.js-什么是平面几何体,javascript,three.js,Javascript,Three.js,什么是平面几何,它与平面几何有何不同?(r69)PlaneBuffer Geometry是一种低内存的替代方案。对象本身在很多方面都不同。例如,顶点位于PlaneBufferGeometry中,而不是位于PlaneBufferGeometry.attributes.position中 您可以在浏览器控制台中快速查看以找出更多差异,但据我所知,由于顶点通常彼此间隔均匀(X和Y),因此只需要指定高度(Z)来定位顶点 主要区别在和之间 几何体是一种“用户友好”的面向对象数据结构,而BufferGeom
PlaneBuffer Geometry
是一种低内存的替代方案。对象本身在很多方面都不同。例如,顶点位于PlaneBufferGeometry中,而不是位于PlaneBufferGeometry.attributes.position中
您可以在浏览器控制台中快速查看以找出更多差异,但据我所知,由于顶点通常彼此间隔均匀(
X
和Y
),因此只需要指定高度(Z
)来定位顶点 主要区别在和之间
几何体是一种“用户友好”的面向对象数据结构,而BufferGeometry是一种更直接映射到着色器程序中数据使用方式的数据结构。BufferGeometry速度更快,所需内存更少,但Geometry在某些方面更灵活,某些操作可以更轻松地完成
我几乎没有几何方面的经验,因为我发现在大多数情况下,BufferGeometry都能完成这项工作。了解并使用着色器使用的实际数据结构非常有用
对于平面缓冲几何体,可以访问如下顶点位置:
let pos = geometry.getAttribute("position");
let pa = pos.array;
var hVerts = geometry.heightSegments + 1;
var wVerts = geometry.widthSegments + 1;
for (let j = 0; j < hVerts; j++) {
for (let i = 0; i < wVerts; i++) {
//+0 is x, +1 is y.
pa[3*(j*wVerts+i)+2] = Math.random();
}
}
pos.needsUpdate = true;
geometry.computeVertexNormals();
然后按如下方式设置z值:
let pos = geometry.getAttribute("position");
let pa = pos.array;
var hVerts = geometry.heightSegments + 1;
var wVerts = geometry.widthSegments + 1;
for (let j = 0; j < hVerts; j++) {
for (let i = 0; i < wVerts; i++) {
//+0 is x, +1 is y.
pa[3*(j*wVerts+i)+2] = Math.random();
}
}
pos.needsUpdate = true;
geometry.computeVertexNormals();
var hVerts=geometry.heightSegments+1;
var wVerts=geometry.widthSegments+1;
for(设j=0;j
随机性只是一个例子。如果你让x=pa[3*(j*wVerts+i)],你也可以(另一个例子)绘制x,y的函数
和设y=pa[3*(j*wVerts+i)+1]代码>在内部循环中。对于PlaneBufferGeometry情况下的小性能优势,将y=(0.5-j/(hVerts-1))*geometry.height
改为放在外环中
geometry.computeVertexNormals()如果材质使用法线,而您尚未通过分析计算出更精确的法线,则建议使用“代码>”。如果不提供或计算法线,则材质将使用默认平面法线,所有法线都直接指向原始平面
请注意,沿标注的顶点数比沿同一标注的线段数多一个
还要注意(与直觉相反)y值相对于j索引翻转:顶点。push(x,-y,0)代码>()即使x、y坐标已经用平面几何体或平面几何体给出,它们仍然是每个顶点的数据表示的一部分,并且仍然可以修改。+1
在宽度段+1
中是否有必要?这会跳过第一行,不是吗?假设你指的是这一行:pa[3*(j*(geometry.widthSegments+1)+i)+2]=Math.random();当j为0时,第一行将被迭代。很好,很有用!也许,最好加上为什么我在循环和计算中使用+1逻辑。要生成N个线段,需要N+1个顶点。所以实际的顶点数总是比线段数多1个。