从3D平滑过渡到2D

时间:2010-10-25 19:00:21

标签: c# c++ math 3d matrix

我正在编写自己的3D引擎,我有这个矩阵来制作透视图。 (这是一个标准矩阵,所以没什么有趣的)

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;
    }

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

但我们想做的是从3D平滑过渡到2D并返回......

任何人都有任何想法?我需要在此矩阵中进行哪些更改才能实现平滑过渡?

2 个答案:

答案 0 :(得分:1)

我会在m和indentity矩阵I之间使用插值,如下所示:

让alpha在alpha * m +(1-alpha)* I

中从1变为0

编辑:

请你详细说明

  

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

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

答案 1 :(得分:0)

嗯..忽略“预期”矩阵我做了两件事...首先我忽略了矩阵调用中的预期矩阵

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);
}