Центр куба - это не (0, 0, 0), это (0, 0, 0.5).Когда вы вращаете куб вокруг оси y, он вращается вокруг центра мира, который равен (0, 0, 0).Если вы хотите повернуть куб вокруг оси симметрии, которая параллельна оси Y мира, вам нужно выбрать опции.
Измените координаты z с 0 и 1 на -0,5 соответственно на 0,5,так что ось симметрии куба находится в центре мира:
export const cubeData = [
-0.5, -0.5, 0.5,
0.5, -0.5, 0.5,
0.5, 0.5, 0.5,
-0.5, 0.5, 0.5,
0.5, -0.5, -0.5,
-0.5, -0.5, -0.5,
-0.5, 0.5, -0.5,
0.5, 0.5, -0.5,
]
Конечно, это можно сделать и с помощью матрицы перевода.Создайте разделенную матрицу вращения и матрицу перевода.Перевод должен сначала применяться к вершинам и делать то же самое, как если бы вы вручную изменяли компонент z каждой вершины на -0,5.
Матрица вращения должна быть инициализирована с помощью единичной матрицы:
mat4.identity(rotationMat);
Матрица перевода должна содержать перевод по оси z (-0,5):
var translation = vec3.create();
vec3.set(translation, 0, 0, -0.5);
mat4.identity(translateMat);
mat4.translate(translateMat, translateMat, translation);
Матрица перевода и матрица вращения должны быть сцеплены (умножены).Обратите внимание, вы должны соблюдать порядок преобразования.Сначала переведите модель, затем поверните модель.
Поскольку матрица вращения разделена, ее можно непрерывно менять:
mat4.rotateY(rotationMat,rotationMat,0.01)
mat4.multiply(shape.transformMatrix, rotationMat, translateMat)