-
Notifications
You must be signed in to change notification settings - Fork 2
Bedrock 模型导入教程
- 使用BlockBench软件的
基岩版模型
或基岩版方块
进行建模(若需要使用动画,则须选择基岩版模型
) 。
-
建模完成后,使用BlockBench软件的
导出
功能,将模型保存为 :模型.geo.json
,纹理.png
,动画.animation.json
-
调整目录: 将
模型.geo.json
放入namespace:models/
目录或其子目录下。 将纹理.png
放入namespace:textures/
目录或其子目录下。 将动画.animation.json
放入namespace:animations/
目录或其子目录下。 -
编写 model loader json: 在
namespace:models/
下新建一个json
文件。示例如下:
{
"loader": "kasuga_lib:bedrock_model",
"model": "namespace:.../模型",
"texture": "namespace:.../纹理"
"render_type": "translucent",
"particle": "namespace:.../粒子纹理"
}
- loader: 模型加载器,保持和例子一致
- model: 模型路径,从
namespace:models/
开始。例:namespace:models/block/model.geo.json
应该写为:namespace:block/model
- texture: 纹理路径,从
namespace:textures/
开始,例子同上 - render_type: 渲染模式,若不填时,则为默认值
solid
- particle: 当该模型作为某种方块的模型,且该种方块被破坏时,破坏粒子效果的纹理路径,该路径从
namespace:textures/
开始,例子同上。 - 更多例子:
模型:
namespace:models/block/bedrock_model.geo.json ->
namespace:block/bedrock_model
纹理(包括粒子纹理):
namespace: textures/block/model_texture.png ->
namespace: block/model_texture
动画:
namespace: animations/model_anim.animation.json ->
namespace: model_anim
-
在blockstates.json中,只需要填入 4 中的json路径(路径也是从
namespace:models/
开始的) 即可将模型作为某种方块的模型。 -
在代码中,使用 以下代码来读取一个文件中的模型(这里的路径也是指向 4 中的json文件)。(在5中,已经通过blockstates.json读入的模型不需要再被读取)
BedrockModelLoader.fromFile(modelLocation);
- 对于已经读入的模型,使用以下代码获取一个可应用动画的模型
BedrockModelLoader.getModel(modelLocation, renderType);
- 使用以下代码读取一个动画文件
AnimationFile.fromFile(animLocation);
- 一个动画文件中可能会包含多个动画,通过以下代码,获得具体的动画对象(小驼峰表示类实例):
animationFile.getAnimation(animName)
- 通过以下代码从动画对象获得对应的动画实例对象,这里的AnimModel是你将要应用动画的模型,int这里是帧率,即动画每秒将解算成多少帧:
animation.getInstance(model, frameRate);
- 动画实例对象可以直接控制模型的动画状态,通过输入秒数(sec参数),直接获得模型的对应状态:
animationInstance.applyAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float sec);
- 这里推荐使用
AnimateTicker
来控制动画进度。它会自动地把tick
转换为sec
。
AnimateTicker ticker = new AnimateTicker(AnimationInstance anim, TickerType type, float playSpeed);
- anim 是将要应用的动画实例对象
- tickerType 是 ticker 将要挂靠的事件类型,有
RENDER
和LOGICAL
两种,一般情况下使用RENDER
。 - playSpeed 是动画播放速度,是一个百分数,当值为
100
时,动画原速播放,当值小于0
时,动画播放将会反向。
- 以下是一个集合方法,通过它可以跳过前面的步骤直接获得AnimateTicker:
AnimateTicker.getTickerInstance(
ResourceLocation modelLoc, ResourceLocation animFile,
RenderType type, String animName, TickerType ticker,
int frameRate, float playSpeed);
- 获取ticker对象后,使用其以下方法应用动画并渲染模型:
animateTicker.tickAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float partial);
Ticker
是一类用于将模型按照 MC 刻(tick) 运行的动画驱动工具。根据可驱动的动画的数量可以分为两种。
- AnimateTicker: 支持驱动单个动画。
- MultiAnimateTicker: 支持驱动数个动画。
TickerType
是用以控制 Ticker 侦听哪一种 tick
事件的枚举。就目前而言,它有两种工作模式:
-
TickerType.RENDER
侦听 GUI 渲染帧 (render tick)。 -
TickerType.LOGICAL
侦听世界物理帧 (world tick)。
playSpeed
是用以控制 Ticker 播放速度的一个百分位数,当其值为 100
时,动画原速播放,其值为 200
时,动画以二倍速播放。
- 声明
AniamteTicker ticker = public AnimateTicker(AnimationInstance instance, TickerType type, float playSpeed);
// 通过动画实例对象,动画刻模式,播放速度来构造一个 Ticker
或者
LazyRecomputable<AnimateTicker ticker> =
AnimateTicker.getTickerInstance(
ResourceLocation modelLoc, ResourceLocation animFile,
RenderType type, String animName, TickerType ticker,
int frameRate, float playSpeed);
// 通过模型位置,动画文件位置,渲染模式,动画名,
// 刻模式,动画帧率,播放速度来直接构造一个Ticker
- 时轴控制
时轴控制是Ticker的核心功能,在一般情况下,我们只需要时轴具有三个功能:
开始(继续)
,停止
,暂停
。 对于已有的ticker实例,可以使用以下代码来实现以上功能。
// 开始(继续)序列
ticker.start();
// 停止序列(在这之后调用start()会重新开始序列,相当于重置了)
ticker.stop();
// 暂停序列(在这之后调用start()会从当前位置继续序列)
ticker.pause();
// 设置动画的播放速度
ticker.setPlaySpeed(float speed);
// 为模型应用动画并渲染一个模型。
ticker.tickAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float partial);
- 声明
MultiAnimateTicker ticker = public MultiAnimate2. Ticker(float playSpeed, AnimateTicker.TickerType type, AnimationInstance... instance);
// 通过播放速度,动画帧模式,多个动画实例对象来构建Ticker
或
LazyRecomputable<MultiAnimateTicker> ticker =
getTickerInstance(
ResourceLocation modelLoc, RenderType type,
AnimateTicker.TickerType ticker, int frameRate,
float playSpeed, Pair<ResourceLocation, String>... anims);
// 通过模型地址,渲染模式,帧模式,帧率,
// 播放速度,多个(动画文件名:动画名)元组来构建Ticker
- 时轴控制 MultiAnimateTicker 支持分别控制其中每一条轴的动作,也支持一次控制所有轴的动作。
// 开始(继续)指定动画文件中指定动画名的动画
ticker.start(animFile, animName);
// 停止指定动画文件中指定动画名的动画
ticker.stop(animFile, animName);
// 暂停指定动画文件中指定动画名的动画
ticker.pause(animFile, animName);
// 设置指定动画的播放速度
ticker.setPlaySpeed(animFile, animName, float speed);
// 同时开始(继续)所有动画
ticker.startAll();
// 停止所有动画
ticker.stopAll();
// 暂停所有动画
ticker.pauseAll();
// 为模型应用动画并渲染一个模型。
ticker.tickAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float partial);
RenderType
是 Minecraft 进行渲染时对面和顶点进行一定处理的模式函数的集合。从 Minecraft 1.19.2 开始,对于任何一个模型,只需要在其模型定义 json 中加入 render_type
项,即可指定模型的渲染模式。
一般而言,用于模型渲染的 RenderType 有以下几个类型:
// 这是默认模式,即固体模式(透明面、半透明面变黑色,即丢弃alpha通道)
RenderType.SOLID("solid")
// 裁剪-多级渐远渲染模式
// (透明面保持透明,半透明面变黑色,远距离的纹理渲染会有提升(mipmap技术))
RenderType.CUTOUT_MIPPED("cutout_mipped")
// 裁剪模式(和cutout_mipped基本一致,但没有使用mipmap技术)
RenderType.CUTOUT("cutout")
// 透射模式,(透明面,半透明面都可以正常渲染,但在MC中这个渲染模式会导致渲染问题)
// Blaze3D 引擎对于这个模式处理得并不完美。(包含mipmap)
RenderType.TRANSLUCENT("translucent")
// 对于运动中的方块(活塞推出的方块),进行特化的透射模式。(包含mipmap)
RenderType.TRANSLUCENT_MOVING_BLOCK("translucent_moving_block")
// 也是一种投射模式,无视破坏状态。(包含mipmap)
RenderType.TRANSLUCENT_NO_CRUMBLING("translucent_no_crumbling")
Ksglib支持使用 json 文件进行基岩版模型和动画的预载(preload)。示例如下:
{
"animation": [
"namespace:block_anim/example_anim"
],
"model": [
"namespace:block/test/model"
]
}
将以上json字段放在 namespace:anim_model_preload.json
中,ksglib就会自动根据文件中的内容读取你写入的动画和模型。
具体到以上例子:
animation
项指代的是动画文件,这个字段代表了它会从
namespace:animation/block_anim/example_anim.animation.json
读取一个动画文件。
model
项指代模型文件,这个字段代表它会从
namespace:models/block/test/model.json
读取一个动画文件。
关于模型、动画位置的具体描述,请参看 导入 一节的 第4点。