模型视图投影 - 如何在世界中移动对象

时间:2018-03-19 23:32:03

标签: c++ opengl shader vertex-shader glm-math

我有一个里面有立方体的3D世界。我知道立方体的顶点被定义为关于立方体"质心"的坐标。

我想把立方体放在远离我的位置,向右和向上,所以我想将立方体放在(1,1,1)处。我没有任何相机'目前的代码假定我的观看位置是(0,0,0)。

我需要翻译什么才能将多维数据集移动到新位置?

我对View和Model矩阵感到困惑。我认为View是摄像机视图/位置,而Model是3D世界中顶点的位置。

下面我的代码按照我对x和y位置的预期工作,但是z是负向进入屏幕(更远)并且正向屏幕移动/移出屏幕。我希望z在距离视点较远的地方是正面的。

我做错了什么?

  glm::mat4 Projection = glm::perspective( 45.0f, g_AspectRatio, 0.1f, 100.0f );

  glm::mat4 View = glm::mat4(1.0);

  glm::mat4 Model = glm::mat4(1.0);

  // Move the object within the 3D space
  Model = glm::translate( Model, glm::vec3( m_X, m_Y, m_Z ) );

  glm::mat4 MVP;
  MVP = Projection * View * Model;

MVP被传递到transform制服。

我的着色器:

char *vs3DShader  = 

"#version 140\n"

"#extension GL_ARB_explicit_attrib_location : enable\n"

"layout (location = 0) in vec3 Position;"
"layout (location = 1) in vec4 color;"
"layout (location = 2) in vec3 normal;"

"out vec4 frag_color;"

"uniform mat4 transform;"

"void main()"
"{"
"  gl_Position = transform * vec4( Position.x, Position.y, Position.z, 1.0 );"

"  // Pass vertex color to fragment shader.. \n"
"  frag_color = color;"
"}"

;

1 个答案:

答案 0 :(得分:2)

  

下面我的代码按照我对x和y位置的预期工作,但是z是负向进入屏幕(更远)并且正向屏幕移动/移出屏幕。我希望z在距离视点较远的地方是正面的。

您可以通过设置一个镜像Z轴来实现这一目的:

glm::mat4 View = glm::scale(glm::mat4(1.0), glm::vec3(1.0f, 1.0f, -1.0f));


视图矩阵从世界空间转换到视图空间。您的视图矩阵是单位矩阵:

glm::mat4 View = glm::mat4(1.0);

这意味着世界空间与视图空间相等。请注意,通常视图矩阵由glm::lookAt设置。

Z轴是X轴和Y轴的交叉积。这意味着,如果X轴指向左侧,Y轴指向上方,则在right handed system中,则Z轴指向视口外。
Understanding OpenGL’s Matrices

enter image description here


我上面描述的坐标通常是right handed system中的视图坐标,因为glm::glm::perspective设置了右手投影矩阵,它将这个坐标转换为剪辑sapce,就像z轴一样被倒置并成为深度。