1

我以为我想要一个安静简单的东西,但结果比我预期的要复杂..

我想要的只是THREE.BufferGeometry(球体)的每个顶点上的网格!

编解码器:codepen.io/cheesyeyes/pen/YwBZGz

这就是我想要的

这是我的缓冲区几何:

var bufferGeometry = new THREE.SphereBufferGeometry(1,1,1);

我正在尝试获取顶点的位置:

bufferGeometry.getAttribute('position',0);

那么如何正确读取它们以便获得bufferGeometry的所有(此处为5)顶点的位置?

我试过这样。它确实有效,但我认为它非常难看:

vertexMesh.position.x=position.array[0];
vertexMesh.position.y=position.array[1];
vertexMesh.position.z=position.array[2];

for(i=12;i<position.array.length-9;i=i+3)
            { 

            //vertexGeometry
            var vertexGeometry = new THREE.SphereGeometry(0.1,32,32);

            var vertexMaterial = new THREE.MeshBasicMaterial({color:0xff0000});   

            var vertexMesh = new THREE.Mesh(vertexGeometry,vertexMaterial);    

            vertexMesh.position.x=position.array[i];
            vertexMesh.position.y=position.array[i+1];
            vertexMesh.position.z=position.array[i+2]; 

             scene.add(vertexMesh);

            }

我根本不明白这个数组是如何排列的..请帮帮我!谢谢!

4

1 回答 1

1

BufferGeometry 将顶点存储在一维数组中,其中每组三个索引代表一个 Vector3(顶点位置)。所以如果你有这个数组:

var verts = [0, 0, 0, 0, 1, 0, 1, 1, 1];

你应该在 (x, y, z) 三元组中考虑它:

vert # 1: (0, 0, 0)
vert # 2: (0, 1, 0)
vert # 3: (1, 1, 1)

事实上,您可以在 three.js 文档中看到这样的示例;去阅读 BufferGeometry 页面,你的问题可能会自己回答:

// components of the position vector for each vertex are stored
// contiguously in the buffer.
for ( var i = 0; i < vertexPositions.length; i++ )
{
    vertices[ i*3 + 0 ] = vertexPositions[i][0];
    vertices[ i*3 + 1 ] = vertexPositions[i][1];
    vertices[ i*3 + 2 ] = vertexPositions[i][2];
}

话虽如此,您使用 BufferGeometry 是否有特殊原因?如果您确实需要出于优化目的,您应该只使用该类。BufferGeometry 将其数据存储为原始数字数组,并且比常规的 Geometry 类更难访问和操作,后者方便地将其顶点存储为 Vector3s 数组。除非您有令人信服的理由不这样做,否则请坚持使用 Geometry 而不是 BufferGeometry。

于 2016-02-12T21:24:44.460 回答