什么是定义相机/物体z位置时的一般惯例

时间:2015-05-05 20:33:17

标签: java opengl

我正在切换自己在java生成矩阵,以便传递到我的opengl着色器。

我创建了一个生成透视矩阵的方法,该方法工作正常。但目前我的对象是在z位置0.0f绘制的。这意味着当应用程序运行时,我只能看到我的一个自定义对象(方形)真的关闭。

我应该将我的相机z位置设置为0.0f(当前正在发生)..还是我的所有对象z都定位到0.0f

createPerspectiveProjection(60.0f, width / height, 0.1f, 100.0f);

/**
 * @param fov
 * @param aspect
 * @param zNear
 * @param zFar
 * @return projectionMatrix
 */
private Matrix4f createPerspectiveProjection(float fov, float aspect, float zNear, float zFar){

    Matrix4f mat = new Matrix4f();

    float yScale = (float) (1 / (Math.tan(Math.toRadians(fov / 2))));
    float xScale = yScale / aspect;
    float frustrumLength = zFar - zNear;

    mat.m00 = xScale;
    mat.m11 = yScale;
    mat.m22 = -((zFar + zNear) / frustrumLength);
    mat.m23 = -1;
    mat.m32  = -((2 * zFar * zNear) / frustrumLength);
    mat.m33 = 0;

    return mat;
}

1 个答案:

答案 0 :(得分:1)

您使用的标准投影矩阵对应于放置在原点的相机,并向下看负Z轴。 near和far值确定视锥体内的 z值的范围。使用示例中的值,这意味着-0.1f和-100.0f之间的z值是可见的。只要它们在视角范围内定义的金字塔内就可以了。

如何将相机和物体放置在世界空间中完全取决于您。如果您模拟传统的OpenGL渲染管道,您将拥有一个模型视图矩阵,可以转换对象以将它们放置在上述视锥体中。这意味着在应用模型视图转换后,可见对象应具有负z值。

实现这一目标的绝对最简单的方法是使用身份转换(即根本不进行转换)进行模型 - 视图转换,并将对象放在负z轴周围。

但是,将对象放置在原点周围的位置通常很方便。允许它工作的一种简单方法是将摄像机放在正z轴上,并将其指向原点。然后,模型 - 视图矩阵变得特别简单。它只是在负z方向上的平移,将相机从正z轴上的位置移动到原点,与投影矩阵的设置方式相匹配。

例如,当您的近/远值为0.1 / 100.0时,您可以将相机置于(0.0,0.0,50.0)世界空间中。然后,视图变换是(0.0,0.0,-50.0)的平移。世界空间中从49.9到-50.0的z范围是可见范围,允许您将对象放置在原点周围。