Преобразовать вектор в вращение
Делаю игру, и объекты как трава например светлячки цветы, представляют из себе просто квадрат с полу прозрачной картинкой, Хотелось бы их заставить смотреть всегда на камеру лицом где-то с ограничением по одной из осей где-то без, так как картина если повернута ребром ее не видно. Пробовал просто применять к ним поворот камеры, но хорошо ето выглядит только когда камера смотрит прямо на объект, при поворотах искажение.
Так вот. Я рассчитал единичный вектор который смотрит с объекта на камеру, но ка теперь его преобразовать в радианы иле градусы.
Вот так я делаю обратное радианы (угол поворота ) в вектор направления, таким образом делается свободная камера которая двигается туда куда смотрит.
glm::vec3 rotateToVec3(glm::vec2 rotate, float radius)
{
float RadiusXZ = cos(rotate.x);
float x = (sin(rotate.y) * RadiusXZ)*radius;
float z = (-cos(rotate.y) * RadiusXZ)*radius;
float y = (-sin(rotate.x)) * radius;
return glm::vec3(x, y, z);
}
Но как вектор в обороты преобразовать? Понимаю что нужно применить как то acos asin но как? Возможно в glm есть готовое решение ?
Ответы (1 шт):
Решил задачу по оси У, пока этого мне достаточно, потом дополню ответ если сделаю по обоим осям, В любом случаи если не подниматься высоко, спрайт всегда смотрит в камеру.
Во первых находим вектор направленный от объекта в камеру (Позиция камеры - позиция объекта)
glm::vec3 vecToCam = Scena1.Position - glm::vec3(PS.POS.X, PS.POS.Y, PS.POS.Z);
Дале на всякий случай нормализуем
vecToCam = glm::normalize(vecToCam);
Ну и находим угол поворота в радианах, и применяем
PS.ROT.Y = atan2(vecToCam.x, vecToCam.z); //*180.0f/USMod::PI;
PS.ROT.Z = 0;
PS.ROT.X = 0;
Слава Богу решение оказалось супер простым