Я пытаюсь изменить ориентацию моих объектов к центру с помощью 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;
}
Если вы хотите вращать объект вокруг центра мира, вы должны сначала настроить матрицу вращения:
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;
Других решений пока нет …