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

183 lines
9.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 预设变换
## 坐标属性
![1625726982736](./images/1625726982736.png)
如上图所示,预设属性中坐标变换有三类属性:位置,旋转,缩放。此三类属性都有(x,y,z)轴3个值。
**位置**: 设置预设在父节点坐标系的位置偏移,如果预设是根节点,则设置预设在世界坐标系的位置。
**旋转**: 设置预设在父节点坐标系的旋转欧拉角度。如果预设是根节点,则设置预设在世界坐标系下的旋转欧拉角。
**缩放**: 设置预设在父节点坐标系的缩放系数。如果预设是根节点,则设置预设在世界坐标系下的缩放系数。
**坐标的属性变换顺序**
![](./images/1625730517868.png)![1625730585491](./images/1625730585491.png)
![1625733206438](./images/1625733206438.png)![1625733280166](./images/1625733280166.png)
如上参数所示,预设是按照当前所在坐标系,先进行**缩放**变换,然后进行**旋转**变换,然后进行位置**平移**变换。
**旋转变换**的顺序是先按**Z轴**旋转,再按**X轴**旋转,再按**Y轴**旋转。
各变换参考的坐标系都是当前所在父节点的坐标系(根节点则是世界坐标系),而不是自身的缩放和旋转变换后的坐标系。
## 预设变换操作
**鼠标拾取和选中**
![1625735741835](./images/1625735741835.png)![1625735833546](./images/1625735833546.png)![1625736191024](./images/1625736191024.png)
鼠标左键**单击**地图**场景中**的特效,生物,素材等预设,即可**选中**当前预设,进行相关操作。
鼠标左键**单击关卡编辑器**里的**舞台界面**中的预设列表项,或者**预设编辑器**里**层级界面**中的预设列表,也可以选中对应预设。
鼠标左键**双击**预设列表项则会**快速定位**到对应预设的位置。
在**预设编辑器**中,因为**根节点**没有坐标变换相关属性,因此**不能选中操作根节点**。
![1625745022676](./images/1625745022676.png)![1625745091606](./images/1625745091606.png)
如生物预设,因为不能挂载在其他预设节点下面,因此不能在预设编辑器点击选中和操作。
![1625745206164](./images/1625745206164.png)![1625745231339](./images/1625745231339.png)
特效预设可以挂载在预设节点之下,因此可以在预设编辑器下点击选中进行操作。
**切换操作模式**
![1625736614607](./images/1625736721582.png)![1625736938598](./images/1625736938598.png)![1625736968462](./images/1625736968462.png)
在当前选中预设时,按键盘数字键"**1**" "**2**" "**3**" 可以切换操作模式为**位置平移****旋转**和**缩放**操作模式。
![](./images/1625737797422.png) ![](./images/1625737920101.png)
**平移和缩放操作**:点击对应操作坐标轴,按住鼠标左键,移动鼠标方向,即可操作移动或拉伸预设。
![](./images/1625737856125.png)
**旋转操作**:点击对应操作坐标轴,按住鼠标左键,向**右下**移动**增加**旋转角度,向**左上**移动**减少**旋转角度。
注意,**旋转的顺序是ZXY轴**,因此旋转操作最终效果**由ZXY旋转角度的顺序**决定。
## 预设变换限制
预设操作因为MC的规则限制
**素材预设变换限制:**
位置限制:素材方块对应坐标需为整数,对应非整数部分,舍去小数部分处理。
旋转限制素材方块只能旋转90度的倍数角度非90度倍数部分忽略对于负角度按对应正方向角度处理。
如旋转300度对应素材方块旋转270度。而旋转-40度对应旋转320度对应素材旋转270度。
同时一些方块如床等也有旋转方向的限制。
缩放现在: 素材缩放效果不会小于1个方块。
素材缩放最大值100同时素材方块尺寸不能多于一千万个方块。素材尺寸太大会影响操作性能。
素材缩放尺寸的系数为负值,则当做正值处理。
**生物预设变换限制:**
旋转限制生物旋转只支持Y轴X和Z轴旋转只忽略。
缩放现在: 生物缩放最小值为0.1,同时缩放效果不会小于1个方块。
素材缩放最大值100同时素材方块尺寸不能多于一千万个方块。素材尺寸太大会影响操作性能。
特效变换限制:
旋转限制:序列帧特效的旋转同时会受到**始终面向相机**的属性影响。
粒子特效的旋转同时会受到**特效方向**以及**粒子朝向模式**的影响。
![](./images/1625748565709.png)
![](./images/1625748639428.png) ![](./images/1625748680515.png)
## 预设变换API
![1625813374207](./images/1625813374207.png)
**变换更新间隔(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(缩放)属性值。可用来实现其在世界坐标系下如按速度旋转或者移动的逻辑。