模型尺寸与缩放问题

前要:前段时间因为项目开发,3d美术做的模型是非人形模型,不需要绑定骨骼,美术做的了第一版后面需要修改,但是替换的时候发现美术的子物体缩放值都没有统一,美术每次修改都会变换,但是我们开发是在模型的prefab上做了处理,每次美术换模型都很麻烦,配合美术调测了几次始终统一不了单位值,美术说做不了,当时开发时间紧急,就没有研究,就每次替换模型后开发自己手动调整,现在不这么忙了,我就借助别人的文章自己研究调整了,写了最简洁的文档,希望美术以后遇到问题也自己多动脑子吧

---1模型的尺寸规范

为了保证在任意父子嵌套下,模型在世界中的尺寸不受影响

我们在建模时不能通过缩放来调整模型的尺寸,所有模型导出时都应处于无缩放的状态(XYZ100%缩放),并表现出正确的物理尺寸

---2 Unity的物理单位尺寸与模型的尺寸要求

Unity中物理单位尺寸默认是1m

也就是说:

Transform中的1个Position单位坐标对应1m的物理长度

Unity Scence窗口中参考线中的最小的方格边长是1m的物理长度

并且Unity中的Box,默认状态是1m棱长的立方体网格

一个正常的人物模型(不考虑特殊Boss怪物,设定需要的缩放等情况)对它在Unity世界中的的物理尺寸参照如下(两种):

---1.胶囊替代:通常3d游戏中一个正常的人物模型大小相当于Unity中创建的一个默认胶囊体的大小,经常在模型师未给出人物模型情况下使用一个默认胶囊体暂时替代人物模型

---2.棺材参照:通常3d游戏中一个正常的人物模型应能够应被放置进一个底面积 1m^2高度2m的长方体(棺材)内,也就是将Unity中创建出的两个默认Box叠放在一起

Unity中的PhyX物理系统,也大致按照m为数量级进行物理模拟

过大或是过小的物理尺寸,都会对物理系统的模拟产生影响

---3 3dsMax的尺寸设置与控制

包括3dsMax在内的大多数DCC软件,物理单位尺寸都是可调整的,以便于建模不同大小的物体

为了能够建立出物理尺寸正确的模型,在建模前,我们就需要检查/设置Max中的系统单位,它决定了我们在Max中使用的1个单位坐标长度对应的物理长度

这里的厘米就是物理单位尺寸,决定了当前Max世界1单位坐标尺寸对应的物理尺寸长度

在导入模型时,Unity会根据模型文件中标记的物理单位尺寸以及自身的物理单位尺寸,对模型空间下的坐标尺寸进行解析,转换到游戏世界中的坐标尺寸,转换后会维持模型物理尺寸的不变性

Max在导入fbx时,如果是转为可编辑多边形/网格进行导出,模型同样会维持原先的物理尺寸的不变性

(如果是长方体,球体这类基本参数形体,不转换为可编辑多边形导出,导入后会维持尺寸参数/数值的不变而不是原先物理尺寸的不变)

我们还需要保持考虑文件中的系统单位勾选

从而在我们打开.max场景时,如果原先场景中的系统物理尺寸和当前Max设置的系统物理尺寸不相同,会出现这样的提示

选择按系统单位比例重缩放文件对象,会将.max场景中的物体进行尺寸数值的调整(不是通过物体级别的Scale调整),将场景中的模型依照之前的物理尺寸大小,呈现在当前的场景中

选择采用文件单位比例,则会替换当前的系统物理尺寸为场景/文件的物理尺寸

如果你在调整模型尺寸时存在疑惑,那么你可以参照当前的单位尺寸,去创建一个长方体,并将其设置为之前提到的参照棺材的尺寸,以此为参照进行模型的尺寸设定/检查

如图我们创建了一个长方体棺材去检查柜子的尺寸是否正确

一个人物模型的尺寸参照这个长方体棺材的大小,对比这个长方体棺材,结合真实世界的物理尺寸,以及游戏的设定要求,我们就可以对其它模型进行尺寸的调整/检查

---4 Max建模时正确的尺寸调整方法

我们在建模时,不能通过物体的Scale缩放去调整模型的尺寸/比例

不只是在对接Unity时有这样的要求,不使用物体的缩放调整尺寸/比例本身就是建模时的一种规范

对于模型的尺寸,我们需要将调整植入到顶点中,即调整模型在Max世界的坐标尺寸进而调整模型的物理尺寸,而不是在物体级别Transform矩阵中进行调整,可以采用下面的方法进行调整:

可以通过长方体/球体/圆形本身就有的参数设置进行调整

通过参数形体自带的尺寸参数进行调整

转为可编辑多边形/网格,在元素子层级下对物体进行缩放调整,此时尺寸缩放是被植入到了顶点中

同样的,在元素子层级下进行的旋转/移动也都会被植入到顶点中

如果我们不经意的使用了物体缩放进行了尺寸调整,我们可以通过重置变换来进行修正

选中物体,实用工具---重置变换---重置选定内容

使用重置变换前应断开所有子物体,并且还需检查子物体的缩放是否均为100%对有缩放的子物体也要进行重置变换

此时物体会被添加一个X变换命令,物体的Scale缩放会被重置为1,物体的世界朝向/渲染会被清0,物体之前的Transform旋转/缩放产生的影响都被植入到了顶点中

