В настоящее время я слежу за учебниками OpenGL на https://learnopengl.com/ за исключением того, что я делаю это на Java вместо C ++. Все идет хорошо, но я наткнулся на то, что может быть вызвано различием в реализации, если я не делаю что-то не так.
Я нахожусь в той части, где куб только что рендерился и вращается. Учебник дает следующий код:
model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));```
Чтобы уточнить это, model
это матрица модели. Библиотека GLM используется для вращения этой матрицы, используя glfwGetTime()
который возвращает время в секундах с момента инициализации. То, что мне интересно, это vec3(0.5f, 1.0f, 0.0f)
, Здесь они указывают, на какие углы / оси Эйлера вращаться, и, судя по всему, указывают 0.5f
для оси X поворачивается на половину от X по сравнению с Y здесь. Полученный куб выглядит так:
https://i.imgur.com/caK1BTS.mp4
Возвращаясь к Java, я настроил аналогичную вещь. Я запускаю следующее на матрице модели:
Matrix4f.rotate(timeSinceStart * (float) Math.toRadians(50), new Vector3f(0.5f, 1.0f, 0.0f), model, model);
Получающийся куб вращается так, как ни странно:
https://i.imgur.com/0ZqpgEA.mp4
Если я изменю положение, отделяя, на какой топор влияет поворот, куб выглядит нормально, как в этом видео:
https://i.imgur.com/u2zV2Zo.mp4
Код:
Matrix4f.rotate(timeSinceStart * (float) Math.toRadians(50), new Vector3f(0.0f, 1.0f, 0.0f), model, model);
Matrix4f.rotate(timeSinceStart * (float) Math.toRadians(25), new Vector3f(1.0f, 0.0f, 0.0f), model, model);
Разница здесь в том, что вместо «половины» оси я делаю половину градусов по полной оси.
Тогда мой вопрос: Это неправильно с моей стороны пытаться вращаться вокруг оси, которая не установлена в 1.0f
? Является ли реализация GLM матрицы 4×4 rotate
функция отличается от LWJGL-Utils ‘ Matrix4f
учебный класс?
PS: я использую LWJGL 2 и Java 8u141. Я был бы рад предоставить больше кода о моей настройке, если потребуется, но весь процесс рендеринга куба занимает много времени. Я сделал учебник 2-3 раза с нуля с тем же результатом, поэтому я думаю, что здесь что-то происходит.
В соответствии с этот источник в хранилище GLM GitHub GLM выполняет нормализацию оси вращения перед построением матрицы преобразования. Класс LWJGL-Utils Matrix4f не делает этого Так что, вероятно, вы должны просто нормализовать ось вращения (0.5f, 1.0f, 0.0f)
самостоятельно.
Кроме того, я не уверен, что вы правы, называя ось вращения «углами Эйлера». Углы Эйлера могут определять вращение вокруг первой оси, а затем вокруг производной второй оси и так далее. Они в основном определяют вращение как комбинацию трех вращений вокруг двух или трех базовых осей. Здесь у вас есть одна ось вращения и угол поворота.
Увидеть:
Других решений пока нет …