用于视锥剔除的截锥体的6个平面方程是怎样得到的

你说的应该是,视锥的6个平面在world space里的表达?那其实就是project space里的(-1, 0, 0, 1), (+1, 0, 0, 1), (0, -1, 0, 1), (0, +1, 0, 1), (0, 0, -1, 1), (0, 0, +1, 1)这六个平面,乘上(view * project)的逆矩阵(下面简称inv(vp)),就得到了。更进一步,因为只是+1或者-1,所以直接可以通过inv(vp)的列经过加减得到。也就是类似这样的代码:float4 column1 = clip.Column(0);float4 column2 = clip.Column(1);float4 column3 = clip.Column(2);float4 column4 = clip.Column(3);planes = column4 - column1; // rightplanes = column4 + column1; // leftplanes = column4 - column2; // topplanes = column4 + column2; // bottomplanes = column4 - column3; // farplanes = column4 + column3; // near
■网友
Matrix4 combo = mProjMat * viewMat;mPlanes.normal.x = combo + combo;mPlanes.normal.y = combo + combo;mPlanes.normal.z = combo + combo;mPlanes.d = combo + combo;mPlanes.normal.x = combo - combo;mPlanes.normal.y = combo - combo;mPlanes.normal.z = combo - combo;mPlanes.d = combo - combo;mPlanes.normal.x = combo - combo;mPlanes.normal.y = combo - combo;mPlanes.normal.z = combo - combo;mPlanes.d = combo - combo;mPlanes.normal.x = combo + combo;mPlanes.normal.y = combo + combo;mPlanes.normal.z = combo + combo;mPlanes.d = combo + combo;mPlanes.normal.x = combo + combo;mPlanes.normal.y = combo + combo;mPlanes.normal.z = combo + combo;mPlanes.d = combo + combo;mPlanes.normal.x = combo - combo;mPlanes.normal.y = combo - combo;mPlanes.normal.z = combo - combo;mPlanes.d = combo - combo; 【用于视锥剔除的截锥体的6个平面方程是怎样得到的】 对不对,你可以推算一下,哦好像上面已经回答过了

■网友
两个跟屏幕平行的很容易得到,因为距离就是你自己给的。另外四个只要会一点三角函数就好了,因为你还要给出视锥在Y轴上的夹角,最后用屏幕的分辨率算出来。
■网友
我猜题主是想通过拿到6个平面方程,然后做裁剪。OK, 是这样的,有一篇paper,用于快速get 6个平面的方程。我在自己的soft renderer就使用了这个。叫:"Fast Extraction of Viewing Frustum Planes from the WorldView-Projection Matrix"根据文中的推论,很有意思的是:如果你传入的matrix是Projection,你拿到的plane是在view space如果你传入的matrix是View-Projection,你拿到的plane是在world space如果你传入的matrix是World-View-Projection,你拿到的plane是在object space文中还根据opengl右手或者DX左手给出了代码,自己看paper吧。
■网友
又截锥体 又平面方程 是什么意思…题目表述不清
■网友
不知道题主说的是不是pipeline里的剔除。如果是的话剔除时顶点其实已经通过 proj matrix转换到 clip space了,裁切的六个面都是该space中平行于 xz xy yz平面的


    推荐阅读