У меня есть позиция объекта в пространстве, вектор направления этого объекта и позиция другого объекта, мне нужно определить в какую сторону надо поворачиваться чтобы как можно быстрее 1-ый объект увидел 2-ого. Всё в 3D пространстве но я буду отдельно считать для каждой плоскости(xz, xy, zy).
угол А = atan2(dy, dx) вектора
угол Б = затем второго вектора построенного из начала первого в твою точку
тогда задача сводится к нахождению в какую сторону по шкале от 0 до 360 градусов крутить стрелку, чтоб из угла А стал угол Б, с учётом перехода нуля градусов конечно. Если углы лежат по разные стороны от нуля градусов, то можно прибавить или отнять 360 от обоих углов.
Можно векторное произведение. По модулю полученного вектора получаем синус угла поворота, а по знаку третьей координаты (если у тех двух векторов эта координата = 0 в этом базисе) - направление поворота.
kvakvs
что-то я не совсем понял, так?:
D3DXVECTOR3 Dir(0, 0, 1); D3DXVECTOR3 A( 0, 0, 0); D3DXVECTOR3 B( 10, 0, 0); D3DXVECTOR3 B2; float AA, AB; B2 = B - A; D3DXVec3Normalize( &B2, &B2); AA = atan2( Dir.x, Dir.z); AB = atan2( B2.x, B2.z);
Правильно? а если правильно то дальше что? мне ведь нужен только 1 угол а их получилось 2.
localX = B.x - A.x; localY = B.y - A.y; ang = atan2(localY, localX); diff = A.angle - ang; if (diff >= 0) { if (diff > PI) return CW; else return CCW; } else { if (diff > -PI) return CW; else return CCW; }
Не уверен, но, по-моему, так.
Antilegent
а что такое CW и CCW? Это стороны куда надо поворачиваться?
P.S. Заметил ошибку в названии темы, исправил.
Скалярное произведение вектора на точку с вектором право/или лево.
kroonk
> в какую сторону надо поворачиваться
если на плоскости, то http://ru.wikipedia.org/wiki/%D0%9F%D1%81%D0%B5%D0%B2%D0%B4%D0%BE… D%D0%B8%D0%B5
для направления взгляда A и направления к объекту B единичной длины, ось Y вверх ось X вправо
sinPhi = (A.x*B.y - A.y*B.x)
если sinPhi < 0, то ближайший поворот от A к B по часовой стрелке (ClockWise)
если sinPhi > 0, то ближайший поворот от A к B против часовой стрелки (CounterClockWise)
если sinPhi = 0, то они либо сонаправлены либо противонаправлены
для 3-ех измерений похожая фигня:
http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BA%D1%82%D0%BE%D1%80… D%D0%B8%D0%B5
Скажу проще. Скалярное произведение с единичным вектором дает расстояние до плоскости, задаваемой этим вектором. Причем расстояние со знаком.
В своё время реализовывал игровой физический движок и графический, так вот, кроме шейдеров тригонометрические функции нигде не использовались, всё на векторной математике.
kroonk
> а что такое CW и CCW? Это стороны куда надо поворачиваться?
Clockwise и Counter Clockwise - по и против часовой стрелки.
aloha_hawaii
> В своё время реализовывал игровой физический движок и графический, так вот, кроме шейдеров тригонометрические функции нигде не использовались, всё на векторной математике.
интегрировал вращение, должно быть, тоже векторной математикой? или в шейдере?
Вращение кватернионами. Согласен, лажанул, еще в математике кватернионов была тригонометрия.
CD
Спасибо, работает.
Тема в архиве.