2015-07-11 95 views
0

所以我對opengl很新穎,我得到一個對象出現在屏幕上,我也有遊戲循環,但我不能得到我製作的三角形移動,如果我做讓它移動它不會重繪自己。如何使用矩陣在opengl中移動和旋轉對象

PaintGl吸引我的三角形屏幕

void MeGlWindow::paintGL() 
{ 
GLint TriPositionUniformLocation = glGetUniformLocation(programID, "TriPosition"); 
TriPosition = rot * tra; 
glUniformMatrix3fv(TriPositionUniformLocation, 1, GL_FALSE, &TriPosition[0][0]); 

//glClearColor(1, 0, 0, 1); 
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glViewport(0, 0, width(), height()); 
//glDrawArrays(GL_TRIANGLES, 0, 6); 
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 

} 

我的更新被稱爲每一幀和IM試圖用它來獲取鍵盤輸入知道什麼時候移動的對象。現在我試着翻譯,如果你按下了u或者down鍵,並且按下了左鍵或者右鍵的話就會旋轉。

void MeGlWindow::myUpdate() 
{ 


short Left = GetAsyncKeyState(37); 
short Up = GetAsyncKeyState(38); 
short Right = GetAsyncKeyState(39); 
short Down = GetAsyncKeyState(40); 
float speed = .001f; 
float angle = 0; 


if (Left != 0) 
{ 
    angle -= .5; 
    rot = mat3(cos(angle), -sin(angle), rot[0][2], sin(angle), cos(angle), rot[1][2], rot[2][0], rot[2][1], rot[2][2]); 
    cout << "moved" << endl; 
} 

if (Right != 0) 
{ 
    angle += .5; 
    rot = mat3(cos(angle), -sin(angle), rot[0][2], sin(angle), cos(angle), rot[1][2], rot[2][0], rot[2][1], rot[2][2]); 
    cout << "moved" << endl; 
} 
if (Up != 0) 
{ 
    tra = mat3(tra[0][0], tra[0][1], tra[0][2], tra[1][0], tra[1][1], tra[1][2] + speed, tra[2][0], tra[2][1], tra[2][2]); 
    cout << "moved" << endl; 
} 
if (Down != 0) 
{ 
    tra = mat3(tra[0][0], tra[0][1], tra[0][2], tra[1][0], tra[1][1], tra[1][2] + -speed, tra[2][0], tra[2][1], tra[2][2]); 
    cout << "moved" << endl; 
} 
if (angle < 0) angle += 360; 
if (angle > 360) angle -= 360; 



paintGL(); 
} 

我最後一段代碼是我用來繪製三角形的vertexshadercode。

#version 430 

in layout(location=0) vec2 position; 
in layout(location=1) vec3 vertexColor; 

uniform mat3 TriPosition; 

out vec3 theColor; 

void main() 
{ 
vec4 v = vec4(position, 0.0, 1.0); 
gl_Position.x = gl_Position.x + TriPosition[0][2]; 
gl_Position.y = gl_Position.y + TriPosition[1][2]; 
theColor = vertexColor; 
}; 

爲什麼我的三角形沒有移動或旋轉。當我不使用opengl時,我能夠做到這一點,但現在我迷了路。

+1

看看你的頂點着色器。您只使用輸入'position'屬性爲'v'賦值,然後這個值永遠不會被使用。所以它對結果沒有影響。另一方面,你使用'gl_Position'中的值永遠不會被初始化。 –

回答

0

1.

我不知道得不到你的TriPosition的構造,但它可能是您的矩陣已經從「MAT3」類轉換成你的「TriPosition」級的過程中被調換。

glUniformMatrix3fv(TriPositionUniformLocation,1,GL_FALSE,& TriPosition [0] [0]);

嘗試將第三個參數更改爲GL_TRUE,這會使您的輸入在傳遞給GPU時轉置。測試並看看會發生什麼。

glUniformMatrix3fv(TriPositionUniformLocation,1,GL_TRUE,& TriPosition [0] [0]);

Reto評論中解釋了什麼都沒有發生的原因。

2.

雖然,我可以看到你的三角是指生活在二維空間,嘗試使用,而不是在頂點着色器MAT3 MAT4,這樣你就只需要乘矩陣和頂點,而不是像你在那裏做的那樣獲得價值。

#version 430 

in layout(location=0) vec2 position; 
in layout(location=1) vec3 vertexColor; 

uniform mat4 TriPosition; 

out vec3 theColor; 

void main() 
{ 
vec4 v = vec4(position, 0.0, 1.0); 
gl_Posiiton = TriPosition * v; 
theColor = vertexColor; 
}; 

正如你不會有任何z平移和旋轉,你的矩陣將類似於以下,其中R0,R1,R2,R3是旋轉的因素,TX,TY是翻譯的因素:

r0 r1 0 tx  r0 r1 0 0  1 0 0 tx 
r2 r3 0 ty = r2 r3 0 0 * 0 1 0 ty 
0 0 1 0  0 0 1 0  0 0 1 0 
0 0 0 1  0 0 0 1  0 0 0 1 
TRIPOSITION = ROTATION  * TRANSLATION 

如果您取出第三行和第三列,則注意與3x3矩陣相同。

3.

我會說這是「轉換」,而不是「TriPosition」,因爲TriPosition聽起來像只進行翻譯。

4.

您在C++中使用的類mat3。那是來自glm嗎?那麼您可能想要檢查this以獲得簡單的變換矩陣生成。