【问题标题】:How to cast a visible ray threejs如何投射可见光线threejs
【发布时间】:2015-10-17 19:17:17
【问题描述】:

我想用相机的视野瞄准物体(因为用户会看着物体,而不是用鼠标指向它)。

我正在像这样从相机投射光线

rotation.x = camera.rotation.x;
    rotation.y = camera.rotation.y;
    rotation.z = camera.rotation.z;
    raycaster.ray.direction.copy( direction ).applyEuler(rotation);
    raycaster.ray.origin.copy( camera.position );

var intersections = raycaster.intersectObjects( cubes.children );

这让我到达了十字路口,但有时它似乎会迷路。所以我想添加瞄准(十字准线)。那将是光线末端或中间的物体(网格)上的某种东西。

如何添加?当我创建一条常规线时,它位于相机前面,因此屏幕会变黑。

【问题讨论】:

    标签: three.js


    【解决方案1】:

    您可以将由简单几何构造的十字准线添加到您的相机,如下所示:

    var material = new THREE.LineBasicMaterial({ color: 0xAAFFAA });
    
    // crosshair size
    var x = 0.01, y = 0.01;
    
    var geometry = new THREE.Geometry();
    
    // crosshair
    geometry.vertices.push(new THREE.Vector3(0, y, 0));
    geometry.vertices.push(new THREE.Vector3(0, -y, 0));
    geometry.vertices.push(new THREE.Vector3(0, 0, 0));
    geometry.vertices.push(new THREE.Vector3(x, 0, 0));    
    geometry.vertices.push(new THREE.Vector3(-x, 0, 0));
    
    var crosshair = new THREE.Line( geometry, material );
    
    // place it in the center
    var crosshairPercentX = 50;
    var crosshairPercentY = 50;
    var crosshairPositionX = (crosshairPercentX / 100) * 2 - 1;
    var crosshairPositionY = (crosshairPercentY / 100) * 2 - 1;
    
    crosshair.position.x = crosshairPositionX * camera.aspect;
    crosshair.position.y = crosshairPositionY;
    
    crosshair.position.z = -0.3;
    
    camera.add( crosshair );
    scene.add( camera );
    

    三.js r107

    http://jsfiddle.net/5ksydn6u/2/


    如果您没有特殊的用例需要像您一样从相机中检索位置和旋转,我想您的“徘徊”可以通过使用这些参数调用您的 raycaster 来解决。:

    raycaster.set( camera.getWorldPosition(), camera.getWorldDirection() );
    var intersections = raycaster.intersectObjects( cubes.children );
    

    投射可见光线 然后,您可以通过使用箭头助手绘制箭头,在 3D 空间中可视化您的光线投射。在您的光线投射之后执行此操作:

    scene.remove ( arrow );
    arrow = new THREE.ArrowHelper( camera.getWorldDirection(), camera.getWorldPosition(), 100, Math.random() * 0xffffff );
    scene.add( arrow );
    

    【讨论】:

    • 谢谢你,非常详尽的回答!
    • 我已使用此代码在场景中成功创建了一个十字准线,但是该十字准线通过了场景中所有其他对象的后面。有没有办法总是强制十字准线出现在顶部?
    • 您必须控制渲染顺序,或使用second scene 方法。另一件事是将十字准线创建为 HTML-Overlay。
    • 为了根据光线(而不是相机)绘制箭头,我使用了这个:scene.add(new Three.ArrowHelper( raycaster.ray.direction, raycaster.ray.origin, 100, Math.random() * 0xffffff ));
    • @Falk Thiele 我爱你
    猜你喜欢
    • 2022-10-15
    • 2016-03-15
    • 1970-01-01
    • 2019-12-01
    • 2017-02-21
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多