Files
netease-modsdk-wiki/docs/mcguide/20-玩法开发/14-预设玩法编程/11-深入理解预设/4-预设变换.md
2025-03-18 14:46:12 +08:00

9.1 KiB
Raw Blame History

预设变换

坐标属性

1625726982736

如上图所示,预设属性中坐标变换有三类属性:位置,旋转,缩放。此三类属性都有(x,y,z)轴3个值。

位置: 设置预设在父节点坐标系的位置偏移,如果预设是根节点,则设置预设在世界坐标系的位置。

旋转: 设置预设在父节点坐标系的旋转欧拉角度。如果预设是根节点,则设置预设在世界坐标系下的旋转欧拉角。

缩放: 设置预设在父节点坐标系的缩放系数。如果预设是根节点,则设置预设在世界坐标系下的缩放系数。

坐标的属性变换顺序

1625730585491

16257332064381625733280166

如上参数所示,预设是按照当前所在坐标系,先进行缩放变换,然后进行旋转变换,然后进行位置平移变换。

旋转变换的顺序是先按Z轴旋转,再按X轴旋转,再按Y轴旋转。

各变换参考的坐标系都是当前所在父节点的坐标系(根节点则是世界坐标系),而不是自身的缩放和旋转变换后的坐标系。

预设变换操作

鼠标拾取和选中

162573574183516257358335461625736191024

鼠标左键单击地图场景中的特效,生物,素材等预设,即可选中当前预设,进行相关操作。

鼠标左键单击关卡编辑器里的舞台界面中的预设列表项,或者预设编辑器层级界面中的预设列表,也可以选中对应预设。

鼠标左键双击预设列表项则会快速定位到对应预设的位置。

预设编辑器中,因为根节点没有坐标变换相关属性,因此不能选中操作根节点

16257450226761625745091606

如生物预设,因为不能挂载在其他预设节点下面,因此不能在预设编辑器点击选中和操作。

16257452061641625745231339

特效预设可以挂载在预设节点之下,因此可以在预设编辑器下点击选中进行操作。

切换操作模式

162573661460716257369385981625736968462

在当前选中预设时,按键盘数字键"1" "2" "3" 可以切换操作模式为位置平移旋转缩放操作模式。

平移和缩放操作:点击对应操作坐标轴,按住鼠标左键,移动鼠标方向,即可操作移动或拉伸预设。

旋转操作:点击对应操作坐标轴,按住鼠标左键,向右下移动增加旋转角度,向左上移动减少旋转角度。

注意,旋转的顺序是ZXY轴,因此旋转操作最终效果由ZXY旋转角度的顺序决定。

预设变换限制

预设操作因为MC的规则限制

素材预设变换限制:

位置限制:素材方块对应坐标需为整数,对应非整数部分,舍去小数部分处理。

旋转限制素材方块只能旋转90度的倍数角度非90度倍数部分忽略对于负角度按对应正方向角度处理。

如旋转300度对应素材方块旋转270度。而旋转-40度对应旋转320度对应素材旋转270度。

同时一些方块如床等也有旋转方向的限制。

缩放现在: 素材缩放效果不会小于1个方块。

素材缩放最大值100同时素材方块尺寸不能多于一千万个方块。素材尺寸太大会影响操作性能。

素材缩放尺寸的系数为负值,则当做正值处理。

生物预设变换限制:

旋转限制生物旋转只支持Y轴X和Z轴旋转只忽略。

缩放现在: 生物缩放最小值为0.1,同时缩放效果不会小于1个方块。

素材缩放最大值100同时素材方块尺寸不能多于一千万个方块。素材尺寸太大会影响操作性能。

特效变换限制:

旋转限制:序列帧特效的旋转同时会受到始终面向相机的属性影响。

粒子特效的旋转同时会受到特效方向以及粒子朝向模式的影响。

预设变换API

1625813374207

变换更新间隔(updateTransformInterval):

