如何使用矩阵在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.
我不知道得不到你的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以获得简单的变换矩阵生成。
看看你的顶点着色器。您只使用输入'position'属性为'v'赋值,然后这个值永远不会被使用。所以它对结果没有影响。另一方面,你使用'gl_Position'中的值永远不会被初始化。 –