Довернуть камеру на определенный угол

Рейтинг: 3Ответов: 1Опубликовано: 16.04.2015

Добрый вечер!

Задача состоит в следующем:"На сцене имеется камера и пушка со своими лучами, когда луч пушки выходит за пределы видимости камеры (по вертикали), требуется довернуть камеру вверх чтобы вернуть видимость. Луч у камеры всегда позиционирован в 20% от верхнего края (screehHeight*0.2)"
Казалось бы задача тривиальна, требуется найти угол между лучами и довернуть камеру на альфу. Но после проведенных расчетов камера не заворачивается до нужной позиции, постоянно либо выше, либо ниже требуемого. Буду признателен любой оказанной помощи, код и картинку для ясности происходящего прикладываю ниже.
P.S Дело не в длине луча, а именно в не верном повороте.

//cameraRayVector - взят Getpoint с луча у камеры 
//gunRayVector - взят Getpoint с луча у пушки 
//vAngle - находим угол между векторами, отнимаем от каждого вектора позицию камеры, для того чтобы угол считался не с нулевой позиции координат  
float vAngle = Vector3.Angle((cameraRayVector - _mainCamera.transform.position), (gunRayVector - _mainCamera.transform.position)); 

                           Vector3 cross = Vector3.Cross((cameraRayVector - _mainCamera.transform.position), (gunRayVector - _mainCamera.transform.position)); 
                           if (cross.y < 0) vAngle = -vAngle; 
                           Quaternion quat = Quaternion.AngleAxis(vAngle, Vector3.right); 
                           _mainCamera.transform.rotation = Quaternion.Euler((quat * _mainCamera.transform.rotation.eulerAngles));

введите описание изображения здесь

Ответы

▲ 2

Привет. А вы уверены что у вас лучи в одной плоскости и расстояние от пушки до камеры не меняется? На рисунке вы рисуете лучи из камеры и пушки, а в расчетах лучи строите от центра камеры до точек GetPoint. Поэтому фактически расчитываете угол не между лучами которые нарисовали а как то вот так. введите описание изображения здесь Попробуйте заменить (gunRayVector - _mainCamera.transform.position) на (gunRayVector - gun.transform.position)


UPD

Что значит не верный угол? Попробуйте сделать вот так

Quaternion quat = Quaternion.AngleAxis(vAngle, _mainCamera.transform.right); 
_mainCamera.transform.rotation = quat * _mainCamera.transform.rotation;

Во первых наверняка будете поворачивать камеру относительно ее правого поворота, если вдруг она развернута в пространстве относительно глобальных координат. А во вторых зачем вам было перемножать кватернион на эйлеровы углы?. Поворот кватерниона на кватернион дает общий поворот, и не надо никаких лишних операций.