2017-10-16 25 views
3

我是使用GLSL和openGL的新手。目前我使用webgl并修改着色器(vs.glsls和fs.glsl)以了解GLSL和图形编程。我有一个模型,我想缩放,旋转和翻译。缩放和旋转工作正常,但是当我乘上翻译矩阵时,结果很奇怪。我知道这是一个非常基本的问题,但我错过了一些东西,我需要找出答案。 我的模型通过y轴无限延伸。任何帮助将不胜感激。GLSL中的矩阵转换无限延伸

The white area is supposed to be the eye of the model 这是我的顶点着色器代码:

mat4 rX = mat4 (
1.0, 0.0, 0.0, 0.0, 
0.0, 0.0, -1.0, 0.0, 
0.0, 1.0, 0.0, 0.0, 
0.0, 0.0, 0.0, 1.0 
); 

mat4 rZ = mat4 (
0.0, 1.0, 0.0, 0.0, 
-1.0, 0.0, 0.0, 0.0, 
0.0, 0.0, 1.0, 0.0, 
0.0, 0.0, 0.0, 1.0 
); 

mat4 eyeScale = mat4 (
.50,0.0,0.0,0.0, 
0.0,.50,0.0,0.0, 
0.0,0.0,.50,0.0, 
0.0,0.0,0.0,1.0 
); 
mat4 eyeTrans = mat4(
1.0,0.0,0.0,0.0, 
0.0,1.0,0.0,4.0, 
0.0,0.0,1.0,0.0, 
0.0,0.0,0.0,1.0 
); 
mat4 iR = eyeTrans*rZ*rX*eyeScale; 
gl_Position = projectionMatrix * modelViewMatrix *iR* vec4(position, 1.0); 
} 
+0

这是什么意思“结果很奇怪”?请注意,矩阵乘法不可交换。试试'mat4 iR = eyeScale * rX * rZ * eyeTrans;'。也许[旋转多部分对象](https://stackoverflow.com/questions/46720166/rotating-a-multipart-object/46722875#46722875)或[OpenGL移动对象并保持转换](https://stackoverflow.com/问题/ 46720166/rotate-a-multipart-object/46722875#46722875)也可以提供帮助。 – Rabbid76

+0

@ Rabbid76我再次尝试,结果相同。不是翻译模型,而是延伸模型。我会在问题中添加一张图片,以便您可以看到结果。 – femchi

回答

4

你换行和列,当您设置转换矩阵

将其更改为:

mat4 eyeTrans = mat4(
    1.0, 0.0, 0.0, 0.0, 
    0.0, 1.0, 0.0, 0.0, 
    0.0, 0.0, 1.0, 0.0, 
    0.0, 4.0, 0.0, 1.0 
); 


一个4 * 4矩阵看起来像这样:

c0 c1 c2 c3   c0 c1 c2 c3 
[ Xx Yx Zx Tx ]  [ 0 4 8 12 ]  
[ Xy Yy Zy Ty ]  [ 1 5 9 13 ]  
[ Xz Yz Zz Tz ]  [ 2 6 10 14 ]  
[ 0 0 0 1 ]  [ 3 7 11 15 ] 

在GLSL列被寻址这样的:

vec4 c0 = eyeTrans[0].xyzw; 
vec4 c1 = eyeTrans[1].xyzw; 
vec4 c2 = eyeTrans[2].xyzw; 
vec4 c3 = eyeTrans[3].xyzw; 

和一个4×4矩阵的存储器图像看起来像这样:

[ Xx, Xy, Xz, 0, Yx, Yy, Yz, 0, Zx, Zy, Zz, 0, Tx, Ty, Tz, 1 ] 

进一步参见: