所以我对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时,我能够做到这一点,但现在我迷失了。
答案 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以便轻松生成变换矩阵。