在three.js中,沿着射线绘制直线

3
在three.js中,我使用PointerLock控件制作基本的第一人称射击游戏。 我使用了以下代码:
function onDocumentMouseDown( event ) {
  var raycaster = new THREE.Raycaster();
  mouse3D.normalize();
  controls.getDirection( mouse3D );
  raycaster.set( controls.getObject().position, mouse3D );
  var intersects = raycaster.intersectObjects( objects );
  ...
}

为了检测与物体的碰撞,这意味着你“射击”了该物体。

现在,我想要可视化子弹所经过的路径。我想过从用户所看到的位置开始画一条线,朝着射线投射器的方向,但我不知道如何做...有人能帮助我吗?我是three.js的新手,从来没有想过画一条线会这么难。

更新: 我正在尝试使用:

var geometry = new THREE.Geometry();
geometry.vertices.push(...);
geometry.vertices.push(...);
var line = new THREE.Line(geometry, material);
scene.add(line);

但我不知道在“…”的位置应该填写什么。我如何检测线条应该连接哪个点?以及如何确定起始点是哪个点?玩家可以移动甚至跳跃,因此起始点也总是不同的。


https://github.com/mrdoob/three.js/wiki/Drawing-lines - 2pha
谢谢您提供的参考。我现在知道如何画一条线,但仍然无法解决我的问题。我已经更新了我的问题。 - binoculars
我认为你只需要向 push() 方法发送起点和终点(向量)。第一个可能是你的相机位置 geometry.vertices.push(camera.position)。第二个是从 intersectObjects 函数返回的第一个交点的第一个点。geometry.vertices.push(intersects[0].point)。我没有使用过 Raycaster,所以没有测试过,但它应该是这样的。 - 2pha
2个回答

4
您可以使用以下代码(使用r83版本):
    // Draw a line from pointA in the given direction at distance 100
    var pointA = new THREE.Vector3( 0, 0, 0 );
    var direction = new THREE.Vector3( 10, 0, 0 );
    direction.normalize();

    var distance = 100; // at what distance to determine pointB

    var pointB = new THREE.Vector3();
    pointB.addVectors ( pointA, direction.multiplyScalar( distance ) );

    var geometry = new THREE.Geometry();
    geometry.vertices.push( pointA );
    geometry.vertices.push( pointB );
    var material = new THREE.LineBasicMaterial( { color : 0xff0000 } );
    var line = new THREE.Line( geometry, material );
    scene.add( line );

在Codepen上查看:https://codepen.io/anon/pen/evNqGy


0
你可以使用类似这样的代码:
function animate_Line(frame, totalFrames) {

    //Calculate how much of the line should be drawn every iteration
    var delta = lineDistance/(totalFrames);  
    var deltaSpeed = delta * frame;

    for(var i=0; i<f_Ray_List[0].length; i++) {
        for(var j=0; j<f_Ray_List[1].length; j++) {
            //Change Offsets
            line.geometry.vertices[1].y = line.geometry.vertices[0].y - deltaSpeed;

            //Update Rays = true (Make FRT rays draw-able)
            line.geometry.verticesNeedUpdate = true;
        } 
    }
}

其中frame是当前帧(在您的动画函数中的计数器),totalFrames是线条动画所需的总帧数。可以通过以下方式计算lineDistance

 lineDistance = line.geometry.vertices[0].y - line.vertices[1].y; //Add this line where you create the line object.

记得在每条线上单独调用line.geometry.verticesNeedUpdate = true;,这样该线才能被动画化。

请注意,这仅基于Line.y轴。一开始可能不是很好。我目前正在尝试将其转换为极坐标,但我不知道发生了什么哈哈哈。

DEMO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接