Плавный переход из 3D в 2D - PullRequest
       7

Плавный переход из 3D в 2D

1 голос
/ 25 октября 2010

Я пишу свой собственный 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;
    }

Я мог бы сделать мою сцену похожей на 2D, просто игнорируя эту матрицу.плавный переход из 3D в 2D и обратно ...

У кого-нибудь есть идеи?Что мне нужно изменить в этой матрице, чтобы сделать возможным плавный переход?

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Я бы использовал интерполяцию между m и матрицей I тождества, например так:

Пусть альфа переходит от 1 до 0 в альфа * m + (1-альфа) * ​​I

РЕДАКТИРОВАТЬ:

Не могли бы вы уточнить

Я мог бы сделать мою сцену похожей на 2D, просто игнорируя эту матрицу.

Идея состоит в том, чтобы вставить между 2D(игнорируя матрицу) и 3D (используя матрицу).Если вы объясните, как именно вы игнорируете матрицу, интерполяция должна быть простой.

0 голосов
/ 29 октября 2010

Ну что ж ... чтобы игнорировать "предполагаемую" матрицу, я делаю две вещи ... во-первых, я игнорирую предполагаемую матрицу в матричной вызове

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

я просто не используюpectiveMatrix ...

и второй шаг ... я игнорирую параметр 'W', когда прогейтин указывает на экран

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...