Skip to content

Bedrock 模型导入教程

laurel Lin edited this page Oct 22, 2024 · 1 revision

建模

  1. 使用BlockBench软件的 基岩版模型基岩版方块 进行建模(若需要使用动画,则须选择 基岩版模型) 。

导入

  1. 建模完成后,使用BlockBench软件的 导出 功能,将模型保存为 : 模型.geo.json纹理.png动画.animation.json

  2. 调整目录: 将 模型.geo.json 放入 namespace:models/ 目录或其子目录下。 将 纹理.png 放入 namespace:textures/目录或其子目录下。 将 动画.animation.json 放入 namespace:animations/ 目录或其子目录下。

  3. 编写 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
  1. 在blockstates.json中,只需要填入 4 中的json路径(路径也是从 namespace:models/ 开始的) 即可将模型作为某种方块的模型。

  2. 在代码中,使用 以下代码来读取一个文件中的模型(这里的路径也是指向 4 中的json文件)。(在5中,已经通过blockstates.json读入的模型不需要再被读取)

BedrockModelLoader.fromFile(modelLocation);
  1. 对于已经读入的模型,使用以下代码获取一个可应用动画的模型
BedrockModelLoader.getModel(modelLocation, renderType);
  1. 使用以下代码读取一个动画文件
AnimationFile.fromFile(animLocation);
  1. 一个动画文件中可能会包含多个动画,通过以下代码,获得具体的动画对象(小驼峰表示类实例):
animationFile.getAnimation(animName)
  1. 通过以下代码从动画对象获得对应的动画实例对象,这里的AnimModel是你将要应用动画的模型,int这里是帧率,即动画每秒将解算成多少帧:
animation.getInstance(model, frameRate);
  1. 动画实例对象可以直接控制模型的动画状态,通过输入秒数(sec参数),直接获得模型的对应状态:
animationInstance.applyAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float sec);
  1. 这里推荐使用 AnimateTicker 来控制动画进度。它会自动地把 tick 转换为 sec
AnimateTicker ticker = new AnimateTicker(AnimationInstance anim, TickerType type, float playSpeed);
  • anim 是将要应用的动画实例对象
  • tickerType 是 ticker 将要挂靠的事件类型,有 RENDERLOGICAL 两种,一般情况下使用 RENDER
  • playSpeed 是动画播放速度,是一个百分数,当值为 100 时,动画原速播放,当值小于 0 时,动画播放将会反向。
  1. 以下是一个集合方法,通过它可以跳过前面的步骤直接获得AnimateTicker:
AnimateTicker.getTickerInstance(
            ResourceLocation modelLoc, ResourceLocation animFile,
            RenderType type, String animName, TickerType ticker,
            int frameRate, float playSpeed);
  1. 获取ticker对象后,使用其以下方法应用动画并渲染模型:
    animateTicker.tickAndRender(PoseStack pose, MultiBufferSource source, int light, int overlay, float partial);

Ticker具体使用教程

Ticker 是一类用于将模型按照 MC 刻(tick) 运行的动画驱动工具。根据可驱动的动画的数量可以分为两种。

  • AnimateTicker: 支持驱动单个动画。
  • MultiAnimateTicker: 支持驱动数个动画。

TickerType 是用以控制 Ticker 侦听哪一种 tick 事件的枚举。就目前而言,它有两种工作模式:

  • TickerType.RENDER 侦听 GUI 渲染帧 (render tick)。
  • TickerType.LOGICAL 侦听世界物理帧 (world tick)。

playSpeed 是用以控制 Ticker 播放速度的一个百分位数,当其值为 100 时,动画原速播放,其值为 200 时,动画以二倍速播放。

AnimateTicker 使用

  1. 声明
	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
  1. 时轴控制 时轴控制是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 使用

  1. 声明
	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
  1. 时轴控制 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

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点。