вращать объект вокруг его координат - PullRequest
0 голосов
/ 16 октября 2018

Если я хочу повернуть объект вокруг его локальных координат в мировые (глобальные) координаты.Из теории: мне нужно перевести его в (0,0) глобальные координаты, затем повернуть и перевести обратно в его глобальные координаты.

Но если объект уже находится в (0,0) глобальных координатах?тогда мне не нужно переводить это.Но что-то идет не так.

Это вершины и индексы для куба:

export const cubeIndices = [
  0, 1, 2,
  0, 2, 3,
  4, 5, 6,
  4, 6, 7,
  5, 0, 3,
  5, 3, 6,
  1, 4, 7,
  1, 7, 2,
  5, 4, 1,
  5, 1, 0,
  3, 2, 7,
  3, 7, 6,
]

export const cubeData = [
-0.5 ,-0.5, 1.0,
0.5, -0.5, 1.0,
0.5 ,0.5 ,1.0,
-0.5, 0.5 ,1.0,
0.5, -0.5 ,0.0,
-0.5, -0.5, 0.0,
-0.5, 0.5 ,0.0,
0.5, 0.5,0.0,
]

Без каких-либо преобразований объект отображается без проблем.
My cube

Я хочу повернуть его вокруг оси Y.Мой следующий шаг в функции рисования:

mat4.rotateY(shape.transformMatrix,shape.transformMatrix,0.01)

Но получил:
Bad cube

Что я делаю не так?

1 Ответ

0 голосов
/ 16 октября 2018

Центр куба - это не (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)
...