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
);
}
感谢
什么是您的转换管道?或者你是否在使用OpenGL或Direct3D等3D图形API? – 2011-05-16 16:36:19
我使用SlimDX(基本上是DirectX的.NET包装器)作为后端,我自己的库在上面。而且......我不确定什么是“转换管道”,但这里有一些相关代码的Pastebin:http://pastebin.com/3DziVJSV - 我知道这是一种黑客行为,这是基本功能的早期测试。 – 2011-05-16 16:55:51
对于“转换管道”,我的意思是将顶点的三维坐标转换为屏幕坐标。但既然你说你使用的是Direct3D,那就很明显了。 – 2011-05-16 17:06:47