我正在切换自己在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;
}
答案 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范围是可见范围,允许您将对象放置在原点周围。