Преобразовать вектор в вращение

Делаю игру, и объекты как трава например светлячки цветы, представляют из себе просто квадрат с полу прозрачной картинкой, Хотелось бы их заставить смотреть всегда на камеру лицом где-то с ограничением по одной из осей где-то без, так как картина если повернута ребром ее не видно. Пробовал просто применять к ним поворот камеры, но хорошо ето выглядит только когда камера смотрит прямо на объект, при поворотах искажение.

Так вот. Я рассчитал единичный вектор который смотрит с объекта на камеру, но ка теперь его преобразовать в радианы иле градусы.

Вот так я делаю обратное радианы (угол поворота ) в вектор направления, таким образом делается свободная камера которая двигается туда куда смотрит.

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;

Слава Богу решение оказалось супер простым

→ Ссылка