4-6. 设置模型到预定大小
问题
从文件加载一个模型时,他常常看上去很大或很小。你想设置他为自定义的大小。
方案
首先你要创建全局包围球。当你知道球,你就知道模型的当前大小。
从这个大小,你就可以知道在渲染前,你要放大或缩小多少。或者你可以把这个缩放操作作用于根骨骼矩阵,这样会作用于模型的所有子矩阵。
如何运作
通常,用不同工具创建的模型,或从网上搜来的,你不能假设模型的大小。如果你可以把他们缩放为你想要的大小就太好了。下面的代码计算模型要缩放多少,凭你高兴。它预计模型的Tag属性中存储的全局BoundingSphere。
private Matrix[] AutoScale(Model model, float requestedSize)
{
BoundingSphere bSphere = (BoundingSphere)model.Tag;
float originalSize = bSphere.Radius * 2;
float scalingFactor = requestedSize / originalSize;
model.Root.Transform = model.Root.Transform * Matrix.CreateScale(scalingFactor);
Matrix[] modelTransforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(modelTransforms);
return modelTransforms;
}
你要把模型传给方法,并指定你要的大小。
方法检索模型的全局BoundingSphere。你要双倍球的半径来找出球的大小,这里是bSphere,和加载的模型的原大小相符。接下来,用请求的大小除以此值找出模型要缩放多少。
您可以使用此换算系数建立矩阵。当渲染模型时你把这个矩阵设为世界矩阵,你的模型就缩放为你要的大小。
应用缩放到根骨骼
制作精良的模型链接所有子网格到它们的根骨骼。这意味着你要做的只是缩放根骨骼的矩阵,所有子网格会自动缩放。
基于你计算scalingFactor之前,你可以用根矩阵乘以缩放矩阵来得到,把结果储存回模型。
因为你改变了模型的骨骼矩阵的内容,你要提取新版modelTransforms矩阵。
注意 更好的方法是用可配置变量做一个自定义模型处理器。