2013-05-17 1 views
0

Я хочу сделать отбор рыбы-глаз в моей игре. Поэтому для каждого объекта, который указан для рисования, я хочу проверить, находится ли он во фрустрации камеры. я сделать это таким образом:Угол между двумя векторами в 3d пространстве

D3DXVECTOR3 cameraPos; 
D3DXVECTOR3 pos; 
D3DXVECTOR3 cameraVector;//where camera is looking(camera->eye() - camera->pos()) 
D3DXVECTOR3 direction = pos - cameraPos; 
normalize(&direction); 
normalize(&cameraVector); 
float dot = cameraVector.x * direction.x + cameraVector.y * direction.y + cameraVector.z * direction.z; 

//float cosvalue = cos(dot); // i was calculatin cos of cos :) 
float cosvalue = dot; 
float angle = acos (cosvalue) * 180.0f/PI; 

if(angle < 45.0f) draw(); 

Но я получаю странные результаты. Например (угол < 50.0f) рисует везде, но нет, где я хочу, чтобы глаз рыбы был пуст. ! (угол < 50.0f) рисует то, что я хочу. Но (угол < 40) рисует ничего :( Я не уверен, если это мой расчет угла или это плавает проблему :(Любой

+0

Так как вам все равно понадобится много векторных вычислений, вы можете захотеть использовать такую ​​библиотеку, как Boost. –

+0

nvm Я запаздываю. – Machiaweliczny

+0

Обратите внимание, что версия atan2 более точно http://www.mathworks.com/matlabcentral/answers/16243-angle-between-two-vectors-in-3d – mrgloom

ответ

5
dot_product = a.x * b.x + a.y * b.y + a.z * b.z = a.len() * b.len * cos(angle) 

таким образом:

cos(angle) = dot_product/(a.len * b.len) 

Вашего код делает странную вещь : вы на самом деле вычисляете косинус точечного продукта!

+0

Да, я знаю. Моя точка равна cos, потому что векторы нормированы. – Machiaweliczny