Minecraftでアニメーションシステムがどのように機能するかを知りたいです。すべてのMobがゲームにハードコーディングされているように感じます。ノッチは本当にそこに座って、すべてのアニメーションボーンのマトリックスを手で作成しましたか?
私は楽しみのためにゲームを作り直すのが好きなので、彼がこれをどのようにしたか知りたいです。また、彼が本当にそれらをハードコーディングした場合...より良い方法はありますか?
Minecraftでアニメーションシステムがどのように機能するかを知りたいです。すべてのMobがゲームにハードコーディングされているように感じます。ノッチは本当にそこに座って、すべてのアニメーションボーンのマトリックスを手で作成しましたか?
私は楽しみのためにゲームを作り直すのが好きなので、彼がこれをどのようにしたか知りたいです。また、彼が本当にそれらをハードコーディングした場合...より良い方法はありますか?
回答:
他の人が言ったように、はい、モデルとアニメーションはハードコードされています。これがどのように行われたかを見たい場合は、Minecraft Coder Pack wikiにアクセスしてください。
パッケージは、MOD作成者がMinecraftクラスを逆コンパイル、変更、再コンパイルできるように作成されました。手順は、パッケージに付属のreadmeファイルに含まれています。パッケージには、ゲームとサーバーを逆コンパイル、再コンパイル、再難読化するスクリプトが含まれています。
見たいクラスは、ModelBase、ModelBiped、およびModelRendererです。
ModelBipedには、ヒューマノイドアニメーションを実行する次の関数が含まれています。
public void render(Entity entity, float time, float f1, ...)
{
setRotationAngles(time, f1, ...);
...
}
public void setRotationAngles(float time, float f1, ...)
{
...
bipedRightArm.rotateAngleX = MathHelper.cos(time * 0.6662F + 3.141593F) * 2.0F * f1 * 0.5F;
bipedLeftArm.rotateAngleX = MathHelper.cos(time * 0.6662F) * 2.0F * f1 * 0.5F;
...
}
腕の揺れは単純に余弦関数です。右腕はPIによってオフセットされ、反対方向にスイングします。
それがあなたの質問に答えることを願っています=)
Minecraftを実際に変更する方法の詳細については、次の質問をご覧ください。
Minecraftのモデルはハードコーディングされています。ブロック階層の概念はありません(ブロックのリストのみ)。これは、アニメーションが手続き的に(非常に基本的な方法で)行われるか、補間された値がハードコードされることを意味します。
TechneやFMCModelerのようなMinecraftモデル用のいくつかのエディターがあり、MOD用のMinecraftモデルコードをインポート/エクスポートできますが、おそらくモデルごとに異なる方法で処理されるため、アニメーションはサポートしていません。
FMCModelerで生成された簡単なサンプルを次に示します。
//variables init:
public ModelRenderer box;
//constructor:
box = new ModelRenderer(0, 0);
box.addBox(0F, 0F, 0F, 16, 16, 16);
//render:
box.render(f5);
より良い方法は、ブロック階層の概念を備えた完全なブロックベースのモデラーを構築し、キーフレームと補間でモデルをアニメーション化することです。
私は現在、それを行うマルチプレイヤーゲーム構築ツールを構築しています(特にhttp://craftstud.io/)。すでに複雑な静的テクスチャモデルの構築が可能になり、さらに多くの機能が準備中です。
CraftStudioで作成された複雑なモデルを次に示します。ご覧のとおり、ブロックは右側のツリーに配置されています。
各ブロックは、次のデータを使用してネットワーク経由でディスクにシリアル化されます。
キーとしてアニメーション名、値としてキーフレームのリストを持つマップを保存することにより、アニメーションサポートを追加する予定です。各キーフレームは、アニメーション化するブロックと値に関連付けられます。キーフレーム間で、値を補間する必要があります(位置の場合は線形に、角度の場合は球状に、lerpとslerpを検索します)。