2012-08-14 65 views
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×768窗口,我的應用領域,並希望在10,10來定位我的紋理四。我如何去做這件事?現在最困惑。

+1

自從我上次做了任何DirectX以來,已經過去了10年,但當時它是一個'正交矩陣(Orthoganal Matrix)「,可以將它轉換爲屏幕座標。希望這是一些幫助。 – 2012-08-14 14:34:39

回答

1

我不熟悉slimdx,但在原生DirectX中,如果要在屏幕座標中繪製四邊形,則應該將頂點格式定義爲Translated,即直接指定屏幕座標而不是使用D3D變換引擎改變你的頂點。頂點定義如下

#define SCREEN_SPACE_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) 

,你可以這樣定義在3D系統中,這

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到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 

現在y的你做

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 

此外,如果你想轉換應用到你的股四頭肌,這是更好地將變換髮送給着色器(並在頂點着色器中進行向量變換),而不是在頂點上進行乘法運算,因爲每次都不需要更新頂點緩衝區。