2011-05-16 83 views
1

我正在做一个使用右手坐标的3D图形“蓝色屏幕上无纹理的立方体”测试。然而,它们会出现奇怪的剪切或扭曲(在Orthographic中,显示左侧在窗口结束前结束;在Perspective中,它看起来像显示从左后延伸到右前方)。我需要一个用于右手正投影和透视投影矩阵的公式

不知道问题实际是什么,但投影矩阵似乎是一个很好的开始。

我现在使用的那些:

// Went back to where I found it and found out this is a 
    // left-handed projection. Oops! 
    public static Matrix4x4 Orthographic(float width, float height, 
     float near, float far) 
    { 
     float farmnear = far - near; 
     return new Matrix4x4(
      2/width, 0, 0, 0, 
      0, 2/height, 0, 0, 
      0, 0, 1/farmnear, -near/farmnear, 
      0, 0, 0, 1 
      ); 
    } 


    // Copied from a previous project. 
    public static Matrix4x4 PerspectiveFov(float fov, float aspect, 
     float near, float far) 
    { 
     float yScale = 1.0F/(float)Math.Tan(fov/2); 
     float xScale = yScale/aspect; 
     float farmnear = far - near; 
     return new Matrix4x4(
      xScale, 0, 0, 0, 
      0, yScale, 0, 0, 
      0, 0, far/(farmnear), 1, 
      0, 0, -near * far/(farmnear), 1 
      ); 
    } 

感谢

+0

什么是您的转换管道?或者你是否在使用OpenGL或Direct3D等3D图形API? – 2011-05-16 16:36:19

+0

我使用SlimDX(基本上是DirectX的.NET包装器)作为后端,我自己的库在上面。而且......我不确定什么是“转换管道”,但这里有一些相关代码的Pastebin:http://pastebin.com/3DziVJSV - 我知道这是一种黑客行为,这是基本功能的早期测试。 – 2011-05-16 16:55:51

+0

对于“转换管道”,我的意思是将顶点的三维坐标转换为屏幕坐标。但既然你说你使用的是Direct3D,那就很明显了。 – 2011-05-16 17:06:47

回答

0

解决 - 感谢您的帮助。这不是投影矩阵;它是LookAt/View矩阵中的一个错误的变量。现在所有东西都显示正确,它已被修复。

public static Matrix4x4 LookAt(Vector3 eye, Vector3 target, Vector3 up) 
    { 
     Vector3 zAxis = target; zAxis.Subtract(ref eye); zAxis.Normalize(); 
     Vector3 xAxis = up; xAxis.Cross(zAxis); xAxis.Normalize(); 
     Vector3 yAxis = zAxis; yAxis.Cross(xAxis); 
     return new Matrix4x4(
      xAxis.X, yAxis.X, zAxis.Z, 0, // There. 
      xAxis.Y, yAxis.Y, zAxis.Y, 0, 
      xAxis.Z, yAxis.Z, zAxis.Z, 0, 
      -xAxis.Dot(eye), -yAxis.Dot(eye), -zAxis.Dot(eye), 1 
      ); 
    } 

糟糕。 :)