我有一个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;"
"}"
;
我下面的代码可以按我期望的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] 删除。
我来说两句