如何在屏幕坐标中定位纹理四边形?

时间:2012-08-14 14:32:08

标签: slimdx directx-11

我正在尝试不同的矩阵,研究它们对纹理四边形的影响。到目前为止,我已经相当容易地实现了Scaling,Rotation和Translation矩阵 - 通过对我的位置向量使用以下方法:

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。我该怎么做?现在最困惑的是。

2 个答案:

答案 0 :(得分:1)

我不熟悉slimdx,但在本机DirectX中,如果要在屏幕坐标中绘制四边形,则应将顶点格式定义为Translated,即直接指定屏幕坐标而不是使用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, },
};

答案 1 :(得分:1)

默认情况下,3d系统中的屏幕空间为-1到1(其中-1,-1为左下角,1,1为右上角)。

要将这些单位转换为像素值,您需要将像素值转换为此空间。因此,例如1024 * 768的屏幕上的像素10,30是:

 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

此外,如果您想将变换应用于四边形,最好将变换发送到着色器(并在顶点着色器中进行矢量变换),而不是在顶点上进行乘法,因为您不需要每次更新你的vertexbuffer。