Three.js - 通过组

时间:2018-05-04 09:46:42

标签: javascript three.js

我正在创造一个无尽的亚军游戏,其中滑板上的角色在(0,0,0)处是静态的,并且风景朝向该点移动并被重置为"返回"当它在屏幕外时。

游戏的目的是躲避向你走来的汽车并收集比汽车向角色移动速度慢的物体,两者都能获得积分。我正在使用THREE.Raycaster来检测滑板和汽车/物体之间的碰撞(汽车和物体的不同碰撞情况),我已经运作良好。

问题

我正在检测滑板和物体之间的碰撞,因为滑板比-z方向(物体来自哪里)的角色延伸得更远,所以它首先是#34;击中&#34 ;一个东西。滑板是一组物体(仍然是THREE.Object3D而不是THREE.Group(),但它们的功能相同)包含例如4个轮子,两个卡车等......所以我不能使用主要的SkateBoardGroup对象检测碰撞,因为它不是Mesh并且没有顶点,这些顶点决定了投射光线的位置。

与对象最接近的MeshSkateBoardBaseRight Mesh,它是SkateBoardBase对象(包含3个网格)的子节点,它本身是主节点SkateBoardGroup的子节点。 1}}对象。我目前正在使用以下代码和Mesh的光线投射访问此Mesh

objectMesh = SkateBoardGroup.children[0].children[2];

我希望能够从顶级SkateBoardGroup进行光线投射,因为滑板有时会旋转,因此SkateBoardBaseRight网格不是最接近对象的。

我想要什么

我希望得到一个解释和/或代码示例,说明我如何从THREE.Object3D SkateBoardGroup进行光线投射,而不必潜入对象的孩子。

raycaster.intersetObjects设置为递归不是我正在寻找的,因为滑板碰撞的对象就是这样。

以下是我的光线投射代码:

我正在调用此函数两次,一次用于汽车,一次用于其他对象

originObjectSkateBoardGroupcollidedObjects是包含汽车或其他对象的数组,doesCollidedObjectsEndGame是一个布尔标志,用于决定哪种类型的对象是它(汽车或其他物体)

let cooldown = false; // cooldown reset when try-again clicked
let cooldown2 = false;

function detectCollisionRaycaster(originObject, collidedObjects, 
doesCollidedObjectsEndGame) {

let objectMesh = originObject.children[0].children[2];

let originPoint = originObject.position.clone();

if (cooldown === false) {
    for (var vertexIndex = 0; vertexIndex < objectMesh.geometry.vertices.length; vertexIndex++) {
        var localVertex = objectMesh.geometry.vertices[vertexIndex].clone();
        var globalVertex = localVertex.applyMatrix4( objectMesh.matrix );
        var directionVector = globalVertex.sub( objectMesh.position );

        var raycaster = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
        var collisionResults = raycaster.intersectObjects( collidedObjects, true );
        if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
            if (doesCollidedObjectsEndGame) {
                // car objects collided
                gameIsOver = true;
                cooldown = true;
            } else {
                if (cooldown2 === false) {
                    cooldown2 = true;
                    // other objects collided
                    setTimeout(function(){
                        cooldown2 = false;
                    }, 100);
                }
            }
        }
    }
}
}

0 个答案:

没有答案