0

我正在试验不同的矩阵,研究它们对纹理四边形的影响。到目前为止,我已经相当容易地实现了缩放、旋转和平移矩阵——通过对我的位置向量使用以下方法:

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。我该怎么做?现在最迷茫。

4

2 回答 2

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

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

于 2012-09-21T13:34:27.313 回答
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, },
};
于 2012-09-08T02:41:37.797 回答