XNA 3.0 Game Programming Recipes翻译4-6

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矩阵。

 

注意 更好的方法是用可配置变量做一个自定义模型处理器

转载于:https://www.cnblogs.com/XNAconglele/archive/2009/08/28/1555576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值