Three.js - 如何使用BufferGeometry绘制不连续的线?

Pan*_*han 3 javascript line webgl three.js

我有以下情况:我需要画一条带孔的线(一条不连续的线).这意味着我的Line包含几个视觉上没有组合的片段,但它们在其他一些上下文中属于一起.这些细分不仅仅包含两个点,所以不是这样的THREE.LinePieces工作方式.

这时,我用a BufferGeometry来存储我的顶点.一位同事告诉我,在WebGL中可以创建除顶点之外的两个数组:一个包含顶点的索引,另一个包含顶点应该如何组合的顺序.这是我的意思的一个例子:

indices = [0,1,2,3,4,5]
vertices = [x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, x5, y5, z5]
order = [0,1,1,2,3,4,4,5]
Run Code Online (Sandbox Code Playgroud)

有了这个,我会得到两条线:第一条从0点到1点到2点,然后是一个洞,然后是第二条线从3点到4点到5点.

所以像这样:

.___.___.   .___.___.
0   1   2   3   4   5
Run Code Online (Sandbox Code Playgroud)

我不熟悉WebGL,所以我相信我的同事可以创建这样的结构.但这对Three.js来说也是可能的吗?如果是的话,你是怎么做到的?


编辑:我再次与我的同事交谈,我得到了这段代码

indexBufferData = [0,1,1,2,3,4,4,5];
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER,
             indexBufferData.limit() * Buffers.SIZEOF_INT,
             indexBufferData, GL.GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

他说我只需复制索引而不是顶点(也可能但不建议)来获取线段.

所以我搜索WebGLRenderer并在2380行看到如果index我的属性中有一个属性,BufferGeometry将创建必要的缓冲区.但是设置此属性无效.使用THREE.LinePieces时仍然只连接两个点.

Wil*_*ilt 7

一个代码示例和一个小提琴.

// .___.___.___.   .___.
// 0   1   2   3   4   5

// line material
var material = new THREE.LineBasicMaterial({
    color: 0xffffff
});

vertices = [
    new THREE.Vector3(0, 0, 0),
    new THREE.Vector3(10, 0, 0),
    new THREE.Vector3(20, 0, 0),
    new THREE.Vector3(30, 0, 0),
    new THREE.Vector3(40, 0, 0),
    new THREE.Vector3(50, 0, 0)
];

var positions = new Float32Array(vertices.length * 3);

for (var i = 0; i < vertices.length; i++) {

    positions[i * 3] = vertices[i].x;
    positions[i * 3 + 1] = vertices[i].y;
    positions[i * 3 + 2] = vertices[i].z;

}

indices = [0, 1, 1, 2, 2, 3, 4, 5];

var geometry = new THREE.BufferGeometry();
geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.setIndex(new THREE.BufferAttribute(new Uint16Array(indices), 1));

var line = new THREE.LineSegments(geometry, material);
scene.add(line);
Run Code Online (Sandbox Code Playgroud)


Wes*_*ley 5

如果要绘制一系列连接的线段,然后先绘制一个间隙,然后再绘制另一系列的连接线段,则可以使用THREE.LineSegments它。

例如,这是具有三段的线的模式,然后是具有一个段的线的模式:

v0, v1, v1, v2, v2, v3, v4, v5
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

.___.___.___.   .___.
0   1   2   3   4   5
Run Code Online (Sandbox Code Playgroud)

three.js r.91