Tengo un personaje 3D junto con varias posiciones predefinidas en el suelo. ¿Hay alguna manera de verificar si una posición está detrás del personaje 3D y no al frente o de lado?
He incluido un boceto aproximado de lo que estoy tratando de lograr (perdón por el pobre dibujo). Básicamente, me gustaría devolver todas las posiciones de los círculos rojos dentro de las líneas rojas y excluir todos los demás círculos fuera de estas dos líneas.
es posible? Si es así, ¿hay alguna sugerencia sobre cómo puedo lograr esto? Lo siento, pero en realidad no sé qué funciones usar de Three JS para algo como esto o si es posible.
¡Gracias!
Si es posible.
Comienza comprobando primero si hay un punto /círculo detrás del jugador . Para ello, obtenga el producto escalar entre la dirección a la que mira el jugador (un vector unitario) y el vector de dirección del círculo (normalícelo para que también sea un vector unitario). Si los valores dotProduct <= 0 , entonces el círculo está detrás de su jugador.
(vector unitario significa que su vector tiene una magnitud de uno. Lo cual es una forma elegante de decir que x/y/z nunca irá más allá de 1)
ejemplo de código
// Let's assume that the following code is in some sort of loop, yes // Get the direction vector to the circle const directionVect = circle.position.clone().sub(player.position).normalize(); // If your player is a camera you can get the direction like so const playerFacing = player.getWorldDirection(new THREE.Vector3()); // Orientation if (playerFacing.dot(directionVect) <= 0) { // Circle is behind the player // ...to be continued... } else { return; }Ahora que sabe qué círculos están detrás de su jugador, puede obtener los círculos dentro del cono. Esto se hace obteniendo el ángulo entre la posición del jugador y la posición del círculo. A continuación, compruebe que el ángulo se ajusta a algunos criterios (por ejemplo, el ángulo no puede ser superior a 45 grados desde la parte posterior del reproductor).
// ... // Orientation if (playerFacing.dot(directionVect) <= 0) { // Circle is behind the player const angle = player.position.angleTo(circle.position); if (angle < Math.PI * 0.25) { // Do something with circle } } else { return; }