Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C# by dep ( 16 years ago )
public Frustum(Matrix4 transform, float nearClip, float farClip, float hfovDegrees, float aspectRatio)
{
float vfovDegrees = hfovDegrees / aspectRatio;
Vector3 lfAxis = new Vector3(transform.m_rows[0,0], transform.m_rows[0,1], transform.m_rows[0,2]);
Vector3 upAxis = new Vector3(transform.m_rows[1,0], transform.m_rows[1,1], transform.m_rows[1,2]);
Vector3 eyeDir = new Vector3(transform.m_rows[2,0], transform.m_rows[2,1], transform.m_rows[2,2]);
Vector3 eyePos = new Vector3(transform.m_rows[3,0], transform.m_rows[3,1], transform.m_rows[3,2]);
m_planes[(int)FrustumPlane.Near] = new Plane(eyePos + eyeDir * nearClip, eyeDir);
m_planes[(int)FrustumPlane.Far] = new Plane(eyePos + eyeDir * farClip, -eyeDir);
Vector3 leftNormal = eyeDir.RotateAroundAxis(upAxis, -90.0f + hfovDegrees * 0.5f);
Vector3 rightNormal = eyeDir.RotateAroundAxis(upAxis, 90.0f - hfovDegrees * 0.5f);
Vector3 topNormal = eyeDir.RotateAroundAxis(lfAxis, -90.0f + hfovDegrees * 0.5f);
Vector3 bottomNormal = eyeDir.RotateAroundAxis(lfAxis, 90.0f - hfovDegrees * 0.5f);
m_planes[(int)FrustumPlane.Left] = new Plane(eyePos, leftNormal);
m_planes[(int)FrustumPlane.Right] = new Plane(eyePos, rightNormal);
m_planes[(int)FrustumPlane.Top] = new Plane(eyePos, topNormal);
m_planes[(int)FrustumPlane.Bottom] = new Plane(eyePos, bottomNormal);
Vector3 testPoint = eyePos + eyeDir * (farClip - nearClip) * 0.5f;
for (int i = 0; i < 6; ++i)
{
Debug.Assert(m_planes[i].ClassifyPoint(testPoint) == 1);
}
}
Revise this Paste