// 计算观察矩阵 public Matrix4x4 LookAt() { Matrix4x4 view = new Matrix4x4(); Vector4 xaxis, yaxis, zaxis; zaxis = Target - Position; zaxis.Normalize(); xaxis = Vector4.Cross(Up, zaxis); xaxis.Normalize(); yaxis = Vector4.Cross(zaxis, xaxis); yaxis.Normalize(); view.M[0, 0] = xaxis.X; view.M[1, 0] = xaxis.Y; view.M[2, 0] = xaxis.Z; view.M[3, 0] = -Vector4.Dot(xaxis, Position); view.M[0, 1] = yaxis.X; view.M[1, 1] = yaxis.Y; view.M[2, 1] = yaxis.Z; view.M[3, 1] = -Vector4.Dot(yaxis, Position); view.M[0, 2] = zaxis.X; view.M[1, 2] = zaxis.Y; view.M[2, 2] = zaxis.Z; view.M[3, 2] = -Vector4.Dot(zaxis, Position); view.M[0, 3] = view.M[1, 3] = view.M[2, 3] = 0.0f; view.M[3, 3] = 1.0f; return(view); }
//消隐 private bool ShouldBackFaceCull(VertexTriangle oriVt) { Vector4 a = new Vector4(oriVt.Vertices[0].ScreenSpacePosition); Vector4 b = new Vector4(oriVt.Vertices[1].ScreenSpacePosition); Vector4 c = new Vector4(oriVt.Vertices[2].ScreenSpacePosition); a.Z = b.Z = c.Z = 0; Vector4 ab = b - a; Vector4 ac = c - a; return(Vector4.Cross(ab, ac).Z > 0); }