Как расположить текстурированный четырехугольник в экранных координатах?

Я экспериментирую с разными матрицами, изучаю их влияние на текстурированный квад. До сих пор я довольно легко реализовал матрицы масштабирования, вращения и перемещения, используя следующий метод для моих векторов положения:

enter code here
        for(int a=0;a<noOfVertices;a++)
        {
            myVectorPositions[a] = SlimDX.Vector3.TransformCoordinate(myVectorPositions[a],myPerspectiveMatrix);
        }

Однако я хочу иметь возможность позиционировать свои векторы, используя координаты в мировом пространстве, а не в пространстве объектов.

На данный момент мои векторы положения объявлены таким образом:

enter code here
        myVectorPositions[0] = new Vector3(-0.1f, 0.1f, 0.5f);
        myVectorPositions[1] = new Vector3(0.1f, 0.1f, 0.5f);
        myVectorPositions[2] = new Vector3(-0.1f, -0.1f, 0.5f);
        myVectorPositions[3] = new Vector3(0.1f, -0.1f, 0.5f);

С другой стороны (и как часть изучения матриц) я прочитал, что мне нужно применить матрицу, чтобы получить координаты экрана. Я просматривал документы SlimDX API и не могу определить тот, который мне следует использовать.

В любом случае, надеюсь, вышеизложенное имеет смысл, и то, чего я пытаюсь достичь, ясно. Я стремлюсь к простому окну 1024 x 768 в качестве области приложения и хочу расположить свой текстурированный четырехугольник на 10,10. Как мне это сделать? Самый запутанный сейчас.


person CdrTomalak    schedule 14.08.2012    source источник
comment
Прошло более 10 лет с тех пор, как я в последний раз использовал DirectX, но тогда было Orthoganal Matrix перевести его в экранные координаты. Надеюсь, это поможет.   -  person Adrian Thompson Phillips    schedule 14.08.2012


Ответы (2)


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

#define SCREEN_SPACE_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

и вы можете определить свою вершину следующим образом

ScreenVertex Vertices[] =
{
    // Triangle 1
    { 150.0f, 150.0f, 0, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
    { 350.0f, 150.0f, 0, 1.0f, 0xff00ff00, },
    { 350.0f, 350.0f, 0, 1.0f, 0xff00ffff, },

    // Triangle 2
    { 150.0f, 150.0f, 0, 1.0f, 0xffff0000, }, 
    { 350.0f, 350.0f, 0, 1.0f, 0xff00ffff, },
    { 150.0f, 350.0f, 0, 1.0f, 0xff00ffff, },
};
person zdd    schedule 08.09.2012

По умолчанию пространство экрана в 3D-системах составляет от -1 до 1 (где -1,-1 — нижний левый угол, а 1,1 — верхний правый).

Чтобы преобразовать эти единицы в значения пикселей, вам необходимо преобразовать значения пикселей в это пространство. Так, например, пиксель 10,30 на экране 1024*768 это:

 position.x = 10.0f * (1.0f / 1024.0f); // maps to 0/1
 position.x *= 2.0f; //maps to 0/2
 position.x -= 1.0f; // Maps to -1/1

Теперь, когда ты делаешь

 position.y = 30.0f * (1.0f / 768.0f); // maps to 0/1
 position.y = 1.0f - position.y; //Inverts y
 position.y *= 2.0f; //maps to 0/2
 position.y -= 1.0f; // Maps to -1/1

Кроме того, если вы хотите применить преобразования к своим четырехугольникам, лучше отправить преобразование в шейдер (и выполнить векторное преобразование в вершинном шейдере), а не выполнять умножения на вершинах, так как вам не нужно будет обновлять свой вершинный буфер каждый раз.

person mrvux    schedule 21.09.2012