我有一个里面有立方体的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;"
"}"
;
答案 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
我上面描述的坐标通常是right handed system中的视图坐标,因为glm::glm::perspective
设置了右手投影矩阵,它将这个坐标转换为剪辑sapce,就像z轴一样被倒置并成为深度。