2016-06-29 2 views
2

В настоящее время я вычислял матрицу вида, как это:В каком порядке должна рассчитываться матрица представлений?

viewMatrix = cameraRot * cameraTrans 

и матрица модели, как это:

modelMatrix = modelTrans * modelScale 

где cameraTrans и modelTrans матрицы перевода, modelScale является матрица масштабирования и cameraRot и modelRot - матрицы вращения, созданные кватернионами.

Это правильно? Я занимаюсь поиском в течение нескольких часов, и никто не упоминает порядок для матрицы вида, а только модельную матрицу. Кажется, все работает, но я сам написал матрицы и реализации кватернионов, поэтому я не могу сказать, что это ошибка.

(Примечание: матрицы ряд основных)

+1

На вопрос нет единого ответа, потому что это зависит от того, чего вы хотите достичь. Для камеры первого лица это выглядит правильно, для орбитальной камеры вокруг источника нет. – BDL

+0

@BDL Камера первого лица была тем, чем я собирался. Забыл упомянуть об этом. Благодарю. – Computermatronic

ответ

2

Давайте поговорим о преобразовании между системой координат. Предположим, что у вас есть точка, определенная в локальной системе. Вы хотите описать его в глобальной системе, так что вы делаете это, поворачивая эту точку, чтобы выровнять ее ось, а затем перевести ее в ее конечную позицию. Вы можете это описано математически:

Pg = T*R*Pl, where M = T*R 

Таким образом, M позволяет описать любую точку, определенную в локальной системе координат, в глобальную систему координат.

Вы можете сделать то же самое с камерой, но то, что вы действительно хотите это сделать ровно обратное, что вы делали раньше, то есть, вы хотите, чтобы описать любую точку в глобальной системе координат камеры локальной системы координат:

Pc = X*Pg, but what is the value of X? 

Вы знаете, что:

Pg = Tc*Rc*Pc, so Pc = inv(Tc*RC)*Pg 

в порядке слов:

X = inv(Tc*Rc) = inv(Rc) * inv(Tc) 

Поэтому, чтобы описать точку, из своей локальной системы координат к системе координат камеры, вам просто нужно объединить эти две матрицы:

Pc = inv(Rc)*inv(Tc)*T*R*P, where 
M' = inv(Rc)*inv(Tc)*T*R 

Обратите внимание, что некоторые системы (glm library, например), определить эту матрицу (X) в качестве lookAt и его определение можно найти here. Я бы посоветовал вам здесь article слишком

0

То, что вы правильно.

modelMatrix = modelTranslation * modelRotation * modelScale; // M=TRS 
viewMatrix = cameraOrientation * cameraTranslation; // V=OT 

Чтобы это было легче запомнить, обратите внимание на то, что матрицы применяются в основном назад. Будем считать, что M=SRT. Итак, у вас есть куб, и вы его переводите. Но если вы вращаетесь, он будет вращаться с исходной точки поворота. Затем, как только вы примените коэффициент масштабирования, модель будет искажена, поскольку масштабирование применяется после поворота. С этим все сложно справиться - M=TRS намного проще для большинства целей, если вы это считаете. Это немного сложно описать словами, поэтому дайте мне знать, хотите ли вы сделать несколько снимков.

 Смежные вопросы

  • Нет связанных вопросов^_^