我有一些转换矩阵的代码,并且我添加了一些处理Frustum和透视的函数。
问题是,当我调用透视图时,一切看起来都像是我有一个非常大的视野(好的,在屏幕的中间,但在边缘非常拉伸)。当我增加near值时,这种效果会更差。
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中使用了它们,因此我更改了着色器中的乘法顺序。
你们看到我的代码有什么问题了吗?
谢谢
发布于 2012-07-20 16:44:34
问题是,当我开始使用转置的矩阵(DirectX风格)时,我想我也必须转置平截体数学,这不是一个好主意。
下面是Frustum函数应该是这样的:
void Frustum(T left, T right, T bottom, T top, T zNear, T zFar)
{
T zDelta = (zFar-zNear);
T dir = (right-left);
T height = (top-bottom);
T zNear2 = 2*zNear;
m[0][0]=2.0f*zNear/dir;
m[0][1]=0.0f;
m[0][2]=(right+left)/dir;
m[0][3]=0.0f;
m[1][0]=0.0f;
m[1][1]=zNear2/height;
m[1][2]=(top+bottom)/height;
m[1][3]=0.0f;
m[2][0]=0.0f;
m[2][1]=0.0f;
m[2][2]=-(zFar+zNear)/zDelta;
m[2][3]=-zNear2*zFar/zDelta;
m[3][0]=0.0f;
m[3][1]=0.0f;
m[3][2]=-1.0f;
m[3][3]=0.0f;
}发布于 2012-07-19 17:20:31
计算
z_delta=(zfar-znear);//used two times!
direction=(right-left);//used two times!
height=(top-bottom);//used two times!
znear_2=2.0f*znear; //used 3 times!只有一次!然后在你想要的任何地方使用它
而且,除法是如此昂贵,以至于你可以预先计算除法并存储在一个数组中,你只需要在执行时从数组中获取预先计算的元素。
例如:如果顶部和底部的范围很小,那么您可以在一个小数组中表示计算(实际上它是一个分割线和分割线的映射)
发布于 2012-07-20 02:21:53
我认为问题出在Perspective():当计算ymax时,你不应该乘以zNear。从数学上讲,你是在单位距离的平面上投影,而不是在zNear平面上;这个值在那里没有意义。
尝试只设置ymax= tan(fovy*Math<T>::PI/360.0)即可。仍然不能保证它是正确的,但这应该是更明智的。
https://stackoverflow.com/questions/11557540
复制相似问题