2015-01-10 63 views
0

我正在使用D3DXVec3Project函數來獲取3D點的屏幕座標並繪製出現爲3D的2D線條。 顯而易見的結果是,即使對象應該位於線條的前面,繪製的線條也始終位於任何3D對象的頂部。如何在DirectX中繪製2D幾何體的Benind 3D對象? (D3D9)

這是我使用畫線的代碼:

void DrawLine(float Xa, float Ya, float Xb, float Yb, float dwWidth, D3DCOLOR Color) 
{ 
    if (!g_pLine) 
     D3DXCreateLine(d3ddev, &g_pLine); 

    D3DXVECTOR2 vLine[2]; // Two points 
    g_pLine->SetAntialias(0); // To smooth edges 


    g_pLine->SetWidth(dwWidth); // Width of the line 
    g_pLine->Begin(); 

    vLine[0][0] = Xa; // Set points into array 
    vLine[0][1] = Ya; 
    vLine[1][0] = Xb; 
    vLine[1][1] = Yb; 

    g_pLine->Draw(vLine, 2, Color); // Draw with Line, number of lines, and color 
    g_pLine->End(); // finish 
} 

作爲一個例子我有稀土作爲3D球體和黃道的平面中的2D線的柵格,地球的一半是在頂部的黃道,所以地球的一半應該繪製在黃道網格上方,我使用整個網格的代碼總是在地球上,所以看起來整個星球都在網格之下。

下面是截圖:http://s13.postimg.org/3wok97q7r/screenshot.png

怎樣繪製3D對象後面的線?

好吧,我知道了現在的工作,這是岩石繪製在D3D9 3D行代碼:

LPD3DXLINE  g_pLine; 

void Draw3DLine(float Xa, float Ya, float Za, 
       float Xb, float Yb, float Zb, 
       float dwWidth, D3DCOLOR Color) 
{ 
    D3DXVECTOR3 vertexList[2]; 
    vertexList[0].x = Xa; 
    vertexList[0].y = Ya; 
    vertexList[0].z = Za; 

    vertexList[1].x = Xb; 
    vertexList[1].y = Yb; 
    vertexList[1].z = Zb; 

    static D3DXMATRIX m_mxProjection, m_mxView; 

    d3ddev->GetTransform(D3DTS_VIEW, &m_mxView); 
    d3ddev->GetTransform(D3DTS_PROJECTION, &m_mxProjection); 

    // Draw the line. 
    if (!g_pLine) 
    D3DXCreateLine(d3ddev, &g_pLine); 
    D3DXMATRIX tempFinal = m_mxView * m_mxProjection; 
    g_pLine->SetWidth(dwWidth); 
    g_pLine->Begin(); 
    g_pLine->DrawTransform(vertexList, 2, &tempFinal, Color); 
    g_pLine->End(); 
} 
+0

在3D中做網格不是更容易嗎?這樣可以自動處理深度內容。 –

+0

@Adam Goodwin,是的,這就是我最初想要做的,但我不知道如何繪製3D線條,我該怎麼做?任何代碼示例? – Haalef

+0

對不起,我不知道如何使用DirectX來完成它,但是在OpenGL中,您可以將繪製模式從填充的多邊形更改爲線條。 DirectX最有可能與此類似。感謝好友 –

回答

2

隨着傳統的Direct3D 9,你只需要使用標準IDirect3DDevice9::DrawPrimitive方法與D3DPT_LINELIST一個D3DPRIMITIVETYPED3DPT_LINESTRIP。您可能會使用DrawPrimitiveUPDrawIndexedPrimitiveUP,但使用帶有DYNAMIC頂點緩衝區的非UP版本效率更高。

D3DXCreateLine傳統D3DX9實用程序庫適用於類似於CAD的場景的樣式化行。在現代DirectX 11的說法中,D3DXCreateLine基本上與用於2D渲染的Direct2D類似。

用的Direct3D 11,你有使用ID3D11DeviceContext::IASetPrimitiveTopology將其設置爲D3D11_PRIMITIVE_TOPOLOGY_LINELIST11_PRIMITIVE_TOPOLOGY_LINESTRIP模式後,使用ID3D11DeviceContext::DrawID3D11DeviceContext::DrawIndexed。對於「UP」式繪圖,請參閱DirectX Tool Kit中的PrimitiveBatch。實際上,我使用PrimitiveBatch在Simple SampleDirectX工具包中爲3D場景繪製了3D網格。

+0

!要試一試 – Haalef