Камера (LootkAt + ортогональная проекция) не хочет работать [SlimDX / D3D9] - PullRequest
0 голосов
/ 08 февраля 2012

Я не очень понимаю, как "камеры" работают с D3D9

Во-первых, как мне настроить камеру:

     public Camera()
    {
        this.eye = new Vector3(0.0f, 0.0f, 0.0f);
        this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
        this.up = new Vector3(0.0f, 1.0f, 0.0f);
        viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
        projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 1.0f);
    }

И мои вершины:

        vertices = new VertexTexture[]
        {
            new VertexTexture()
            {
                Position =  new Vector4(0.0f, 0.0f, 0.0f, 1.0f),
                TextureCoord = new Vector2(0.0f, 1.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(0.0f, model.Height, 0.0f, 1.0f),
                TextureCoord = new Vector2(0.0f, 0.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(model.Width, model.Height, 0.0f, 1.0f),
                TextureCoord = new Vector2(1.0f, 0.0f)
            },
            new VertexTexture()
            {
                Position =  new Vector4(model.Width, 0.0f, 0.0f, 1.0f),
                TextureCoord = new Vector2(1.0f, 1.0f)
            }
        };

Это работает. Я могу двигать камеру, масштабировать и т. Д.

Но свойства камер кажутся мне странными! Я думал, что это будет что-то вроде:

    public Camera()
    {
        this.eye = new Vector3(0.0f, 0.0f, 1.0f);
        this.lookAt = new Vector3(0.0f, 0.0f, 0.0f);
        this.up = new Vector3(0.0f, 1.0f, 0.0f);
        viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
        projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.1f, 100.0f);
    }

но с этими параметрами это не работает. То же самое, если я изменю координату Z для моего плана (который должен быть установлен на 0, чтобы работать).

Теперь я пытаюсь визуализировать другие объекты. Я генерирую вершины для сферы (она отлично работает на D3D 10, сфера 1 радиуса, сгенерированная вокруг (0; 0; 0)), но на экране ничего не появляется

Я играл с параметрами eye и lookat, но я могу понять, как заставить его работать, так что я делаю не так?

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Сначала немного фона.В ортогональной проекции нам технически не нужно преобразование Z-координат, но на самом деле системе D3D не важно, какую проекцию вы используете - для устройства это просто матрица преобразования и ничего более.Таким образом, координата Z всегда преобразуется независимо от типа проекции.С другой стороны, координаты камеры не преобразованы матрицей проекции (в противном случае позиционирование было бы кошмаром).Теперь давайте вернемся к вашей ситуации и посмотрим, что происходит.

Указывая zn = 0.1f в OrthoLH, вы заявляете, что это ваша минимальная глубина.Следовательно, каждая вершина будет сдвинута по глубине на -0.1f.С вашей вершинной раскладкой Z будет 0,9f, но вы помните, что на камеру это не влияет?Таким образом, он все еще находится на глубине 1.0f, и поэтому вы ничего не видите: за камерой нет вершин.

Добавьте сюда ошибку вычисления с плавающей точкой, и вы поймете, почему установка камеры на 0.9f иногда помогает, а иногда нет,Тем не менее, установка положения на 0,8f будет работать в любом случае.

0 голосов
/ 09 февраля 2012

Во-первых, спасибо за ответ.Мне удалось избежать этой проблемы, установив мою камеру с такими свойствами:

        this.eye = new Vector3(0.0f, 0.0f, 0.0f);
        this.lookAt = new Vector3(0.0f, 0.0f, 1.0f);
        this.up = new Vector3(0.0f, 1.0f, 0.0f);

        viewMatrix = Matrix.LookAtLH(eye, lookAt, up);
        projectionMatrix = Matrix.OrthoLH(1 * zoomLevel, 1 * zoomLevel, 0.0f, 10000000.0f);    :D

Я еще раз прочитаю то, что вы сказали, и подумаю о лучшем исправлении:)

Я думаю, что мойпроблема связана с моими вершинами ... например, я генерирую сферу с радиусом 20, а затем преобразовываю эти вершины в сферу шириной 20 пикселей, масштабируя в соответствии с моими экранными координатами

        worldMatrix = SlimDX.Matrix.Identity;
        worldMatrix = SlimDX.Matrix.Scaling(new Vector3(2.0f / ControlWidth, 2.0f / ControlHeight, 1.0f));
        worldMatrix = SlimDX.Matrix.Multiply(worldMatrix, SlimDX.Matrix.Translation(new Vector3(-1.0f, -1.0f, 0.0f)));

Мое X / Y масштабирование в порядке.Но как масштабировать координату Z?2,0 / ((ControlHeight + ControlWidth) / 2)?

Я еще раз прочитаю твой ответчик, чтобы все понять :)

...