2016-09-23 1 views
0

Я пытаюсь получить углы между двумя векторами (положение «Моя камера» и «Позиция врага»), чтобы создать аутоамм ​​/ прицел.Как получить угол (шаг/рыскание) между двумя 3D-векторами для autoaim

Игра основана на 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

углы в мировом пространстве, или локальным по отношению к игроку? – Serlite

+0

Вы говорите, что это библиотека, поэтому не используйте единый движок. Тогда, может быть, http://m.wikihow.com/Find-the-Angle-Between-Two-Vectors – Everts

ответ

0

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

В Unity:

Используйте функцию 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)); 

EDIT:

Я не использую двигатель 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

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

+0

В нем говорится: «Игра основана на Unity», и в ней есть единство. Вы должны внести изменения в свой вопрос и включить это. – Programmer

+0

@Serlite Вероятно, правда, но в документе говорится: «Возвращает угол в градусах между от и до», который почти такой же, как заголовок вопроса и тело ..... – Programmer

Смежные вопросы