在现代opengl中移动形状/对象 我正在学习C++的C/SFLM/OpenGL中的突破游戏。这是我第一次尝试现代opengl
我的问题是,我不知道如何让球拍移动(或者球移动)。现在,我平移整个视图,使摄影机移动,但形状保持在其原始位置。我一直在关注某些在线教程(主要是ArcSynthesis和open.gl),但我只是不了解一些东西,所以我想知道是否可以得到反馈。我知道我需要转换桨的位置,目前我正在使用MVP矩阵设置 在我的顶点着色器中,我有在现代opengl中移动形状/对象 我正在学习C++的C/SFLM/OpenGL中的突破游戏。这是我第一次尝试现代opengl,c++,opengl,sfml,C++,Opengl,Sfml,我的问题是,我不知道如何让球拍移动(或者球移动)。现在,我平移整个视图,使摄影机移动,但形状保持在其原始位置。我一直在关注某些在线教程(主要是ArcSynthesis和open.gl),但我只是不了解一些东西,所以我想知道是否可以得到反馈。我知道我需要转换桨的位置,目前我正在使用MVP矩阵设置 在我的顶点着色器中,我有 gl_Position = MVP * vec4(position, 1.0); 其中MVP是一个统一的mat4变量。我使用glm::perspective和glm::look
gl_Position = MVP * vec4(position, 1.0);
其中MVP是一个统一的mat4变量。我使用glm::perspective和glm::lookAt函数来生成MVP的P*V部分。最后,当我在update()函数中收集键盘输入时,我使用glm::translate并生成一个模型。我知道乘法顺序必须是P*V*M(从我在阅读教程中收集的内容),我使用结果修改顶点着色器中的统一变量。结果是,屏幕/相机会转换位置,但形状显然不会移动。
我想我理解为什么会发生这种情况,但我不知道如何只翻译形状并从本质上控制它们的运动
编辑-下面的评论是正确的-我所需要的只是更改我的更新/渲染序列,因为我在所有形状上使用相同的变换 > P>在C++代码中,你可以有一个桨类,它应该包含以下内容:
- 位置的3个浮点向量
- 更新方法
- 渲染方法
glm::mat4 mvp = glm::translate(orgModelView, glm::vec3(x,y,z));
这将转换应用此modelview矩阵的所有对象
这背后的数学是:
TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;
Modelview矩阵是以下矩阵
[ R T ]
0 0 0 1
R是旋转矩阵,T是平移向量。如果不想旋转对象,R为标识,如果不想平移对象,T为(0,0,0)
将其应用于对象的所有顶点,可以旋转和平移对象(注意,矩阵乘法的顺序很重要)
如果要移动到不同的对象,如第一个到右侧,第二个到左侧,则需要两个不同的Modelview矩阵
在我的着色器中,我是这样做的:
in vec3 pos;
uniform mat4 modelview;
uniform mat4 projection;
void main(){
gl_Position = projection * modelview * vec4(pos,1.0);
}
通常,MVP矩阵的P*V部分是相机的结果,M部分因形状而异。这听起来就像你对所有东西都使用相同的MVP矩阵,而每个移动的对象都会有不同的MVP矩阵(M不同)。我想我明白你的意思了。我有一种感觉,每个形状都需要一个各自的“模型”,因为我的变换修改了整个屏幕。