从Line中删除LineSegments?

时间:2016-03-02 22:38:47

标签: javascript three.js

我试图用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.GeometryTHREE.Line具有从某一行中删除特定线段的某种功能,但这样做了吗?

PS。如果没有,并且确认了,我可能会将此移动到THREE.BufferGeometry并使用着色器将某些行渲染为不可见。可能需要一段时间,并希望避免走那么远。

非常感谢!

1 个答案:

答案 0 :(得分:3)

有两种方法可以在three.js中绘制具有几何的线条。

  1. 连续线:THREE.Line( geometry, material );
  2. 分段线:THREE.LineSegments( geometry, material );
  3. THREE.LineSegments

    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

    THREE.Line类的行为不同,并且始终将所有顶点连接成一条直线。

    geometry = new THREE.Geometry();
    geometry.vertices.push( v1, v2, v3, v4 );
    
    line = new THREE.Line( geometry );
    

    将绘制连接顶点数组中点的连续线:

    .__.__.__.
    1  2  3  4
    

    我希望这可以帮助您解决问题。