Я создаю игру в three.js.Я новичок в этой области, но я прочитал много документации о столкновениях.Я использовал raycast, чтобы получить столкновение между моей лодкой, содержащейся в кубе, и островами, содержащимися в кубах.Я попытался решить проблему следующим образом.
collision2 = false;
var originPoint = MovingCube.position.clone();
clearText();
for (var vertexIndex = 0; vertexIndex < MovingCube.geometry.vertices.length; vertexIndex++)
{
var localVertex = MovingCube.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4( MovingCube.matrix );
var directionVector = globalVertex.sub( MovingCube.position );
var ray = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
var collisionResults = ray.intersectObjects( collidableMeshList );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() ) {
appendText(" Hit "),
collision2 = true;
}
}
if ( keyboard.pressed("W") ){
obj.translateZ( moveDistance ),
if (collision2==true){
obj.translateZ( -moveDistance*4 ),
}
}
if ( keyboard.pressed("S") ){
obj.translateZ( - moveDistance ),;
if (collision2==true){
obj.translateZ( moveDistance*4 ),
}
}
if ( keyboard.pressed("A") ){
obj.rotateOnAxis( new THREE.Vector3(0,1,0), rotateAngle),
if (collision2==true){
obj.rotateOnAxis( new THREE.Vector3(0,1,0), -rotateAngle*3),
}
}
if ( keyboard.pressed("D") ){
obj.rotateOnAxis( new THREE.Vector3(0,1,0), -rotateAngle),
if (collision2==true){
obj.rotateOnAxis( new THREE.Vector3(0,1,0), rotateAngle*3),
}
}
Умножьте на 3 "moveDistance" и "rotateAngle", чтобы не разбить мой корабль лучами, испущенными raycat во время столкновения.Это часто работает, но иногда корабль застревает или входит в остров.Я думал о перемещении корабля на несколько пикселей, когда он сталкивается с островом на основании грани куба.Пример: корабль сталкивается с гранью куба на положительной оси X, вычтите пиксели из позиции куба, чтобы лодка отодвинулась.Но я не знаю, как сделать что-то подобное, это было бы хорошим решением для меня.Как я могу решить проблему столкновений со стенами?(Я не хочу использовать какой-либо физический движок прямо сейчас) Спасибо за тех, кто мне поможет!
![screenshot](https://i.stack.imgur.com/akiCm.jpg)
РЕДАКТИРОВАТЬ:
Я быХотелось бы указать, какая сторона куба (острова) столкнулась с кораблем.Если лицо обращено к оси X (положительно), переместите лодку на 40 пикселей назад (obj.position = + 40), это для каждой грани.Таким образом, вы никогда не сможете пустить лодку в куб.Я смотрел на этот пример, который, по моему мнению, мог бы быть полезным, но я еще не понимал, как его решить.
https://stemkoski.github.io/Three.js/Mouse-Click.html
Это мой куб, содержащий лодку.
var mats2 = [];
var cubeGeometry = new THREE.CubeGeometry(25,135,121,10,10,10);
for (var i = 0; i < 6; i ++) {
mats2.push(new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe:true } ));
}
MovingCube = new THREE.Mesh( cubeGeometry, mats2 );
scene.add( MovingCube );
collidableMeshList0.push(MovingCube);