Estoy trabajando en un juego que tiene un punto de destino siguiendo una spline. Para que la IA que estoy haciendo gire hacia el objetivo, necesito saber si el objetivo está a la izquierda o a la derecha de la parte delantera del vehículo. ¿Cómo lograría esto? (No necesito números específicos, solo un valor booleano devuelto por una función estaría bien). Bellow es una especie de visualización.
Debido a que se trata de la IA del vehículo, la rotación del vehículo puede ser cualquier rotación o cualquier posición, por lo que las coordenadas positivas frente a negativas realmente no ayudarían. Si saben cómo lograr esto, les estaría muy agradecido.
Opción 1: usa el producto cruz .
Vector3 delta = (targetPoint - vehiclePosition).normalized; Vector3 cross = Vector3.Cross(delta, vehicleForward); if (cross == Vector3.zero) { // Target is straight ahead } else if (cross.y > 0) { // Target is to the right } else { // Target is to the left }¡Un beneficio importante de esto es que el resultado del producto cruzado es el eje sobre el que debe girar para alcanzar el objetivo! A continuación, puede utilizar esto para rotar:
float angle = Vector3.AngleBetween(vehicleForward, delta); angle = Mathf.Min(angle, maxTurnSpeed); transform.Rotate(angle * Time.deltaTime, cross);Es posible que deba establecer los valores Y de "delta" y "vehicleForward" en cero si desea limitar la rotación al eje Y/plano de tierra.
Opción 2: Usa la transformación del vehículo para transformar el punto en espacio local.
Vector3 localPos = vehicle.transform.InverseTransformPoint(targetPoint); if (localPos.x > 0) { // Target is to the left } else if (localPos.x < 0) { // Target is to the right } else if (localPos.z > 0) { // Target is in front } else { // Target is behind }Gracias, y me olvidé de agregar algo de código en mi pregunta. Resultó que estaba usando la función Vector3.Cross incorrectamente, al no ingresar los valores correctos para los parámetros en la función. Gracias a todos ya Kalle Halvarsson por darse cuenta de mi error.