Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在现代opengl中移动形状/对象 我正在学习C++的C/SFLM/OpenGL中的突破游戏。这是我第一次尝试现代opengl_C++_Opengl_Sfml - Fatal编程技术网

在现代opengl中移动形状/对象 我正在学习C++的C/SFLM/OpenGL中的突破游戏。这是我第一次尝试现代opengl

在现代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

我的问题是,我不知道如何让球拍移动(或者球移动)。现在,我平移整个视图,使摄影机移动,但形状保持在其原始位置。我一直在关注某些在线教程(主要是ArcSynthesis和open.gl),但我只是不了解一些东西,所以我想知道是否可以得到反馈。我知道我需要转换桨的位置,目前我正在使用MVP矩阵设置

在我的顶点着色器中,我有

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个浮点向量
  • 更新方法
  • 渲染方法
在调用update方法之前,使用glm::lookAt或类似的方法从相机生成视图矩阵。 然后你调用更新方法的桨和改变的立场,根据你的游戏逻辑。渲染挡板时,必须使用统一的渲染器将视图/模型视图矩阵上载到着色器。 在设置统一之前,可以更改modelview矩阵,并使用以下数学方法平移对象:

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不同)。我想我明白你的意思了。我有一种感觉,每个形状都需要一个各自的“模型”,因为我的变换修改了整个屏幕。