我试图用three.js做一件特别的事情,并且我有一段时间弄清楚我是不是应该从头开始,或者我是否在正确的轨道上
我通过gcode文件解析我的方式,gcode文件本质上是一个巨大的文本文件,其中包含3D打印机的位置和挤出数据。我按顺序读取并将所有位置加载到THREE.Geometry()
作为顶点,然后使用所有这些位置和顶点颜色创建一条线。
这就是它的样子:
var vis = new Visualizer();
vis.init();
if (typeof geometryArr == 'object' && geometryArr[0] != undefined) {
colorScheme = [ "#0000ff", "#00ff00", "#d3d3d3", "#ff0000" ];
var lastGeo = [0, 0, 0, false, 0];
var currentGeo = [];
var geometry = new THREE.Geometry();
var lineMat = new THREE.LineBasicMaterial({
color: 0xffffff,
vertexColors: THREE.VertexColors,
transparent: true,
opacity: 1.0,
});
geometryArr.map(function(points, i) {
currentGeo = points;
if (currentGeo[3] == true && lastGeo[3] == true) {
geometry.vertices.push( new THREE.Vector3( currentGeo[0], currentGeo[1], currentGeo[2] ) );
geometry.colors.push( new THREE.Color ( colorScheme[ currentGeo[4] ] ) );
lastGeo = currentGeo;
} else {
lastGeo = currentGeo;
}
});
line = new THREE.Line( geometry, lineMat, THREE.LineSegments );
vis.scene.add(line);
}
vis.render();
vis.animate();
基本上,我知道哪些顶点对应该是不可见的(geometryArr
有这种东西的标志),所以我知道我需要处理哪些顶点。
我尝试过: *删除有问题的顶点对 - 无论如何,只需在下一组顶点之间绘制直线 *有第二行,有一组透明(0不透明度)的线段应该是 - 它们是不可见的并且没有效果(谁有笨蛋?) *单独绘制每个线段 - 我的计算机在尝试渲染20,000个线段后再回到室温,然后在修改后再渲染20,000个(总共40,000个!)并且性能下降到爬行状态。不理想的结果。
我希望THREE.Geometry
和THREE.Line
具有从某一行中删除特定线段的某种功能,但这样做了吗?
PS。如果没有,并且确认了,我可能会将此移动到THREE.BufferGeometry
并使用着色器将某些行渲染为不可见。可能需要一段时间,并希望避免走那么远。
非常感谢!
答案 0 :(得分:3)
有两种方法可以在three.js中绘制具有几何的线条。
THREE.Line( geometry, material );
THREE.LineSegments( geometry, material );
THREE.LineSegments
类将每两个后续顶点与一条线连接起来。因此,如果你想要这个类的连续线,你需要复制中间的点。
在这里解释一个例子:
v1 = new THREE.Vector3( 0, 0, 0 );
v2 = new THREE.Vector3( 10, 0, 0 );
v3 = new THREE.Vector3( 20, 0, 0 );
v4 = new THREE.Vector3( 30, 0, 0 );
如果使用这些点制作几何体并使用THREE.LineSegments
:
geometry = new THREE.Geometry();
geometry.vertices.push( v1, v2, v3, v4 );
line = new THREE.LineSegments( geometry );
看起来像这样:
.__. .__.
1 2 3 4
如果你这样做:
geometry = new THREE.Geometry();
geometry.vertices.push( v1, v2, v2, v3, v3, v4 );
line = new THREE.LineSegments( geometry );
它看起来像这样:
.__.__.__.
1 2 3 4
THREE.Line
类的行为不同,并且始终将所有顶点连接成一条直线。
geometry = new THREE.Geometry();
geometry.vertices.push( v1, v2, v3, v4 );
line = new THREE.Line( geometry );
将绘制连接顶点数组中点的连续线:
.__.__.__.
1 2 3 4
我希望这可以帮助您解决问题。