代码之家  ›  专栏  ›  技术社区  ›  obenjiro

从三维到二维的平滑过渡

  •  1
  • obenjiro  · 技术社区  · 14 年前

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

    我可以让我的场景看起来像二维的,只要忽略矩阵。

    有人知道吗?我需要在这个矩阵中做些什么才能使平滑过渡成为可能?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Peter G.    14 年前

    我将在m和恒等矩阵I之间使用插值,如下所示:

    在alpha*m+(1-alpha)*I中,让alpha从1变为0

    你能详细说明一下吗

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

    其思想是在2D(忽略矩阵)和3D(使用矩阵)之间进行插值。如果解释忽略矩阵的确切方式,插值应该是straigtforward。

        2
  •  0
  •   obenjiro    14 年前

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

    我只是不使用透视矩阵。。。

    第二步。。当progoctin指向屏幕时,忽略'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);
    }