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

时间:2015-07-11 19:59:11

标签: c++ 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);

}

每次调用我的更新,我试图使用它来获取键盘输入以了解何时移动对象。现在,如果按下u或向下键,我试图翻译,如果按下左或右键,则旋转。

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 个答案:

答案 0 :(得分:0)

1

我不确定无法访问你的TriPosition构造函数,但你的矩阵有可能在转换来自&#39; mat3&#39;上课到你的'TriPosition&#39;类。

<击>

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

尝试将第三个参数更改为GL_TRUE,这将使您的输入在传递给GPU时进行转置。测试并看看会发生什么。

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

Reto的评论解释了没有任何反应的原因。

2

虽然,我可以看到你的三角形意味着生活在2D空间下,尝试在顶点着色器中使用mat4而不是mat3,这样你只需要乘以矩阵和顶点,而不是像你一样得到值正在那里。

#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

如果你取出thrid row和thrid列,请注意一切都与3x3矩阵相同。

3

我说它是&#34;变换&#34;而不是&#34; TriPosition&#34;,因为TriPosition听起来只是为了翻译。

4

你在c ++中使用的mat3类。那是来自glm吗?然后,您可能需要检查this以便轻松生成变换矩阵。