atan2f () не работает

Я пытаюсь изменить ориентацию моих объектов к центру с помощью atan2f, но это дает мне неправильное значение. Я где то не прав?

glm::vec3 center = glm::vec3(0.4f, 0.4f, 0.0f);
for(int i = 0; i < num; i++){
float rel = i / (float) num;
float angle = rel * M_PI * 2;
glm::vec3 position = glm::vec3(cos(angle), glm::sin(angle), position.z);

position.x *= radius; position.y *= radius;
position.x += center; position.y += center;
glm::mat4 trans = glm::translate(glm::mat4(1.0f), position);

float newAngle = atan2f(position.y - center.y, position.x - center.x);

glm::mat4 rotation = glm::rotation(glm::mat4(1.0f), newAngle, glm::vec3(0, 0, 1));

numModel.at(i) = trans * rotation;
}

0

Решение

Если вы хотите вращать объект вокруг центра мира, вы должны сначала настроить матрицу вращения:

float angle = ...;
glm::vec3 rotAxis( ... );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), angle, rotAxis );

Обратите внимание glm::rotation Функция вычисляет синус и косинус угла и устанавливает соответствующие поля внутри матрицы.

Во-вторых, вы должны настроить матрицу положения ваших объектов, это матрица, которая описывает начальное положение объекта:

glm::vec3 position( radius, 0.0f, 0.0f );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );

Чтобы вращать объект вокруг центра мира, вы должны умножить матрицу вращения. rotMat по матрице модели transMat, потому что матрица вращения определяет систему отсчета, для размещения объекта.

glm::mat4 modelMat = rotMat * transMat;

Если вы хотите повернуть объект вокруг его собственного источника, вы должны сначала поместить свой объект в мир, а затем повернуть его:

glm::mat4 modelMat = transMat * rotMat;

Смотрите также ответ на вопрос OpenGL трансформирует объекты с несколькими поворотами разных осей

В вашем случае, когда вы хотите, чтобы объект был направлен в центр мира, вы должны сначала перевести объект на его место. Во-вторых, вы должны рассчитать угол между осью X мира и направлением от объекта к центру. Наконец, вы должны повернуть объект в напротив направление.

 glm::vec3 position( ... );
glm::vec3 center( ... );
glm::mat4 transMat = glm::translate( glm::mat4(1.0f), position );

float angle = atan2f(center.y - position.y, center.x - position.x);

glm::vec3 rotAxis( 0.0f, 0.0f, 1.0f );
glm::mat4 rotMat = glm::rotation( glm::mat4(1.0f), -angle, rotAxis );

glm::mat4 modelMat = transMat * rotMat;
0

Другие решения

Других решений пока нет …