This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,150 @@
---
front: 进阶
time: 15分钟
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 模型模板下载
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI-beta/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试服测试
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取

View File

@@ -0,0 +1,159 @@
---
front: https://nie.res.netease.com/r/pic/20220408/fd58eff7-ab4c-4f98-94b5-87912c6e8e4d.png
hard: 入门
time: 15分钟
selection: true
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 资源提供
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者
- 请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
- 手机端则可在开平下载**更新至3.5测试端**,在邮件**领取测试用4D皮肤**测试模组与4D皮肤的兼容性
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试皮肤
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取
**注意:** 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效

BIN
docs/mcguide/16-美术/6-模型和动作/resources/0_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
docs/mcguide/16-美术/6-模型和动作/resources/0_2.jpg (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,473 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.standard_steve",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 4,
"visible_bounds_offset": [0, 1, 0]
},
"bones": [
{
"name": "root",
"pivot": [0, 0, 0]
},
{
"name": "waist",
"parent": "root",
"pivot": [0, 12, 0]
},
{
"name": "body",
"parent": "waist",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 16, -2],
"size": [8, 8, 4],
"uv": {
"north": {"uv": [20, 20], "uv_size": [8, 8]},
"east": {"uv": [16, 20], "uv_size": [4, 8]},
"south": {"uv": [32, 20], "uv_size": [8, 8]},
"west": {"uv": [28, 20], "uv_size": [4, 8]},
"up": {"uv": [20, 16], "uv_size": [8, 4]},
"down": {"uv": [28, 20], "uv_size": [8, -4]}
}
}
]
},
{
"name": "head",
"parent": "body",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 24, -4],
"size": [8, 8, 8],
"uv": {
"north": {"uv": [8, 8], "uv_size": [8, 8]},
"east": {"uv": [0, 8], "uv_size": [8, 8]},
"south": {"uv": [24, 8], "uv_size": [8, 8]},
"west": {"uv": [16, 8], "uv_size": [8, 8]},
"up": {"uv": [8, 0], "uv_size": [8, 8]},
"down": {"uv": [16, 8], "uv_size": [8, -8]}
}
}
]
},
{
"name": "hat",
"parent": "head",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 24, -4],
"size": [8, 8, 8],
"inflate": 0.25,
"uv": {
"north": {"uv": [40, 8], "uv_size": [8, 8]},
"east": {"uv": [32, 8], "uv_size": [8, 8]},
"south": {"uv": [56, 8], "uv_size": [8, 8]},
"west": {"uv": [48, 8], "uv_size": [8, 8]},
"up": {"uv": [40, 0], "uv_size": [8, 8]},
"down": {"uv": [48, 8], "uv_size": [8, -8]}
}
}
]
},
{
"name": "cape",
"parent": "body",
"pivot": [0, 24, 3]
},
{
"name": "leftArm",
"parent": "body",
"pivot": [5, 22, 0],
"cubes": [
{
"origin": [4, 18, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [36, 52], "uv_size": [4, 6]},
"east": {"uv": [32, 52], "uv_size": [4, 6]},
"south": {"uv": [44, 52], "uv_size": [4, 6]},
"west": {"uv": [40, 52], "uv_size": [4, 6]},
"up": {"uv": [36, 48], "uv_size": [4, 4]},
"down": {"uv": [40, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftArmDown",
"parent": "leftArm",
"pivot": [5, 18, 0],
"cubes": [
{
"origin": [4, 12, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [36, 58], "uv_size": [4, 6]},
"east": {"uv": [32, 58], "uv_size": [4, 6]},
"south": {"uv": [44, 58], "uv_size": [4, 6]},
"west": {"uv": [40, 58], "uv_size": [4, 6]},
"up": {"uv": [40, 48], "uv_size": [4, 4]},
"down": {"uv": [40, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftSleeveDown",
"parent": "leftArmDown",
"pivot": [5, 18.25, 0],
"cubes": [
{
"origin": [4, 12, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [52, 58], "uv_size": [4, 6]},
"east": {"uv": [48, 58], "uv_size": [4, 6]},
"south": {"uv": [60, 58], "uv_size": [4, 6]},
"west": {"uv": [56, 58], "uv_size": [4, 6]},
"up": {"uv": [56, 48], "uv_size": [4, 4]},
"down": {"uv": [56, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftItem",
"parent": "leftArmDown",
"pivot": [6, 15, 1]
},
{
"name": "leftSleeve",
"parent": "leftArm",
"pivot": [5, 22, 0],
"cubes": [
{
"origin": [4, 18, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [52, 52], "uv_size": [4, 6]},
"east": {"uv": [48, 52], "uv_size": [4, 6]},
"south": {"uv": [60, 52], "uv_size": [4, 6]},
"west": {"uv": [56, 52], "uv_size": [4, 6]},
"up": {"uv": [52, 48], "uv_size": [4, 4]},
"down": {"uv": [56, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "rightArm",
"parent": "body",
"pivot": [-5, 22, 0],
"cubes": [
{
"origin": [-8, 18, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [40, 52], "uv_size": [-4, 6]},
"east": {"uv": [44, 52], "uv_size": [-4, 6]},
"south": {"uv": [48, 52], "uv_size": [-4, 6]},
"west": {"uv": [36, 52], "uv_size": [-4, 6]},
"up": {"uv": [40, 48], "uv_size": [-4, 4]},
"down": {"uv": [44, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightArmDown",
"parent": "rightArm",
"pivot": [-5, 18, 0],
"cubes": [
{
"origin": [-8, 12, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [40, 58], "uv_size": [-4, 6]},
"east": {"uv": [44, 58], "uv_size": [-4, 6]},
"south": {"uv": [48, 58], "uv_size": [-4, 6]},
"west": {"uv": [36, 58], "uv_size": [-4, 6]},
"up": {"uv": [44, 48], "uv_size": [-4, 4]},
"down": {"uv": [44, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightISleeveDown",
"parent": "rightArmDown",
"pivot": [-5, 18.25, 0],
"cubes": [
{
"origin": [-8, 12, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [48, 42], "uv_size": [-4, 6]},
"east": {"uv": [52, 42], "uv_size": [-4, 6]},
"south": {"uv": [56, 42], "uv_size": [-4, 6]},
"west": {"uv": [44, 42], "uv_size": [-4, 6]},
"up": {"uv": [52, 32], "uv_size": [-4, 4]},
"down": {"uv": [52, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightItem",
"parent": "rightArmDown",
"pivot": [-6, 15, 1],
"locators": {
"lead_hold": [-6, 15, 1]
}
},
{
"name": "rightSleeve",
"parent": "rightArm",
"pivot": [-5, 22, 0],
"cubes": [
{
"origin": [-8, 18, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [48, 36], "uv_size": [-4, 6]},
"east": {"uv": [52, 36], "uv_size": [-4, 6]},
"south": {"uv": [56, 36], "uv_size": [-4, 6]},
"west": {"uv": [44, 36], "uv_size": [-4, 6]},
"up": {"uv": [48, 32], "uv_size": [-4, 4]},
"down": {"uv": [52, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "jacket",
"parent": "body",
"pivot": [0, 24, 0],
"cubes": [
{
"origin": [-4, 16, -2],
"size": [8, 8, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [20, 36], "uv_size": [8, 8]},
"east": {"uv": [16, 36], "uv_size": [4, 8]},
"south": {"uv": [32, 36], "uv_size": [8, 8]},
"west": {"uv": [28, 36], "uv_size": [4, 8]},
"up": {"uv": [20, 32], "uv_size": [8, 4]},
"down": {"uv": [28, 36], "uv_size": [8, -4]}
}
}
]
},
{
"name": "bodyDown",
"parent": "waist",
"pivot": [0, 16, 0],
"cubes": [
{
"origin": [-4, 12, -2],
"size": [8, 4, 4],
"uv": {
"north": {"uv": [20, 28], "uv_size": [8, 4]},
"east": {"uv": [16, 28], "uv_size": [4, 4]},
"south": {"uv": [32, 28], "uv_size": [8, 4]},
"west": {"uv": [28, 28], "uv_size": [4, 4]},
"up": {"uv": [28, 16], "uv_size": [8, 4]},
"down": {"uv": [28, 20], "uv_size": [8, -4]}
}
}
]
},
{
"name": "jacketDown",
"parent": "bodyDown",
"pivot": [0, 16.25, 0],
"cubes": [
{
"origin": [-4, 12, -2],
"size": [8, 4, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [20, 44], "uv_size": [8, 4]},
"east": {"uv": [16, 44], "uv_size": [4, 4]},
"south": {"uv": [32, 44], "uv_size": [8, 4]},
"west": {"uv": [28, 44], "uv_size": [4, 4]},
"up": {"uv": [0, 4], "uv_size": [8, 4]},
"down": {"uv": [0, 4], "uv_size": [8, -4]}
}
}
]
},
{
"name": "leftLeg",
"parent": "root",
"pivot": [1.9, 12, 0],
"cubes": [
{
"origin": [-0.1, 6, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [20, 52], "uv_size": [4, 6]},
"east": {"uv": [16, 52], "uv_size": [4, 6]},
"south": {"uv": [28, 52], "uv_size": [4, 6]},
"west": {"uv": [24, 52], "uv_size": [4, 6]},
"up": {"uv": [20, 48], "uv_size": [4, 4]},
"down": {"uv": [24, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftPants",
"parent": "leftLeg",
"pivot": [1.9, 12, 0],
"cubes": [
{
"origin": [-0.1, 6, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [4, 52], "uv_size": [4, 6]},
"east": {"uv": [0, 52], "uv_size": [4, 6]},
"south": {"uv": [12, 52], "uv_size": [4, 6]},
"west": {"uv": [8, 52], "uv_size": [4, 6]},
"up": {"uv": [4, 48], "uv_size": [4, 4]},
"down": {"uv": [8, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftLegDown",
"parent": "leftLeg",
"pivot": [1.9, 6, 0],
"cubes": [
{
"origin": [-0.1, 0, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [20, 58], "uv_size": [4, 6]},
"east": {"uv": [16, 58], "uv_size": [4, 6]},
"south": {"uv": [28, 58], "uv_size": [4, 6]},
"west": {"uv": [24, 58], "uv_size": [4, 6]},
"up": {"uv": [24, 48], "uv_size": [4, 4]},
"down": {"uv": [24, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "leftPantsDown",
"parent": "leftLegDown",
"pivot": [1.9, 6.25, 0],
"cubes": [
{
"origin": [-0.1, 0, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [4, 58], "uv_size": [4, 6]},
"east": {"uv": [0, 58], "uv_size": [4, 6]},
"south": {"uv": [12, 58], "uv_size": [4, 6]},
"west": {"uv": [8, 58], "uv_size": [4, 6]},
"up": {"uv": [8, 48], "uv_size": [4, 4]},
"down": {"uv": [8, 52], "uv_size": [4, -4]}
}
}
]
},
{
"name": "rightLeg",
"parent": "root",
"pivot": [-1.9, 12, 0],
"cubes": [
{
"origin": [-3.9, 6, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [24, 52], "uv_size": [-4, 6]},
"east": {"uv": [28, 52], "uv_size": [-4, 6]},
"south": {"uv": [32, 52], "uv_size": [-4, 6]},
"west": {"uv": [20, 52], "uv_size": [-4, 6]},
"up": {"uv": [24, 48], "uv_size": [-4, 4]},
"down": {"uv": [28, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightPants",
"parent": "rightLeg",
"pivot": [-1.9, 12, 0],
"cubes": [
{
"origin": [-3.9, 6, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [8, 36], "uv_size": [-4, 6]},
"east": {"uv": [12, 36], "uv_size": [-4, 6]},
"south": {"uv": [16, 36], "uv_size": [-4, 6]},
"west": {"uv": [4, 36], "uv_size": [-4, 6]},
"up": {"uv": [8, 32], "uv_size": [-4, 4]},
"down": {"uv": [12, 36], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightLegDown",
"parent": "rightLeg",
"pivot": [-1.9, 6, 0],
"cubes": [
{
"origin": [-3.9, 0, -2],
"size": [4, 6, 4],
"uv": {
"north": {"uv": [24, 58], "uv_size": [-4, 6]},
"east": {"uv": [28, 58], "uv_size": [-4, 6]},
"south": {"uv": [32, 58], "uv_size": [-4, 6]},
"west": {"uv": [20, 58], "uv_size": [-4, 6]},
"up": {"uv": [28, 48], "uv_size": [-4, 4]},
"down": {"uv": [28, 52], "uv_size": [-4, -4]}
}
}
]
},
{
"name": "rightPantsDown",
"parent": "rightLegDown",
"pivot": [-1.9, 6.25, 0],
"cubes": [
{
"origin": [-3.9, 0, -2],
"size": [4, 6, 4],
"inflate": 0.25,
"uv": {
"north": {"uv": [8, 42], "uv_size": [-4, 6]},
"east": {"uv": [12, 42], "uv_size": [-4, 6]},
"south": {"uv": [16, 42], "uv_size": [-4, 6]},
"west": {"uv": [4, 42], "uv_size": [-4, 6]},
"up": {"uv": [12, 32], "uv_size": [-4, 4]},
"down": {"uv": [12, 36], "uv_size": [-4, -4]}
}
}
]
}
]
}
]
}

Binary file not shown.

View File

@@ -0,0 +1,157 @@
---
front: 进阶
time: 15分钟
---
# 模型规范指南
## 前言
在当前模组开发实践中,部分开发者所采用的 Blockbench模型与官方标准模型存在差异。
因此换了BlockBench模型的Mod会导致官方皮肤时出现贴图错位、模型消失等兼容性问题影响了玩家的视觉体验。
现已开放官方模型规范开发者们请参考并遵循。新作品通过规范指南进行UV、动画等的制作。已有作品则可以通过SDK判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验判断是否需要修改Blockbench模型确保模组能够与官方皮肤良好配合为玩家带来更加一致、流畅的游戏体验
## 资源提供
当前官方提供的“多关节”结构Blockbench模型已经能满足大部分的模组开发者
- 请开发者下载[官方规范player模型文件](https://g79.gdl.netease.com/official_steve_model.zip)
- 手机端则可在开平下载**更新至3.5测试端**,在邮件**领取测试用4D皮肤**测试模组与4D皮肤的兼容性
## 兼容分类
根据模组与官方皮肤的兼容程度,分为:
1. **完全兼容**未更换bb模型。表现为皮肤模型贴图以及穿戴外观模组动画等表现都正常。
2. **部分兼容**更换了bb模型但按照官方规范制作。表现为皮肤挂件以及穿戴外观正常但是模型样式改变及贴图错乱。
3. **不兼容**更换了bb模型且未按照官方规范制作。表现为模型样式改变皮肤挂件错乱穿戴外观错乱以及动作异常。
## 规范概要
1. 玩法模组非必要不改bb模型如需修改bb模型需遵循动作优化类模组规范
2. 动作优化类模组:
- 人形角色非必要不修改bb结构即无需使用AddPlayerGeometry的Api
- 如需修改修改bb结构则应该按以下优先级进行美术制作
- 不修改玩家模型为多关节
- **按规范**修改四肢为多关节模型但是不修改Body为多关节模型
- **按规范**砍四肢与body为多关节模型
- **按规范**命名骨骼/层级,但是玩家骨骼层级随意修改 *(极不推荐)*
3. SDK使用
- 开发者可以结合以下Mod SDK判断是否需要更换模型
- 建议穿戴史诗及以上多关节官方4d皮肤在模组对皮肤兼容度较差的前提下不进行玩家模型修改
- 其余情况开发者也可以使用接口判断更换模型的必要性
- [IsOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#isofficialskin) —— 获取玩家穿戴的皮肤是否为官方4d皮肤
- [IsHighLevelOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的官方4d皮肤
- [IsHighLevelMultiJointOfficialSkin](../../../mcdocs/1-ModAPI/接口/玩家/属性.md#ishighlevelmultijointofficialskin) —— 获取玩家穿戴的皮肤是否为史诗及以上的多关节官方4d皮肤
4. 动画制作人形角色必须修改bb模型的建议使用官方模型并用其进行动画制作
5. 其他:不建议直接修改 player.entity.json 和 player.render_controllers.json如果改了请务必在官方的规范下进行拓展
## 多关节美术制作参考
### 必要骨骼
1. 常规骨骼(常作为挂件的挂点):
- root, waist, body, leftArm, **leftArmDown**, rightArm, **rightArmDown**, head, **bodyDown**, leftLeg, **leftLegDown**, rightLeg, **rightLegDown**, rightLeg, cape
2. 会员盔甲挂点:
- hat, jacket, **jacketDown**, leftSleeve, leftSleeveDown, rightSleeve, **rightSleeveDown**, leftPants, **leftPantsDown**, rightPants, **rightPantsDown**
**【注意】**
* 共计26个骨骼开发者请不要随意删除
* 必要骨骼中加粗字体的骨骼为相比原版Steve新增的关节
### 骨骼层级一览
| 节点名称 | | 枢轴点 | 备注 |
|---------------------------|---|----------------| --- |
| root | | (0,0,0) | |
| —waist | | (0, 12, 0) | |
| ——body | | (0, 24, 0) | |
| ———head | | (0, 24, 0) | |
| —————hat | | (0, 24, 0) | |
| ———cape | | (0, 24, 3) | |
| ———leftArm | | (-5, 22, 0) | |
| **—————leftArmDown** | | (-5, 18, 0) | 新增必要骨骼 |
| **———————leftSleeveDown** | | (-5, 18.25, 0) | 新增盔甲骨骼 |
| ———————leftItem | | (-6, 15, 1) | |
| —————leftSleeve | | (-5, 22, 0) | |
| ———rightArm | | (5, 22, 0) | |
| **—————rightArmDown** | | (5, 18, 0) | 新增必要骨骼 |
| **———————rightSleeveDown** | | (5, 18.25, 0) | 新增盔甲骨骼 |
| ———————rightItem | | (6, 15, 1) | |
| —————rightSleeve | | (5, 22, 0) | |
| ———jacket | | (0, 24, 0) | |
| **——bodyDown** | | (0, 16, 0) | 新增必要骨骼 |
| **———jacketDown** | | (0, 16.25, 0) | 新增盔甲骨骼 |
| —leftLeg | | (-1.9, 12, 0) | |
| ——leftPants | | (-1.9, 12, 0) | |
| **——leftLegDown** | | (-1.9, 6, 0) | 新增必要骨骼 |
| **————leftPantsDown** | | (-1.9, 6.25, 0) | 新增盔甲骨骼 |
| —rightLeg | | (1.9, 12, 0) | |
| ——rightPants | | (1.9, 12, 0) | |
| **——rightLegDown** | | (1.9, 6, 0) | 新增必要骨骼 |
| **————rightPantsDown** | | (1.9, 6.25, 0) | 新增盔甲骨骼 |
**【注意】**
* 骨骼层级:影响官方动画兼容
* 骨骼命名:影响官方挂件兼容
* 枢轴点影响。比如body枢轴点24非16的原因是考虑原生鞘翅和胸甲的绑定位置
### 骨骼层级说明
* body 和 bodyDown 层级并列
* 新增的切分关节
- 5个骨骼节点`leftArmDown, rightArmDown, bodyDown, leftLegDown, rightLegDown `
- 5个骨骼节点`jacketDown, leftSleeveDown, rightSleeveDown, leftPantsDown, rightPantsDown`
### UV贴图制作
如下图所示需要按照Steve规范进行制作
![](./resources/0_1.png)
### 其余注意事项
1. 除盔甲骨骼以外其他骨骼下必须有同名cube。例如
![](./resources/0_2.jpg)
## 新增支持
### MOD SDK
为了方便开发者们在脚本中判断当前玩家皮肤状态,新增了三个接口和一个事件。
开发者可在事件当中判定**当前皮肤是否是官方,从而决定是否修改模型。**
也请开发者注意[**规范概要**](#规范概要)**非必要情况不修改模型。如需修改,也遵循照官方模型规范**
**【接口和事件】**
1. IsOfficialSkin 是否为官方皮肤
2. IsHighLevelOfficialSkin 是否为官方史诗级以上皮肤
3. IsHighLevelMultiJointOfficialSkin 是否为官方史诗级以上的多关节皮肤
4. UpdatePlayerSkinClient 更新模型皮肤事件
**【注意】**
上述三个接口在收到 Minecraft:EngineScripts:UpdatePlayerSkinClient 事件后进行调用。更多详细说明,见官网文档
使用示例
```python
# 这里以IsHighLevelMultiJointOfficialSkin为例
self.ListenForEvent('Minecraft', "EngineScripts", "UpdatePlayerSkinClient', self, self onUpdatePlayerSkinClient)
def onUpdatePlayerSkinClient(self,args):
import mod.client.extraClientApi as clientApi
comp = clientApi.GetEngineCompFactory().CreateGame(levelId)
comp.IsHighLevelMultiJointOfficialSkin(args['playerId']) # 返回bool为官方史诗级以上的多关节皮肤
```
### 测试皮肤
为方便开发者测试4D皮肤与模组本身的兼容性官方在开发者测试服提供了测试用4D皮肤可通过邮件领取
**注意:** 请各位开发者更新到3.5测试服3.4该测试皮肤不会生效

View File

@@ -394,14 +394,14 @@ uniform vec4 EXTRA_VECTOR2; // vec4(param2.y, ?, ?, ?) // 问号表示冗余 不
目前我们设置了多个可在自定义后处理中使用的shader宏变量他们包含了多种游戏中的环境参数。如下表所示。
| 宏变量名称 | 格式 | 包含参数 | 备注 |
| ------------------ | ------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 宏变量名称 | 格式 | 包含参数 | 备注 |
| ------------------ | ------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| WORLD_PARAMETERS | vec3(int, float, float) | 玩家所在维度id星星亮度环境光亮度 | 1. 玩家所在维度id。id=0(主世界)id=1(下界)id=2(末地)id>=3(自定义维度)。<br />2. 星星亮度。该值与<a href="./../../../mcdocs/1-ModAPI/接口/世界/渲染.html#GetStarBrightness">GetStarBrightness接口</a>所返回的值一致。<br />3. 环境光亮度。该值与<a href="./../../../mcdocs/1-ModAPI/接口/世界/渲染.html#GetAmbientBrightness">GetAmbientBrightness接口</a>所返回的值一致。 |
| TIME_PARAMETERS | vec2(float, float) | 自当天日出后流逝的游戏刻数,世界总共流逝的游戏刻数 | 1. 自当天日出后流逝的游戏刻数,与`/time query daytime`指令所得出值一致。<br />2. 世界总共流逝的游戏刻数,与`/time query worldtime`指令所得出的值一致。 |
| WEATHER_PARAMETERS | vec3(int, float, float) | 天气类型,降雨等级,打雷等级 | 1. 天气类型。值为0表示晴天值为1时表示下雨值为2时表示雷暴。<br />2. 降雨等级。目前世界的降雨强度,值范围为[0,1]。<br />3. 打雷等级。目前世界的打雷强度,值范围为[0,1]。 |
| CAMERA_POSITION | vec3(float, float, float) | 相机位置 | 玩家相机的位置。 |
| PLAYER_POSITION | vec3(float, float, float) | 玩家位置 | 玩家的世界位置。 |
| SKY_COLOR | vec3(float, float, float) | 天空颜色 | 天空盒的颜色。只有开启了精美天空选项时该值才有效否则该值为0。 |
| SKY_COLOR | vec3(float, float, float) | 天空颜色 | 天空盒的颜色。只有开启了精美天空选项时该值才有效否则该值为0。 |
以上宏变量均可在fragment shader或者vertex shader中使用。下面我们使用fragment shader作为示例

View File

@@ -378,13 +378,16 @@ mc里的特效实例有两种承载方式一种是在世界空间单独存在
动画是否循环播放如果设置为false则会在每个发射器的生命周期开始时重新播放动画。
- `size`
设置发射出来的骨骼模型的大小支持molang表达式。
- `ignore_lighting`
设置粒子模型是否受到环境光照影响与实体json中ignore_lighting作用相同。该值设置为true时粒子模型不受环境光影响始终保持默认亮度。
```json
"components": {
"netease:particle_appearance_FBX": {
"play_animation": "happy",
"loop": true,
"size": [1, 1, 1]
"size": [1, 1, 1],
"ignore_lighting": false
},
...
}