如何在模型/视图/世界空间中定位对象?

时间:2013-09-24 19:11:27

标签: opengl glm-math

我有一个立方体,其中心定义为0,0,0,边缘达到-1 / + 1(即立方体的宽度,高度,深度为2)。

然后我设置了以下矩阵:

glm::mat4 modelMat4;
modelMat4 = glm::translate(modelMat4, 0.0f, 0.0f, 200.f);
modelMat4 = glm::scale(modelMat4, 200.0f, 200.0f, 200.0f);

glm::mat4 viewMat4;
viewMat4 = glm::lookAt(glm::vec3(0.0f, 0.0f, zNear),
            glm::vec3(0.0f, 0.0f, zFar),
            glm::vec3(0.0f, 1.0f, 0.0f));

// initialWidth = window width
// initialHeight = window height
// zNear = 1.0f
// zFar = 1000.0f
glm::mat4 projectionMat4;
projectionMat4 = glm::frustum(-initialWidth / 2.0f, initialWidth / 2.0f, -initialHeight / 2.0f, initialHeight / 2.0f, zNear, zFar);

但我的物体中间出现在近z平面上(即我只能从内部看到我立方体的后半部分。)

如果我将模型转换调整为:

glm::translate(modelMat4, 0.0f, 0.0f, 204.f);

然后我也可以看到我立方体的正面。

如果我将模型转换更改为:

glm::translate(modelMat4, 0.0f, 0.0f, 250.f);

然后立方体仅以大约2x2x2像素进行栅格化。

我对模型,视图投影矩阵的误解是什么?我期待变换是线性的,但是z平面在200到250之间消失。即使平面定义在1.0f和1000.0f之间。

修改:我的着色器代码如下:

#version 100

layout(location = 0) in vec3 v_Position;
layout(location = 1) in vec4 v_Colour;

layout(location = 2) uniform mat4 v_ModelMatrix;
layout(location = 3) uniform mat4 v_ViewMatrix;
layout(location = 4) uniform mat4 v_ProjectionMatrix;

out vec4 f_inColour;

void main()
{
    gl_Position = v_ProjectionMatrix * v_ViewMatrix * v_ModelMatrix * vec4(v_Position, 1.0);
    f_inColour = v_Colour;
}

1 个答案:

答案 0 :(得分:1)

你没有表明你是如何乘以你的矩阵,但是对于你所描述的,它似乎可能是错误的。请务必按此顺序执行:

MVP = projectionMat4 * viewMat4 * modelMat4;

<强>已更新

仔细查看您的代码,看起来您似乎缺少多次融合您的转换:

modelMat4 = glm::translate(modelMat4, 0.0f, 0.0f, 200.f);
modelMat4 *= glm::scale(modelMat4, 200.0f, 200.0f, 200.0f); // <-- here

因此,modelMat4将是比例结果,然后是翻译