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

THREE.js line drawn with BufferGeometry not rendering if the origin of the line isn't in the camera's view

我正在为需要在时间步长值之间跳跃的可视化项目编写跟踪线函数。我的问题是,在渲染过程中,使用 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;       
    }
};

非常感谢!

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

traceLine.frustumCulled = false;

另一种选择是确保包围球是最新的,但考虑到您的用例,这似乎在计算上太昂贵了。

three.js r.73