2010-10-25 115 views
1

我正在编写自己的3D引擎,我有这个矩阵来做透视效果。 (这是一个标准矩阵,所以没有什么有趣的)从3D平滑过渡到2D

public static Matrix3D PrespectiveFromHV(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane, double mod) 
    { 
     double height = 1.0/Math.Tan(fieldOfViewY/2.0); 
     double width = height/aspectRatio; 
     double d = zNearPlane - zFarPlane; 

     var rm = Math.Round(mod, 1); 

     var m = new Matrix3D(
       width, 0, 0, 0, 
       0, height, 0, 0, 
       0, 0, (zFarPlane/d) * rm, (zNearPlane * zFarPlane/d) * rm, 
       0, 0, (-1 * rm), (1 - rm) 
      ); 

     return m; 
    } 

我可以让我的场景看起来像2D,就像忽略矩阵。

但是想要做的是,使从3D到2D和背部平滑过渡...

任何一个有什么想法?为了使平滑过渡成为可能,我需要在这个矩阵中改变什么?

+0

为什么你米atrix称为Matrix3D?它是一个四乘四矩阵,所以你应该打电话给Matrix4x4相当清楚是什么。或甚至更好,得到它的模板,所以我可以说矩阵 thecoshman 2010-10-25 23:23:07

+0

好吧。 Tnx我想到后来... – 2010-10-26 00:54:01

回答

1

我会使用插值m和所述的indentity矩阵I之间,像这样:

让阿尔法从1到0的α* M +(1-α)* I

编辑:

可以请你详细说明

我可以让我的场景看起来像 只是忽略矩阵。

这个想法是在2D(忽略矩阵)和3D(使用矩阵)之间进行插值。如果你解释你如何忽略矩阵,插值应该是直截了当的。

+0

不..不工作..你的“算法”工作正常时,阿尔法是1 ...但其他值我得到相当搞砸的图片... – 2010-10-25 20:31:05

+0

插值是方式去这里。您基本上想要改变应用“根据深度缩放”的内容,直到您不再缩放事物为止。 – thecoshman 2010-10-25 23:26:17

+1

你需要一个正交投影,而不是身份。 – 2010-10-25 23:58:42

0

嗯..忽略“何卫青”矩阵我做两件事情......首先我忽略矩阵callculation何卫青矩阵

var matrix =
Matrix3DHelper.RotateByDegrees(renderParams.AngleX, renderParams.AngleY, renderParams.AngleZ) *
perspectiveMaterix;

我只是不使用perspectiveMatrix ...

和第二步..我progectin指向屏幕时忽略“W”参数

private Point3D GetTransformedPoint(Point3D p, Matrix3D m)
{
double w = (((m.M41 * p.X) + (m.M42 * p.Y)) + (m.M43 * p.Z)) + m.M44;
double x = ((((m.M11 * p.X) + (m.M12 * p.Y)) + (m.M13 * p.Z)) + m.M14)/(w);
double y = ((((m.M21 * p.X) + (m.M22 * p.Y)) + (m.M23 * p.Z)) + m.M24)/(w);
double z = (((m.M31 * p.X) + (m.M32 * p.Y)) + (m.M33 * p.Z)) + m.M34;
return new Point3D(x, y, z, w);
}

+0

通过igoring'w'param我的意思是我设置'w'为1作为常量... – 2010-10-28 22:20:35