2008-12-01 79 views
2

我試圖編寫TransformMesh函數。該函數接受一個Mesh對象和一個Matrix對象。這個想法是使用矩陣來轉換網格。爲此,我鎖定了頂點緩衝區,並在每個頂點上調用Vector3 :: TransformCoordinate。它做了而不是產生了預期的結果。生成的網格無法識別。轉換Direct3D網格

我在做什麼錯?

// C++/CLI code. My apologies. 
int n = verts->Length; 
for(int i = 0; i < n; i++){ 
     verts[i].Position = DX::Vector3::TransformCoordinate(verts[i].Position, matrix); 
} 

回答

1

我完全同意Coincoin,上下文代碼會有所幫助。
如果您只想繪製變換網格到屏幕上,則不需要以這種方式變換網格。您可以更改世界,視圖和投影矩陣之一。這產生了預期的結果。就像下面的示例代碼一樣。

 // Clear the backbuffer to a Blue color. 
    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 
    1.0f, 0); 

    // Begin the scene. 
    device.BeginScene(); 

    device.Lights[0].Enabled = true; 

    // Setup the world, view, and projection matrices. 
    Matrix m = new Matrix(); 

    if(destination.Y != 0) 
    y += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.Y 
      * 25); 

    if(destination.X != 0) 
    x += DXUtil.Timer(DirectXTimer.GetElapsedTime) * (destination.X 
      * 25); 

    m = Matrix.RotationY(y); 
    m *= Matrix.RotationX(x); 

    device.Transform.World = m; 
    device.Transform.View = Matrix.LookAtLH(
     new Vector3(0.0f, 3.0f,-5.0f), 
     new Vector3(0.0f, 0.0f, 0.0f), 
     new Vector3(0.0f, 1.0f, 0.0f)); 
    device.Transform.Projection = Matrix.PerspectiveFovLH(
     (float)Math.PI/4, 1.0f, 1.0f, 100.0f); 

    // Render the teapot. 
    teapot.DrawSubset(0); 

    // End the scene. 
    device.EndScene(); 

此樣本取自here

2

沒有關於你在做什麼的上下文代碼,可能很難知道確切的問題。網格是如何創建的?如何讀取verts [],它是如何寫入的?你想從只寫頂點緩衝區讀取數據嗎?

我的建議是首先嚐試一個非常簡單的翻譯矩陣,然後調試代碼並查看頂點輸入和輸出。看看你是否收到了好的數據,以及它是否正確轉換。如果是這樣,問題出在頂點跨度,流聲明或DirectX管道中更深層次的東西。

正如我所說,需要更多的代碼來查明問題的根源。

0

我推薦使用函數D3DXConcatenateMeshes。通過一個網格和一個矩陣。結果將被變換網格。這很容易。