我学会了如何在Three.js中绘制线条,但问题是需要动态添加线条的顶点。当我动态添加顶点时,场景没有更新。
我尝试过geometry.verticesNeedUpdate = true
,但似乎没有起作用。
我学会了如何在Three.js中绘制线条,但问题是需要动态添加线条的顶点。当我动态添加顶点时,场景没有更新。
我尝试过geometry.verticesNeedUpdate = true
,但似乎没有起作用。
编辑:现在可以使用BufferGeometry
和drawcalls
实现等效功能。请参见使用three.js动态绘制一条线。
three.js r.71
不支持动态添加线的顶点。如Wiki所述:
您只能更新缓冲区的内容,不能调整缓冲区的大小(这非常耗费成本,基本上等同于创建新几何体)。
您可以通过预分配较大的缓冲区并保持不需要的顶点折叠/隐藏来模拟调整大小。
three.js r.55
提前创建一个THREE.Geometry对象,并使用尽可能多的顶点进行初始化(或者使用相当高数量的顶点)。 (在您想要显示它们之前,您还需要以某种方式隐藏它们 - 我将它们的位置设置为屏幕外。)
使用该几何体创建一个THREE.Line对象,并将其添加到场景中。
现在,当您想要向行中添加新点时,您必须索引到几何体对象的顶点中,找到其中最后一个未使用的顶点,并更新它 - 将坐标更改为实际坐标,并设置geometry.verticesNeedUpdate = true;
(否则它会认为没有更改)。 (请参见维基上的如何进行更新。)
正如WestLangley的回答所说,你不能这样做。下面是我决定使用的权宜之计:
代码: 创建新行:
function createNewLine(startingPoint){
var geometry = new THREE.Geometry();
for (i=0; i<MAX_LINE_POINTS; i++){
geometry.vertices.push(startingPoint.clone());
}
myLine = new THREE.Line(geometry, lineMaterial);
myLine.geometry.dynamic = true;
scene.add(myLine);
render();
}
添加一个点到线上:
function addPoint(myPoint) {
myLine.geometry.vertices.push(myLine.geometry.vertices.shift()); //shift the array
myLine.geometry.vertices[maxLinePoints-1] = myPoint; //add the point to the end of the array
myLine.geometry.verticesNeedUpdate = true;
render();
}
那么你最终得到的是一条线,上面堆积了一堆点,接着是你实际想要渲染的点。 我在three.js的git仓库上提交了一个问题,寻求更简单的解决方案。 https://github.com/mrdoob/three.js/issues/4716