java — LWJGL: эффект вращения странной матрицы с использованием & quot; частичного & quot; ось

В настоящее время я слежу за учебниками 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 раза с нуля с тем же результатом, поэтому я думаю, что здесь что-то происходит.

0

Решение

В соответствии с этот источник в хранилище GLM GitHub GLM выполняет нормализацию оси вращения перед построением матрицы преобразования. Класс LWJGL-Utils Matrix4f не делает этого Так что, вероятно, вы должны просто нормализовать ось вращения (0.5f, 1.0f, 0.0f) самостоятельно.

Кроме того, я не уверен, что вы правы, называя ось вращения «углами Эйлера». Углы Эйлера могут определять вращение вокруг первой оси, а затем вокруг производной второй оси и так далее. Они в основном определяют вращение как комбинацию трех вращений вокруг двух или трех базовых осей. Здесь у вас есть одна ось вращения и угол поворота.

Увидеть:

1

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

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

По вопросам рекламы [email protected]