我正在创造一个无尽的亚军游戏,其中滑板上的角色在(0,0,0)处是静态的,并且风景朝向该点移动并被重置为"返回"当它在屏幕外时。
游戏的目的是躲避向你走来的汽车并收集比汽车向角色移动速度慢的物体,两者都能获得积分。我正在使用THREE.Raycaster
来检测滑板和汽车/物体之间的碰撞(汽车和物体的不同碰撞情况),我已经运作良好。
问题
我正在检测滑板和物体之间的碰撞,因为滑板比-z
方向(物体来自哪里)的角色延伸得更远,所以它首先是#34;击中&#34 ;一个东西。滑板是一组物体(仍然是THREE.Object3D
而不是THREE.Group()
,但它们的功能相同)包含例如4个轮子,两个卡车等......所以我不能使用主要的SkateBoardGroup
对象检测碰撞,因为它不是Mesh
并且没有顶点,这些顶点决定了投射光线的位置。
与对象最接近的Mesh
是SkateBoardBaseRight
Mesh
,它是SkateBoardBase对象(包含3个网格)的子节点,它本身是主节点SkateBoardGroup
的子节点。 1}}对象。我目前正在使用以下代码和Mesh
的光线投射访问此Mesh
:
objectMesh = SkateBoardGroup.children[0].children[2];
我希望能够从顶级SkateBoardGroup
进行光线投射,因为滑板有时会旋转,因此SkateBoardBaseRight
网格不是最接近对象的。
我想要什么
我希望得到一个解释和/或代码示例,说明我如何从THREE.Object3D
SkateBoardGroup
进行光线投射,而不必潜入对象的孩子。
将raycaster.intersetObjects
设置为递归不是我正在寻找的,因为滑板碰撞的对象就是这样。
以下是我的光线投射代码:
我正在调用此函数两次,一次用于汽车,一次用于其他对象
originObject
是SkateBoardGroup
,collidedObjects
是包含汽车或其他对象的数组,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);
}
}
}
}
}
}