2012-04-10 3 views
2

Im look to piggyback значение float на матрице 4x4, передающей. Соответствующая матрица используется для различных векторных преобразований xyz. Насколько я понимаю, первые 3x3 матрицы облегчают поворот и масштабные преобразования с 4-м значением первых трех строк смещают ось преобразования, а первые 3 элемента нижней строки выполняют позиционное смещение, но что делает последний элемент делать? Насколько я видел, это всегда 1 и ничего не делает, есть ли какой-нибудь вред во мне, который хорошо его использует?4x4 матрица значение последнего элемента?

+0

какой объект/инструмент/API/и т. Д. вы используете это для? Это не стандарт математики/матрицы, это соглашение того, что вы передаете этой матрице. – RBarryYoung

+0

Хотя мое предубеждение было бы в том, что он контролирует масштабирование. – RBarryYoung

+0

матрицы создаются с использованием функций d3dx и применяются в среде hlsl, масштабирование также было моей первой мыслью, но я попытался использовать 100 случайных матриц на случайных векторах, а изменение последнего значения ничего не сделало –

ответ

8

Если (как ваш вопрос предлагает), то соглашение состоит в том, что точки являются векторами столбцов, а последние элементы первых трех строк определяют перевод, тогда первые 3 элемента нижней строки: не позиционное смещение: 4-я строка матрицы преобразования используется для перспективной проекции, то есть как камера отображает 3D-точки на 2D-окно просмотра. Эскиз, как матрица 4x4 используется для отображения пунктов:

result =  4x4 matrix  * point 

[ x' ]  [ Rxx Rxy Rxz Tx ]  [ x ] 
[ ]  [    ]  [ ]  -> R** is the rotation/scaling matrix 
[ y' ]  [ Ryx Ryy Ryz Ty ]  [ y ] 
[ ] = [    ] * [ ]   T* is the translation vector 
[ z' ]  [ Rzx Rzy Rzz Tz ]  [ z ] 
[ ]  [    ]  [ ]   P* fixes the camera projection plane 
[ w' ]  [ Px Py Pz Pw ]  [ w ] 

-> x' = dot_product3([Rxx,Rxy,Rxz], [x,y,z]) + Tx * w 
-> y' = dot_product3([Ryx,Ryy,Ryz], [x,y,z]) + Ty * w 
-> z' = dot_product3([Rzx,Rzy,Rzz], [x,y,z]) + Tz * w 
-> w' = dot_product4([Px,Py,Pz,Pw], [x,y,z,w]) 

Заключительный шаг в 3D точки -> отображение 2D экран разделить на 4 (w') координат - так, для стандартных геометрических преобразований , последняя строка должна быть [0,0,0,1], что оставляет координату w без изменений.

Если первые 3 элемента нижней строки не являются 0, матрица, как правило, генерирует странное, неоднородное искажение трехмерного пространства. И, хотя можно использовать последний элемент как единый обратный масштабный коэффициент, вероятно, лучше сделать свое масштабирование с помощью верхней левой 3х3 субматрицы и оставить нижний ряд исключительно для камеры.

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