我们可以进入到X变换命令的Gizmo子层级中对物体进行缩放,旋转调整,缩放渲染的效果同样是植入到顶点中,并不会对Transform矩阵产生影响

调整完成后我们右键物体转换为可编辑多边形/网格,或是塌陷X变换命令

调整物体轴心的朝向时会发现物体产生了诡异的变形,这是由于物体进行了XYZ轴不等的Scale缩放导致的,同样可以通过重置变换,将缩放植入到顶点中,之后再调整轴心朝向来解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Cesium是一个拥有强大3D 地图功能的开源Javascript库,它可以用于创建地球仪、航空图、城市模型等。模型缩放可以让用户对模型进行更加详细的查看和操作,Cesium提供了多种控制模型缩放的方法,下面将介绍其中两种: 1. 通过Viewer对象控制模型缩放 Cesium中的Viewer对象可以获取地球仪或场景中的所有对象,用于控制场景中的各种对象的属性。该对象提供了camera属性,可以用来控制相机的行为,通过设置该属性的zoomIn()和zoomOut()方法可以控制模型缩放。调用zoomIn()可以将相机向外推进,从而放大模型;调用zoomOut()可以将相机向内拉近,从而缩小模型。示例代码如下: ``` var viewer = new Cesium.Viewer('cesiumContainer'); viewer.camera.zoomIn(500); viewer.camera.zoomOut(500); ``` 2. 通过模型实例的scale属性控制模型缩放 在Cesium中,每个模型对应一个模型实例(ModelInstance)对象,该对象提供了多种控制模型属性的方法。其中,scale属性用于设置模型尺寸比例,通过调整该属性的值可以缩放模型。示例代码如下: ``` var viewer = new Cesium.Viewer('cesiumContainer'); var model = viewer.scene.primitives.add(Cesium.Model.fromUrl({ url: 'models/Cesium_MilkTruck.gltf' })); model.readyPromise.then(function(model) { model.scale = new Cesium.Cartesian3(2.0, 2.0, 2.0); }); ``` 以上是两种常用的控制模型缩放的方法,根据具体的需求选择合适的方法进行操作即可。 ### 回答2: Cesium是一款强大的地球可视化引擎,提供了丰富的控制和管理模型的功能。模型缩放是其中之一,下面我们来介绍一下如何通过Cesium来控制模型缩放。 首先,我们需要在代码中创建一个模型实例。如下是一个简单的示例代码: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({ url: 'path/to/model.gltf' })); ``` 在上面的代码中,我们创建了一个Cesium的Viewer实例和一个模型实例。需要注意的是,我们通过Cesium.Model.fromGltf方法将外部的gltf模型文件加载到了程序中。 接下来,我们可以使用模型的scale属性来控制模型缩放。scale属性是一个三元素的数组,分别对应模型沿x、y、z轴上的缩放比例。例如,下面的代码将模型在x轴上放大两倍: ```javascript model.scale = new Cesium.Cartesian3(2.0, 1.0, 1.0); ``` 需要注意的是,模型缩放是相对于其原始大小进行的,因此这个缩放比例是基于模型的原始大小而言的。 除了直接设置模型的scale属性,我们还可以使用改变视野的方式来缩放模型。Cesium提供了Camera的zoomIn和zoomOut方法,可以通过改变相机距离模型的距离来缩放模型。例如,下面的代码将相机向模型靠近并缩小模型大小: ```javascript viewer.camera.zoomIn(100); ``` 需要注意的是,这个方法是基于相机距离模型的距离而言的,因此缩放比例与模型的原始大小无关。 总结起来,通过改变模型的scale属性或改变相机距离模型的距离,我们可以实现Cesium模型缩放效果。需要根据具体的应用场景选择合适的方式来控制模型缩放大小。 ### 回答3: Cesium是一种基于WebGL的开源地理信息系统,它提供了丰富的三维场景展现功能。在Cesium中,我们可以通过控制模型缩放来实现对三维场景的控制。下面是一些关于如何控制模型缩放的方法。 第一种方法是使用Cesium中的实体(Entity)对象。实体对象是一种用于表示三维场景中的物体的对象。我们可以在实体对象的构造函数中设置缩放因子(scale),来控制模型缩放比例。例如: ```javascript var entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), model : { uri : './model.gltf', scale: 2.0 } }); ``` 上述代码中,我们创建了一个实体对象,设置了实体对象的位置和模型路径,同时设置了缩放因子(scale)为2.0,表示将模型放大2倍。 第二种方法是使用Cesium中的模型(Model)对象模型对象是一种可以加载3D模型对象。我们可以在模型对象的构造函数中设置缩放因子(scale),来控制模型缩放比例。例如: ```javascript var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({ url : './model.gltf', scale : 2.0 })); ``` 上述代码中,我们创建了一个模型对象,设置了模型路径和缩放因子(scale)为2.0,表示将模型放大2倍。然后将模型添加到场景中。 需要注意的是,缩放因子(scale)的取值范围为正数,表示缩放比例,当缩放因子为1.0时表示原始大小。 上述两种方法都是通过设置缩放因子(scale)来控制模型缩放比例。在实际使用中,我们可以根据需要选择使用哪种方法来进行模型缩放控制。同时,我们还可以通过旋转模型或平移模型等操作,来实现更加丰富的三维场景展现效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俊24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值