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

SparkyNZ

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

我想将立方体放置在离我较远的位置,在右边和上方,因此我想将立方体放置在(1,1,1)。我目前没有任何“相机”代码,因此假设我的观看位置是(0,0,0)。

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

我对视图和模型矩阵感到困惑。我以为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;"
"}"

;
拉比德76

我下面的代码可以按我期望的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轴指向上方,则Z轴指向视口之外。
请参阅了解OpenGL的矩阵

在此处输入图片说明


我上面描述的坐标通常是右手系统中的视图坐标,因为glm::glm::perspective建立了右手投影矩阵,该矩阵将其坐标转换为剪辑空间,这样z轴便会反转并成为深度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章