Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用光线投射器从播放器';你的观点是什么?_Javascript_Three.js_Raycasting - Fatal编程技术网

Javascript 使用光线投射器从播放器';你的观点是什么?

Javascript 使用光线投射器从播放器';你的观点是什么?,javascript,three.js,raycasting,Javascript,Three.js,Raycasting,我很难用光线投射器获得玩家在世界上看的位置的坐标。它在任何十字路口都不起作用 更具体地说,我试图获得地形上交点的坐标,它由多个几何体网格组成。我使用的代码取自:(groupedmesharray存储缓冲几何体网格) 以及显示玩家视图的图像: (红点说明我要从相机中心向地形投射光线) 鼠标/指针被锁定(第一人称摄影机视图),所以我假设我要检查屏幕中心的交叉点?上面的代码没有这样做,所以我一直在测试,没有锁定指针 如果有人能理解为什么它没有检测到任何十字路口,我将非常感谢你的帮助。谢谢 编辑:

我很难用光线投射器获得玩家在世界上看的位置的坐标。它在任何十字路口都不起作用

更具体地说,我试图获得地形上交点的坐标,它由多个几何体网格组成。我使用的代码取自:(
groupedmesh
array存储缓冲几何体网格)

以及显示玩家视图的图像:
(红点说明我要从相机中心向地形投射光线)

鼠标/指针被锁定(第一人称摄影机视图),所以我假设我要检查屏幕中心的交叉点?上面的代码没有这样做,所以我一直在测试,没有锁定指针

如果有人能理解为什么它没有检测到任何十字路口,我将非常感谢你的帮助。谢谢


编辑:
似乎我应该使用
raycaster.intersectObjects(groupedMeshes)
raycaster.intersectObject(groupedMeshes)。我的错

所以我现在唯一的问题是如何从玩家(第一人称)的视角拍摄光线到地形。谢谢

EDIT2:

var vector = new THREE.Vector3( 0, 0, 0.5 );

var projector = new THREE.Projector();
projector.unprojectVector( vector, camera );

var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );

var intersects = raycaster.intersectObjects( groupedMeshes );
lastIntersects = intersects;

if ( intersects.length > 0 ) {
    console.log(intersects);
}

通过看剧本来解决这个问题

我现在正在使用它,它允许我从摄像机的位置沿播放器/摄像机面对的方向拍摄光线:

var raycaster = new THREE.Raycaster();
var direction = new THREE.Vector3( 0, 0, -1 );
var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );

function shootRay() {
    rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );

    raycaster.ray.direction.copy( direction ).applyEuler( rotation );
    raycaster.ray.origin.copy( yawObject.position );

    var intersections = raycaster.intersectObjects( groupedMeshes );
    if ( intersections.length > 0 ) {
        console.log(intersections[0].point);
    }
}

您引用的three.js示例似乎需要更新。。。在任何情况下,如果我了解您想要做什么,请尝试从屏幕中心始终对光线投射进行
var vector=new THREE.Vector3(0,0,0.5)
。另外,看看是否可以重新编写代码,以避免渲染循环中出现“新”的情况——也就是说,重用对象。是的,代码用于MouseDown事件。基本上,尝试获取玩家正在查看的块的坐标,然后在单击鼠标时将其移除(Minecraft风格)。好了,从屏幕中心向摄像机所看到的任何地方发射光线,我就能得到这些坐标。在新的编辑中使用代码会带来一些交叉点,但它似乎不是玩家正在寻找的地方。(完全看不到网格,仍然会说有一个交点)这是否包括查看相机的旋转?谢谢。我找到并使用的关于对象拾取的最佳教程:你们能提供一个简单的实例吗?算出并添加了一个答案。无论如何,谢谢!:)什么是俯仰和偏航对象?
var raycaster = new THREE.Raycaster();
var direction = new THREE.Vector3( 0, 0, -1 );
var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );

function shootRay() {
    rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );

    raycaster.ray.direction.copy( direction ).applyEuler( rotation );
    raycaster.ray.origin.copy( yawObject.position );

    var intersections = raycaster.intersectObjects( groupedMeshes );
    if ( intersections.length > 0 ) {
        console.log(intersections[0].point);
    }
}