用来控制游戏模式下预设及子节点的坐标变换(位置,旋转,缩放)更新间隔默认值为2。 我的世界逻辑帧率为每秒30帧建议对于非必要每帧更新的预设设置此值为合适值。

设置为0时,通过API设置预设的坐标变换都不会更新,因此其附加子节点也不会跟随更新。设置为1时,每帧更新。设置为2时则每两帧更新一次。

如游戏模式下生物预设挂载了一个特效预设为子节点。其中生物预设的变换更新间隔是0则通过API控制生物预设或者游戏内AI或者操作逻辑移动了生物对象其坐标变换也不会更新修改。因此其挂载的特效也不会有位置或者旋转的跟随变换。如果变换更新间隔为10则每10帧同步更新一次坐标变换同时也会更新其特效子节点的位置变换。

Transform:

Transform对象拥有pos(位置),rotation(旋转),scale(缩放)三个属性,都为**tulpe(x,y,z)**格式。

通过AddOffset,AddRotation,AddScale接口,传入对应tuple(x,y,z)参数可在Transform当前属性基础上修改Transform对应的pos,rotation,scale属性。

通过AddTransform接口,传入一个Transform对象可在Transform当前属性基础上同时修改Transform对应的pos,rotation,scale属性。

注意Transform对象本身并没有关联父节点数据同时也没关联其游戏内所在对象。

通过以上接口直接操作Transform的属性并不会对游戏内关联对象产生坐标变换的更新。

TransformObject:

TransformObject对象关联了游戏种的生物特效等象同时关联其父节点和子节点。通过此对象API可以控制游戏对象和其子节点的在游戏中的坐标变换。

TransformObject的坐标变换属性有两个坐标参考系一个是WorldTransform,对应的是世界坐标系下的坐标变换(位置,旋转,缩放)属性。一个是LocalTransform,对应的是其父节点局部坐标系下的坐标变换(位置,旋转,缩放属性。当一个预设节点是根节点时其WorldTransform和LocalTransform相等。

WorldTransform是由LocalTransform和父节点的局部坐标系转换得到因此以下接口修改WorldTransform会转换成修改对应的LocalTransform属性。而修改LocalTransform即同时修改了WorldTransform属性。

GetLocalTransform接口:

获取当前TransformObject的Transform对象。此Transform属性对应的是其在父节点的局部坐标系下的坐标转换属性。本身为根节点则为世界坐标系下坐标转换属性。

SetLocalTransform接口:

传入一个Transform对象设置其在父节点的局部坐标系下的坐标转换属性。本身为根节点则为世界坐标系下坐标转换属性。

获取和修改LocalTransform具体属性:

GetLocalPositionSetLocalPositionGetLocalRotationSetLocalRotationGetLocalScaleSetLocalScale分别获取和设置LocalTransform的pos(位置),rotation(旋转),scale(缩放)属性。

AddLocalOffsetAddLocalRotationAddLocalScale分别增加LocalTransform的pos(位置),rotation(旋转),scale(缩放)属性值。可用来实现其在父节点局部坐标系下如按速度旋转或者移动的逻辑。

GetWorldTransform接口:

获取当前TransformObject的在世界坐标系下坐标转换属性。当其为根节点时此值和GetLocalTransform一致。当其为子节点时则由其LocalTransform和父节点的WorldTransform变换得到。

SetWorldTransform接口:

传入一个Transform对象设置其在世界坐标系下转换属性。本身为根节点则和SetLocalTransform一致。其为子节点则根据父节点的WorldTransform转换得到对应LocalTransform。

获取和修改WorldTransform具体属性:

GetWorldPositionSetWorldPositionGetWorldRotationSetWorldRotationGetWorldScaleSetWorldScale分别获取和设置WorldTransform的pos(位置),rotation(旋转),scale(缩放)属性。

AddWorldOffsetAddWorldRotationAddWorldScale分别增加WorldTransform的pos(位置),rotation(旋转),scale(缩放)属性值。可用来实现其在世界坐标系下如按速度旋转或者移动的逻辑。