Collision Detection three.js / Столкновение камеры - PullRequest
0 голосов
/ 29 ноября 2018

Я тестировал некоторые методы кодирования в three.js, в которых у меня есть базовые знания, но у меня возникла проблема при попытке продолжить работу над проектом.Я пытаюсь выяснить, как обнаружить столкновение от первого лица (нажатия клавиш перемещают камеру).

У меня есть переменная игрока, определенная как:

var player = { height:1.8, speed:0.1, turnSpeed:Math.PI*0.01 };

и движение внутри события нажатия клавиши как:

if(keyboard[87]){ // W key
    camera.position.x -= Math.sin(camera.rotation.y) * player.speed;
    camera.position.z -= -Math.cos(camera.rotation.y) * player.speed;
}
if(keyboard[83]){ // S key
    camera.position.x += Math.sin(camera.rotation.y) * player.speed;
    camera.position.z += -Math.cos(camera.rotation.y) * player.speed;
}
if(keyboard[65]){ // A key
    // Redirect motion by 90 degrees
    camera.position.x += Math.sin(camera.rotation.y + Math.PI/2) * player.speed;
    camera.position.z += -Math.cos(camera.rotation.y + Math.PI/2) * player.speed;
}
if(keyboard[68]){ // D key
    camera.position.x += Math.sin(camera.rotation.y - Math.PI/2) * player.speed;
    camera.position.z += -Math.cos(camera.rotation.y - Math.PI/2) * player.speed;
}

Затем я загружаю ящик таким образом (стекстура, шишка и карта нормалей загружены):

crate = new THREE.Mesh(
    new THREE.BoxGeometry(3,3,3),
    new THREE.MeshPhongMaterial({
       color: 0xffffff,
       map: crateTexture,
       bumpMap: crateBumpMap,
       normalMap: crateNormalMap,           
        })
);

Все в программе работает нормально, я просто хочу знать, как обнаружить столкновение камеры со стеной.Я не хочу идти, чтобы установить параметры, такие как:

if(keyboard[68] && !(camera.position.x < crate.position.x + 1.5) && !(camera.position.x > crate.position.x - 1.5) && !(camera.position.z < crate.position.z -1.5) && !(camera.position.z > crate.position.z -1.5)) { // D key
    camera.position.x += Math.sin(camera.rotation.y - Math.PI/2) * player.speed;
    camera.position.z += -Math.cos(camera.rotation.y - Math.PI/2) * player.speed;
}

Могут ли некоторые дать мне способ обнаружения столкновения между объектом, таким как этот ящик (boxGeometry) и даже другими формами?

Редактировать: Я считаю, что нашел способ вручную обнаруживать столкновения с камерой и геометрией box, но пока только на одном лице и с одним движением направления.Этот код ниже определяет правильное лицо при нагрузке при движении вперед.

if(camera.position.z > crate.position.z - 1.650 && camera.position.z < 
crate.position.z + 1.650 && camera.position.x > crate.position.x - 2 && 
camera.position.x < crate.position.x - 1.9 && camera.rotation.y > - Math.PI && camera.rotation.y < 0 ) canMoveForward = false;
if(!(camera.position.z > crate.position.z - 1.650 && camera.position.z < 
crate.position.z + 1.650 && camera.position.x > crate.position.x - 2 && 
camera.position.x < crate.position.x - 1.9 && camera.rotation.y > - Math.PI && camera.rotation.y < 0 )) canMoveForward = true;  

Затем я реализовал систему обнаружения в событии нажатия клавиши, которая позволяет механику «скользить по стене», в которой, если я иду вперед под углом, это не даст мне войти внутрь ящика, но будет двигатьсяя зависим от моей ротации.Вот этот код:

if(keyboard[87] ){ // W key
   if(camera.position.z > crate.position.z - 1.650 && camera.position.z < crate.position.z + 1.650 && camera.position.x > crate.position.x - 2 && camera.position.x < crate.position.x - 1.9 && camera.rotation.y > - Math.PI && camera.rotation.y < 0 ) {
    camera.position.z -= -Math.cos(camera.rotation.y) * player.speed;
    } else if(canMoveForward == true) {
    camera.position.x -= Math.sin(camera.rotation.y) * player.speed;
    camera.position.z -= -Math.cos(camera.rotation.y) * player.speed;
}
}

Я думаю, что после тестирования я могу найти более простой / более общий способ реализации операторов if, которые обнаруживают эту коллизию.Но тогда возникает вопрос, по какому пути я двигаюсь, что также стало проблемой.Я наметил и сколько вращения должно быть проверено на одной стороне, на которой я ввел столкновение.

Я с удовольствием оценю ввод, если есть более простой / простой способ обнаружения этого типа столкновения. Вот мой проект , так что вы можете понять большеситуация.

1 Ответ

0 голосов
/ 29 ноября 2018

Как обнаружить столкновение в three.js?

Если вы перейдете по ссылке, вопрос будет закрыт, но они по-прежнему охватывают общие идеи 3d-столкновений.

...