Three.js - 什么是PlaneBufferGeometry

时间:2014-11-29 03:21:53

标签: javascript three.js

究竟什么是PlaneBufferGeometry以及它与PlaneGeometry的不同之处? (R69)

2 个答案:

答案 0 :(得分:20)

PlaneBufferGeometryPlaneGeometry的低内存替代品。对象本身在很多方面都有所不同。例如,顶点位于PlaneBufferGeometry位于PlaneBufferGeometry.attributes.position而不是PlaneGeometry.vertices

你可以快速查看浏览器控制台以找出更多的差异,但据我所知,由于顶点通常间隔均匀(XY)彼此之间,只需要给出高度(Z)来定位顶点。

答案 1 :(得分:3)

主要区别在于GeometryBufferGeometry

Geometry是一种“用户友好的”,面向对象的数据结构,而BufferGeometry是一种数据结构,可以更直接地映射到着色器程序中数据的使用方式。 BufferGeometry更快,内存更少,但Geometry在某些方面更灵活,可以更轻松地完成某些操作。

我几乎没有使用Geometry的经验,因为我发现BufferGeometry在大多数情况下都可以完成工作。学习和使用着色器使用的实际数据结构非常有用。

对于PlaneBufferGeometry,您可以像这样访问顶点位置:

let pos = geometry.getAttribute("position");
let pa = pos.array;

然后设置如下的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();

随机性就是一个例子。如果你在内循环中let x = pa[3*(j*wVerts+i)];let y = pa[3*(j*wVerts+i)+1];,你也可以(另一个例子)绘制x,y的函数。为了在PlaneBufferGeometry情况下获得小的性能优势,而在外部循环中使用let y = (0.5-j/(hVerts-1))*geometry.height

如果您的材料使用法线并且您没有通过分析计算更准确的法线,则建议使用

geometry.computeVertexNormals();。如果您不提供或计算法线,则材质将使用默认平面法线,它们都直接指向原始平面。

请注意,沿着维度的顶点数量比沿同一维度的段数量多一个。

另请注意(违反直觉)y值相对于j索引翻转:vertices.push( x, - y, 0 );source