<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F16.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E5%9B%9B%EF%BC%89_-_%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E6%A8%A1%E5%9E%8B</id>
	<title>用户:MashKJo/1.12.2模组开发教程/16.高级物品（四） - 高级物品模型 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mcbbs.wiki/index.php?action=history&amp;feed=atom&amp;title=%E7%94%A8%E6%88%B7%3AMashKJo%2F1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B%2F16.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E5%9B%9B%EF%BC%89_-_%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E6%A8%A1%E5%9E%8B"/>
	<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/16.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E5%9B%9B%EF%BC%89_-_%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E6%A8%A1%E5%9E%8B&amp;action=history"/>
	<updated>2026-05-06T06:07:30Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.3</generator>
	<entry>
		<id>https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/16.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E5%9B%9B%EF%BC%89_-_%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E6%A8%A1%E5%9E%8B&amp;diff=55040&amp;oldid=prev</id>
		<title>MashKJo：​创建页面，内容为“== 物品模型在不同场合下的渲染变换 == 这里的“各种场合”包括：GUI内、被玩家以不同视角拿在手上时、在物品展示框中时等情况。这属于原版的内容，参见：[https://zh.minecraft.wiki/w/%E6%A8%A1%E5%9E%8B#%E6%B8%B2%E6%9F%93%E5%8F%98%E6%8D%A2 模型#渲染变换 - 中文 Minecraft Wiki]。  小提示：直接手写这些渲染变换的参数很不直观，推荐读者使用Blockbench进行这些参数的可…”</title>
		<link rel="alternate" type="text/html" href="https://mcbbs.wiki/index.php?title=%E7%94%A8%E6%88%B7:MashKJo/1.12.2%E6%A8%A1%E7%BB%84%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/16.%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%EF%BC%88%E5%9B%9B%EF%BC%89_-_%E9%AB%98%E7%BA%A7%E7%89%A9%E5%93%81%E6%A8%A1%E5%9E%8B&amp;diff=55040&amp;oldid=prev"/>
		<updated>2025-01-20T15:37:37Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“== 物品模型在不同场合下的渲染变换 == 这里的“各种场合”包括：GUI内、被玩家以不同视角拿在手上时、在物品展示框中时等情况。这属于原版的内容，参见：[https://zh.minecraft.wiki/w/%E6%A8%A1%E5%9E%8B#%E6%B8%B2%E6%9F%93%E5%8F%98%E6%8D%A2 模型#渲染变换 - 中文 Minecraft Wiki]。  小提示：直接手写这些渲染变换的参数很不直观，推荐读者使用Blockbench进行这些参数的可…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 物品模型在不同场合下的渲染变换 ==&lt;br /&gt;
这里的“各种场合”包括：GUI内、被玩家以不同视角拿在手上时、在物品展示框中时等情况。这属于原版的内容，参见：[https://zh.minecraft.wiki/w/%E6%A8%A1%E5%9E%8B#%E6%B8%B2%E6%9F%93%E5%8F%98%E6%8D%A2 模型#渲染变换 - 中文 Minecraft Wiki]。&lt;br /&gt;
&lt;br /&gt;
小提示：直接手写这些渲染变换的参数很不直观，推荐读者使用Blockbench进行这些参数的可视化调控。&lt;br /&gt;
&lt;br /&gt;
== 物品属性覆盖（Item Property Override） ==&lt;br /&gt;
这是一个允许我们根据当前的ItemStack所持有的信息来指定不同的物品模型的机制。&lt;br /&gt;
&lt;br /&gt;
首先我们需要一个IItemPropertyGetter：&lt;br /&gt;
 public static final IItemPropertyGetter MY_ITEM_PROPERTY_GETTER = new IItemPropertyGetter(){&lt;br /&gt;
    @SideOnly(Side.CLIENT)&lt;br /&gt;
    @Override&lt;br /&gt;
    public float apply(ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entityLiving){&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
这里用的是匿名内部类而非lambda——因为内部那个方法需要用@SideOnly(Side.CLIENT)修饰。apply方法的形参列表很丰富，你大可以好好利用这些形参，最后输出一个float值。&lt;br /&gt;
&lt;br /&gt;
紧接着你就需要告知：你的某一物品有这一IItemPropertyGetter，一般是在该物品类的构造器中这样写：&lt;br /&gt;
 this.addPropertyOverride(new ResourceLocation(...), MY_ITEM_PROPERTY_GETTER);&lt;br /&gt;
&lt;br /&gt;
然后我们就可以把这个IItemPropertyGetter体现在该物品的模型json文件中了：&lt;br /&gt;
 {&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;quot;overrides&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;predicate&amp;quot;: {&lt;br /&gt;
                &amp;lt;your property getter&amp;#039;s resource location name&amp;gt;: &amp;lt;a float value&amp;gt;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;model&amp;quot;: &amp;quot;...&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        ...&lt;br /&gt;
        ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
这样，当该Property等于特定的值时，物品模型会被替换为overrides中的相应的model的。注意：这个数值是精确匹配的。&lt;br /&gt;
&lt;br /&gt;
原版内建了4种IItemPropertyGetter：DAMAGED_GETTER（ItemStack是否受到损害）、DAMAGE_GETTER（ItemStack当前的损害程度）、LEFTHANDED_GETTER（持有该ItemStack的生物实体的主手是否为左手）、COOLDOWN_GETTER（该ItemStack对应的Item的冷却进度），且Item类的构造方法中，addPropertyOverride了后两种IItemPropertyGetter，也就是说理论上所有物品都有这两种IItemPropertyGetter。&lt;br /&gt;
&lt;br /&gt;
== ItemMeshDefinition ==&lt;br /&gt;
Property Override并不是所有时候都好用的——有些时候它甚至有些画蛇添足，硬是要把条件分支转化为不同的float值，太过麻烦。如果在你的需求中，物品模型的变化并不依赖于当前的World和持有该ItemStack的生物实体，我们就可以考虑使用ItemMeshDefinition。它是一个原版的函数式接口，唯一的方法为：&amp;lt;code&amp;gt;ModelResourceLocation getModelLocation(ItemStack stack)&amp;lt;/code&amp;gt;。ItemMeshDefinition相比Property Override，更加直观好用——直接根据当前的ItemStack的信息指定ModelResourceLocation，而省去了Property Override的转化数据、写overrides json的过程。&lt;br /&gt;
&lt;br /&gt;
Forge提供了一个方法来设置我们自己的ItemMeshDefinition：&lt;br /&gt;
 ModelLoader.setCustomMeshDefinition(item, stack -&amp;gt; { ... } );&lt;br /&gt;
&lt;br /&gt;
但注意，&amp;#039;&amp;#039;&amp;#039;ItemMeshDefinition并不能用于动态地生成模型&amp;#039;&amp;#039;&amp;#039;。通过它所指定的模型仍然需要通过常规的声明模型的方式声明，一定能被穷尽，且Minecraft必须提前知道所有的可能的模型：&lt;br /&gt;
 ModelBakery.registerItemVariants(item, resourceLocation1, resourceLocation2...);&lt;/div&gt;</summary>
		<author><name>MashKJo</name></author>
	</entry>
</feed>