我有一些转换矩阵的代码,并添加了一些处理 Frustum 和 Perspective 的函数。
问题是,当我调用透视图时,一切看起来好像我有一个非常大的视野(在屏幕中间还可以,而在边缘非常拉伸)。当我增加近值时,这种效果会更糟。
void Frustum(T left, T right, T bottom, T top, T zNear, T zFar)
{
m[0][0]=2.0f*zNear/(right-left);
m[1][0]=0.0f;
m[2][0]=(right+left)/(right-left);
m[3][0]=0.0f;
m[0][1]=0.0f;
m[1][1]=2.0f*zNear/(top-bottom);
m[2][1]=(top+bottom)/(top-bottom);
m[3][1]=0.0f;
m[0][2]=0.0f;
m[1][2]=0.0f;
m[2][2]=-(zFar+zNear)/(zFar-zNear);
m[3][2]=-2.0f*zFar*zNear/(zFar-zNear);
m[0][3]=0.0f;
m[1][3]=0.0f;
m[2][3]=-1.0f;
m[3][3]=0.0f;
}
void Perspective(T fovy,T aspectRatio,T zNear,T zFar)
{
T xmin,xmax,ymin,ymax;
ymax= zNear* tan(fovy*Math<T>::PI/360.0);
ymin= -ymax;
xmin= ymin*aspectRatio;
xmax= ymax*aspectRatio;
Frustum(xmin,xmax,ymin,ymax,zNear,zFar);
}
T 是一个浮点数或双精度类,因为该类是模板化的(对于测试,我只使用了浮点数)。
我使用的测试值是fovy="60" znear="1.0" zfar="1000.0"
,当我将它们更改为fovy="60" znear="10.0" zfar="1000.0"
它时会变得更糟。
请注意,矩阵是 DirectX 样式,但我在 OpenGL 中使用它们,因此我更改了着色器中的乘法顺序。
你们看到我的代码有什么问题吗?
谢谢