最簡單的方法是找到模型中哪個組件包含最大範圍,並使用該值來統一縮放模型。要找到最大範圍,請計算模型邊界框(除非wavefront obj。文件已經提供了該邊界框,但也許您想要驗證它),並使用框尺寸作爲範圍進行比較。這會將所有導入的模型縮小到單位範圍。例如,如果您有一個邊框覆蓋374 * 820 * 512單位的模型,其中最大的一個是820的Y軸,所以您只需將其縮小820(將所有組件劃分爲820)。這可以通過統一的縮放矩陣來實現,如果我沒有弄錯,可以用D3DXMatrixScaling
進行初始化。 假設邊界框由2個向量(最大和最小頂點)給出,計算這些向量的差值,然後選取最大值,並將其反比作爲縮放因子用於矩陣。
D3DMatrix mScale;
D3DVector mx, mn;
obj->getBoundingBox(&mn,&mx);
float scale = 1.0/max(mx.x - mn.x, max(mx.y - mn.y, mx.z -mn.z));
D3DXMatrixScaling(&mScale, scale, scale,scale);
所有剩下的事情就是將矩陣插入到渲染管道中。
關於邊界框的計算,在模型的所有頂點上保持一個簡單的循環,保持最小和最大分量(相互獨立),應該這樣做。
D3DVector mn, mx;
mn.x = mn.y = mn.z = MAX_FLOAT;
mx.x = mx.y = mx.z = - MAX_FLOAT;
for (int i = 0; i < numVertices ; i++) {
mn.x = min(mn.x, vertex[i].x);
mn.y = min(mn.y, vertex[i].y);
mn.z = min(mn.z, vertex[i].z);
// same for mx using max
}
當然,你可能需要,如果你的看法覆蓋除單元箱體較大面積使用一些比例因子(但顯然這是你使用的是什麼)。
縮放通常是作爲[世界變換](http://msdn.microsoft.com/en-us/library/windows/desktop/bb206365.aspx)完成的,其中頂點從模型空間轉換到世界空間。然後將該矩陣乘以視圖和投影矩陣以形成最終變換。 – IInspectable
蒂姆的回答是正確的,雖然他說的規模懸殊,他說他會很快失去浮點精度。 – user805547