2011-10-10 78 views
0

我正在爲圖形類構建射線追蹤器,我們需要做的一部分設置是在投射射線之前將模型縮放到世界空間中。我已經建立了worldMatrix需要的。不過,我第一次嘗試轉換模型的結果會改變模型的邊界框,但是沒有VertexBuffer中的頂點。在不渲染的情況下對模型應用變換

這是我第一次嘗試:

foreach (ModelBone b in model.Bones) 
{ 
    // apply the model transforms and the worldMatrix transforms to the bone 
    b.Transform = model.Root.Transform * worldMatrix; 
} 

我也試着設置在模型中找到網格像每一個模型繪畫教程顯示效果值,但無濟於事。

有沒有我應該嘗試轉換模型的一些其他的方式?

回答

1

b.Transform = root * world;沒有考慮骨骼本身的任何數據。

可能你需要:b.Transform = root * b * world;

頂點緩衝區中的數據應該在遊戲/應用程序的整個生命週期內保持不變。會發生什麼情況是原始(不變的)頂點數據會在頂點着色器中被每個幀重新轉換爲您通過效果發送的任何不同的世界矩陣。

通常情況下,它會去是這樣的:

//class scope fields 
Matrix[] modelTransforms; 
Matrix worldMatrix; 

//in the loadContent method just after loading the model 
modelTransforms - new Matrix[model.Bones.Count]; 
model.CopyAbsoluteTransformsTo(modelTransforms);//this line does what your foreach does but will work on multitiered hierarchy systems 

//in the Update methos 
worldMatrix = Matrix.CreateScale(scale); 
boundingBox.Min *= scale; 
boundingBox.Max *= scale 
//raycast against the boundingBox here 

//in the draw call 
eff.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix; 
相關問題