Three.js:第一人称摄像头碰撞检测



我在Three.js中有一个非常简单的场景,用户可以四处移动相机,以便获得第一人称视角。

摄像机不得在物体内部移动,例如立方体。我试图用Raycaster.intersectObjects来防止这种情况。悬停时,当我走进立方体时,它只识别出一个面。立方体的其他面似乎对光线不"可见",但它们当然是完美渲染的。

相关代码如下所示:

cubeGeometry = new THREE.CubeGeometry(size, size, size, 20, 20, 20);
cubeMesh = new THREE.Mesh(cubeGeometry, new THREE.MeshBasicMaterial({color: 0x00FF00, wireframe: true, side: THREE.DoubleSide}));
geometries.push(cubeMesh); 
...
var oldCamera;
function moveAround(){
oldCamera = camera.clone();
if(movement=="forward") camera.translateZ(-30);
if(movement=="left") camera.translateX(-30);
if(movement=="backward") camera.translateZ(30);
if(movement=="right") camera.translateX(30);
ray = new THREE.Raycaster(camera.position, oldCamera.position.normalize());
ray.far = 100;
if(ray.intersectObjects(geometries).length>0){
// only the case with one of the faces of a cube
...

[EDIT 2020.05.09]

我在GitHub上传了一个工作示例:

https://github.com/TovAqulic/threejs_collision_issue/blob/master/index.html

您可以使用箭头键移动(相机,即您自己(,也可以使用鼠标转动。

所有几何体对象,即周围的墙和中间的块,都是使用raycaster.intersectObjects(geometries)检查的geometries阵列的一部分。

在几乎所有情况下,当移动到墙上时,如预期的那样,通过向前、向后或侧向移动,移动会被阻挡。

但是,也有一些位置可以穿过墙壁,尤其是右侧的墙壁。例如,加载页面后直接移动到右侧墙即可

我不明白我做错了什么。

ray=new THREE.Raycaster(camera.position,oldCamera.position.normalize(((;

此代码并不理想。创建一次THREE.Raycaster的实例,然后重用它。也可以将其命名为raycaster(因为它不是THREE.Ray的实例(。此外,在调用intersectObjects()之前,请使用以下代码准备光线投射器:

raycaster.ray.origin.copy( camera.position );
camera.getWorldDirection( raycaster.ray.direction );

最新更新