Mil*_*dfx 17 javascript three.js
什么是PlaneBufferGeometry以及它与PlaneGeometry的不同之处?(R69)
Kev*_*uyl 21
PlaneBufferGeometry
是一种低记忆替代品PlaneGeometry
.对象本身在很多方面都有所不同.例如,顶点位于PlaneBufferGeometry中,PlaneBufferGeometry.attributes.position
而不是位于PlaneGeometry.vertices
您可以快速查看浏览器控制台以找出更多差异,但据我所知,由于顶点通常彼此间隔均匀(X
和Y
),因此只Z
需要给出高度()定位顶点.
主要区别在于Geometry和BufferGeometry之间。
Geometry 是一种“用户友好”的面向对象的数据结构,而 BufferGeometry 是一种数据结构,它更直接地映射到数据在着色器程序中的使用方式。BufferGeometry 速度更快,需要的内存更少,但 Geometry 在某些方面更灵活,并且可以更轻松地完成某些操作。
我对几何的经验很少,因为我发现 BufferGeometry 在大多数情况下都可以完成这项工作。学习和使用着色器使用的实际数据结构很有用。
在 PlaneBufferGeometry 的情况下,您可以像这样访问顶点位置:
let pos = geometry.getAttribute("position");
let pa = pos.array;
Run Code Online (Sandbox Code Playgroud)
然后像这样设置 z 值:
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();
Run Code Online (Sandbox Code Playgroud)
随机性只是一个例子。你也可以(另如)绘制的x,y的函数,如果你let x = pa[3*(j*wVerts+i)];
和let y = pa[3*(j*wVerts+i)+1];
在内环。为了在 PlaneBufferGeometry 情况下获得较小的性能优势,请改为let y = (0.5-j/(hVerts-1))*geometry.height
使用外循环。
geometry.computeVertexNormals();
如果您的材料使用法线并且您没有通过分析计算更准确的法线,则建议使用。如果您不提供或计算法线,则材质将使用默认平面法线,这些法线均直接指向原始平面。
请注意,沿维度的顶点数比沿同一维度的线段数多 1。
还需要注意的是(违反直觉地)的y值被翻转相对于第j指数:vertices.push( x, - y, 0 );
(源)