Как получить угол (шаг / рыскание) между двумя трехмерными векторами для автоматической прицеливания

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

Игра основана на Unity и использует левостороннюю систему координат. X Y Z прав, вверх, вперед.

В игре также используются градусы.

Вот псевдокод, который я пытаюсь, но он не дает мне правильную высоту звука.

diff = camera_position - enemy_position
hypotenuse = sqrt(diff.x*diff.x + diff.y*diff.y)

angle.x = asinf(diff.z / hypotenuse) * (180 / PI);
angle.y = atan2(diff.y / diff.x) * (180 / PI);
angle.z = 0.0f;

Может кто-то помочь мне с этим? Я ужасен в математике.

0

Решение

Я пытаюсь получить углы между двумя векторами (My Camera Position
и вражеская позиция)

В единстве:

Использовать Angle функция от Vector3 состав.

float angle = Vector3.Angle(camera_position, enemy_position);

Или отдельные углы:

float angleX = Vector3.Angle(new Vector3(camera_position.x, 0, 0), new Vector3(enemy_position.x, 0, 0));
float angleY = Vector3.Angle(new Vector3(0, camera_position.y, 0), new Vector3(0, enemy_position.y, 0));
float angleZ = Vector3.Angle(new Vector3(0, 0, camera_position.z), new Vector3(0, 0, enemy_position.z));

РЕДАКТИРОВАТЬ:

Я не использую движок Unity. Это отдельный модуль Я
создание, чтобы подстроить мой собственный автоаим. Я пытаюсь получить правильную математику
сам.

В C ++:

Код объясняется в Angle функция ниже которой последняя функция

#include <iostream>
#include <numeric> //for inner_product
#include <vector> //For vector
#include <math.h> //For sqrt, acos and M_PI

float Dot(std::vector<float> lhs, std::vector<float> rhs);
float magnitude(std::vector<float> vec3);
float Angle(std::vector<float> from, std::vector<float> to);
std::vector<float> normalise();

int main()
{
std::vector<float> from{3, 1, -2};
std::vector<float> to{5, -3, -7 };

float angle = Angle(from,to);
std::cout<<"Angle: "<<angle<<std::endl;
return 0;
}

//Find Dot/ Scalar product
float Dot(std::vector<float> lhs, std::vector<float> rhs){
return std::inner_product(lhs.begin(), lhs.end(), rhs.begin(), 0);
}

//Find the magnitude of the Vector
float magnitude(std::vector<float> vec3)//<! Vector magnitude
{
return sqrt((vec3[0] * vec3[0]) + (vec3[1] * vec3[1]) + (vec3[2] * vec3[2]));
}

//Normalize Vector. Not needed here
std::vector<float> normalise(std::vector<float> vect)
{
std::vector<float> temp{0, 0, 0};
float length = magnitude(vect);

temp[0] = vect[0]/length;
temp[1] = vect[1]/length;
temp[2] = vect[2]/length;
return temp;
}

float Angle(std::vector<float> from, std::vector<float> to){
//Find the scalar/dot product of the provided 2 Vectors
float dotProduct = Dot(from, to);
//Find the product of both magnitudes of the vectors then divide dot from it
dotProduct = dotProduct / (magnitude(from) * magnitude(to));
//Get the arc cosin of the angle, you now have your angle in radians
float arcAcos = acos(dotProduct);
//Convert to degrees by Multiplying the arc cosin by 180/M_PI
float angle = arcAcos * 180 / M_PI;
return angle;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector