2017-10-16 57 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 ] 

進一步參見: