Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.js-什么是平面几何体_Javascript_Three.js - Fatal编程技术网

Javascript Three.js-什么是平面几何体

Javascript Three.js-什么是平面几何体,javascript,three.js,Javascript,Three.js,什么是平面几何,它与平面几何有何不同?(r69)PlaneBuffer Geometry是一种低内存的替代方案。对象本身在很多方面都不同。例如,顶点位于PlaneBufferGeometry中,而不是位于PlaneBufferGeometry.attributes.position中 您可以在浏览器控制台中快速查看以找出更多差异,但据我所知,由于顶点通常彼此间隔均匀(X和Y),因此只需要指定高度(Z)来定位顶点 主要区别在和之间 几何体是一种“用户友好”的面向对象数据结构,而BufferGeom

什么是平面几何,它与平面几何有何不同?(r69)

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个。