如果线条的原点不在相机的视图中,则使用BufferGeometry绘制的THREE.js线不会渲染

时间:2016-01-13 23:21:59

标签: javascript three.js line

我正在为可视化项目编写跟踪线函数,该项目需要在时间步长值之间跳转。我的问题是,在渲染过程中,使用THREE.js的BufferGeometry和setDrawRange方法创建的线只有在线的原点位于摄像机视图中时才可见。平移将导致线条消失并向线条原点(通常为0,0,0)平移将使其再次出现。这有什么理由和解决方法吗?我试过玩渲染设置。

我所包含的代码正用于测试,并随着时间的推移绘制对象的痕迹。

var traceHandle = {
    /* setup() returns trace-line */
    setup : function (MAX_POINTS) {
        var lineGeo = new THREE.BufferGeometry();
        //var MAX_POINTS = 500*10;
        var positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
        lineGeo.addAttribute('position', new THREE.BufferAttribute(positions, 3));
        var lineMaterial = new THREE.LineBasicMaterial({color:0x00ff00 });  
        var traceLine = new THREE.Line(lineGeo, lineMaterial);
        scene.add(traceLine);
        return traceLine;
    },
    /****
    * updateTrace() updates and draws trace line
    * Need 'index' saved globally for this
    ****/
    updateTrace : function (traceLine, obj, timeStep, index) {
        traceLine.geometry.setDrawRange( 0, timeStep );
        traceLine.geometry.dynamic = true;
        var positions = traceLine.geometry.attributes.position.array;
        positions[index++]=obj.position.x;
        positions[index++]=obj.position.y;
        positions[index++]=obj.position.z;

        // required after the first render
        traceLine.geometry.attributes.position.needsUpdate = true; 
        return index;       
    }
};

非常感谢!

1 个答案:

答案 0 :(得分:2)

可能,边界球体未定义或半径为零。由于您是动态添加点,因此可以设置:

traceLine.frustumCulled = false;

另一个选择是确保边界球是最新的,但考虑到你的用例,这似乎太计算了。

three.js r.73