如何使用矩阵在opengl中移动和旋转对象

问题描述:

所以我对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'中的值永远不会被初始化。 –

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以获得简单的变换矩阵生成。