Вопрос о преобразовании матрицы билбордов - PullRequest
1 голос
/ 30 мая 2020
vec3 camPosInModelSpace = (inverse(mat_world) * vec4(worldCamPos, 1)).xyz;
vec3 axisZ = normalize(camPosInModelSpace);
vec3 axisY = axisZ.y > 0.999 ? vec3(0, 0, 1) : vec3(0, 1, 0);
vec3 axisX = normalize(cross(axisY, axisZ));
axisY = normalize(cross(axisZ, axisX));

mat4x4 rotate = mat4x4(vec4(axisX, 0), vec4(axisZ, 0), vec4(-axisY, 0), vec4(0, 0, 0, 1));

//vec3 vertexModelSpace = (transpose(rotate) * vec4(vPosition, 1)).xyz; // Here is my confused point
vertexModelSpace = axisX * vPosition.x + axisZ * vPosition.y + -axisY * vPosition.z;
gl_Position = mat_mvp * vec4(vertexModelSpace, 1);    

Как видите, код GLSL рекламного щита очень прост, но у меня просто есть вопрос по этому поводу, после того как я получил 3 оси под пространством модели, почему я не могу использовать матрицу чтобы преобразовать вершину (когда я это делал, казалось, работает только ось Y) , но когда я использовал способ руководства, он работает нормально.
Пожалуйста, помогите мне, я действительно сбит с толку, спасибо вы.

1 Ответ

1 голос
/ 30 мая 2020

OepnGL и GLSL построены с основным столбцом в качестве макета матрицы по умолчанию, следовательно, mat4 m; m[c][r] используется для доступа к r- -й строке c -го столбца, а m[c] вернет c -й столбец как vec4. В соответствии с этим конструктор матрицы использует векторы-столбцы: mat4 m(c0,c1,c2,c3), следовательно,

mat4x4 rotate = mat4x4(vec4(axisX, 0), vec4(axisZ, 0), vec4(-axisY, 0), vec4(0, 0, 0, 1));

приведет к матрице в математической нотации:

axisX.x    axisZ.x  -axisY.x    0
axisX.y    axisZ.y  -axisY.y    0
axisX.z    axisZ.z  -axisY.z    0
   0          0         0       1

и, следовательно,

vertexModelSpace = (transpose(rotate) * vec4(vPosition, 1)).xyz; 

равно не эквивалентно

vertexModelSpace = axisX * vPosition.x + axisZ * vPosition.y + -axisY * vPosition.z;

, но фактически будет использовать транспонирование этого матрица преобразования, которая оказывается обратной для матриц вращения.

...