【解決済み】追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.315695)

【解決済み】追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

投稿記事by Kashiwagi_K » 2018年4月13日(金) 02:03

 こんにちは。
 1.10.2で勉強も兼ねてModを作ろうとしている者です。
 今回は自作Mobを追加しようと思いソースを書いたのですが、Mobの追加自体はできたものの、そのMobがダメージを受けている時以外は透明になってしまいます(ダメージを受けた時はモデルの形状もテクスチャもちゃんと表示されます。また、影は描画されているので、当たり前ですがポーション効果の透明化が乗っているわけではないようです)。
 他にも、エンティティモデルのクラスにModelBaseを継承させたところ棒立ちになってしまったので、ModelBipedを継承させてbipedHeadやbipedBodyなどに各パーツを対応させたのですが、用意したモデルがスケルトンやスティーブよりやや小さいせいか、頭や腕がスケルトンやスティーブの対応パーツがあるであろう位置に表示されて、胴体からサヨナラしてしまいます(アニメーションは再生されるのですが)。また、透明化してしまうのはこの前後でも変わりません。
 一応自分でも情報は探したのですが、そもそもエンティティを追加する類のチュートリアルがかなり稀有で、あったとしても既存モデルの流用が多いのでアニメーション関連の情報がほとんど引っかかりません。検索の仕方がまずいのでしょうが……。LittleMaidReengagedのモデルファイルを見て、これかなあという情報を見つけはしましたが、先達の方からの情報があればそれにすがりたい状況です。また、Mobの透明化に関しては箸にも棒にも引っかかりません。

 どなたか、Mobの透明化の原因とその解決法、自作Mobにちゃんとしたモーション・アニメーションを追加する方法をご存知の方がいればご教授願えますでしょうか。

参考画像
MaidInvisible.png

↑スポーンさせただけのメイドさん。影が描画されているだけで見えない。

MaidDamaged.png

↑ダメージを受けている状態のメイドさん。アニメーション(モーション)は再生されるが首と胴体(あと腕)が泣き別れ。そもそもゲームにモデルやテクスチャが読み込まれていないというわけではなさそう。なお、頭と胴体の間に見えているのは頭から伸びている後ろ髪。


↓開発中のModのリポジトリ? です。投稿時点と同じファイル構成になっていますから、これをeclipseなりで開いて実行すれば同じ環境になるはずです。
https://github.com/KashiPrg/GracefulMaid1.10.2
Mobの追加に関わっているクラスは、
kashiwagik.gracefulmaid.entity.EntityMaid(エンティティ情報)
kashiwagik.gracefulmaid.client.render.RenderEntityMaid(エンティティのレンダリング情報)
kashiwagik.gracefulmaid.client.model.ModelMaid(エンティティのモデル情報)
kashiwagik.gracefulmaid.init.ModEntities(Modで追加するエンティティを一元管理)
kashiwagik.gracefulmaid.proxy.ClientProxy(クライアント側での描画処理)
kashiwagik.gracefulmaid.GracefulMaid(Mod本体)
 以上のはずです。漏れがあったら申し訳ありません。また、作りたいModの方針として、このMobはプレイヤーに友好的なものにするつもりですが、AIについては動画からほぼ写経しましたので現在は敵対的なMobになっています。
 モデルファイルの作成にはQubbleというMinecraft内で動作するModを利用しています(Techneが配布終了したとかで入手できなかったので)。

(以下環境)
MineCraftバージョン:1.10.2
Forgeバージョン:1.10.2-12.18.3.2511(投稿時点で1.10.2の中では最新)
IDE:eclipse 4.7 Oxygen
モデルエディタ:Qubble 0.1.3 (https://www.curseforge.com/minecraft/mc-mods/qubbleで入手)

OS:Windows7 Home Premium 64ビット
メモリ:16GB RAM
CPU:Intel Core i7-4770
GPU:NVIDIA GeForce GTX 760

(以下参考)
参考動画:How To Make A Minecraft 1.9/1.10 Mod | Custom Entities & Sounds - YouTube
(https://www.youtube.com/watch?v=JdDICgaHf0Q)
 この動画内でのテストでは、エンティティがきちんと描画されていてアニメーションもしていますが、うp主は料理番組よろしく事前に用意しておいたソースやモデルデータを利用しています。ですので、動画内で作成していたファイルは全て視聴者に見せるためだけの一時的なものでしか無いようで、折に触れて削除しています。
 事実、この動画ではプロキシでの描画処理について言及されていなかったので、写経していたのであろうユーザーからは「追加したmobが白いキューブみたいに描画されてしまいますどうすれば良いですか」というコメントも上がっていました(私もそうなりましたが、うp主の返信コメントと下記のページを参考にしてそれは解決しました)。また、私と同じように「Mobが透明になる」というコメントもありましたが、具体的な解決方法は示されていないようでした。

参考ページ:
MOBの追加(1.7.10) | TNT Modders
(https://www.tntmodders.com/tutorial/mob-1710/)
 動画で不足していたプロキシでの処理に関してはここも参考にしました。1.7.10でも大元の処理はそう変わっていないだろうと思いましたので。もしかしたらここに原因があるのかも知れませんが……。

 他に追記すべき事項がありましたら追記させていただきます。
最後に編集したユーザー Kashiwagi_K [ 2018年4月17日(火) 17:19 ], 累計 1 回
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 7
登録日時: 2018年4月13日(金) 00:21

  • (PostNo.315697)

Re: 追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

投稿記事by elise_blacklab » 2018年4月13日(金) 03:43

Kashiwagi_K さんが書きました: 一応自分でも情報は探したのですが、そもそもエンティティを追加する類のチュートリアルがかなり稀有で、あったとしても既存モデルの流用が多いのでアニメーション関連の情報がほとんど引っかかりません。検索の仕方がまずいのでしょうが……。LittleMaidReengagedのモデルファイルを見て、これかなあという情報を見つけはしましたが、先達の方からの情報があればそれにすがりたい状況です。また、Mobの透明化に関しては箸にも棒にも引っかかりません。

そのLMREのModel用ソースに書いてありますが(net.blacklab.lmr.entity.maidmodel以下),Modelクラスのコンストラクタは初期化時にすべて使用されるので,きちんと定義しておかなければなりません(ということだった気がする).
言うまでもありませんが,そのいずれのコンストラクタから呼び出されても,各パーツの初期化処理が呼ばれるようにしなければなりません.
※なおLMREの場合,移植元からの仕様でModelBipedレベルから全部代替クラスになっとりますが,基本的な仕様はバニラのものと同一です.


Kashiwagi_K さんが書きました: 他にも、エンティティモデルのクラスにModelBaseを継承させたところ棒立ちになってしまったので、ModelBipedを継承させてbipedHeadやbipedBodyなどに各パーツを対応させたのですが、用意したモデルがスケルトンやスティーブよりやや小さいせいか、頭や腕がスケルトンやスティーブの対応パーツがあるであろう位置に表示されて、胴体からサヨナラしてしまいます(アニメーションは再生されるのですが)。また、透明化してしまうのはこの前後でも変わりません。

ポーズやアニメーションはsetDefaultPause()やsetRotationAngles()に全部指定することになっています.
LMREのModelLittleMaidBase.javaを見ていただければ,大体の指定は事細かに載っているので,参考にするとよいと思います.
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2560
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.315725)

Re: 追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

投稿記事by Kashiwagi_K » 2018年4月13日(金) 21:44

elise_blacklab さんが書きました:そのLMREのModel用ソースに書いてありますが(net.blacklab.lmr.entity.maidmodel以下),Modelクラスのコンストラクタは初期化時にすべて使用されるので,きちんと定義しておかなければなりません(ということだった気がする).
言うまでもありませんが,そのいずれのコンストラクタから呼び出されても,各パーツの初期化処理が呼ばれるようにしなければなりません.

elise_blacklab さんが書きました:ポーズやアニメーションはsetDefaultPause()やsetRotationAngles()に全部指定することになっています.
LMREのModelLittleMaidBase.javaを見ていただければ,大体の指定は事細かに載っているので,参考にするとよいと思います.

 わかりました。まずは読んで試してみます。
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 7
登録日時: 2018年4月13日(金) 00:21

  • (PostNo.315730)

Re: 追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

投稿記事by Kashiwagi_K » 2018年4月13日(金) 22:54

Kashiwagi_K さんが書きました: 今回は自作Mobを追加しようと思いソースを書いたのですが、Mobの追加自体はできたものの、そのMobがダメージを受けている時以外は透明になってしまいます(ダメージを受けた時はモデルの形状もテクスチャもちゃんと表示されます。また、影は描画されているので、当たり前ですがポーション効果の透明化が乗っているわけではないようです)。

 原因が解りました。Modelクラスのrenderメソッドの中に、
コード: 全て選択
GlStateManager.color(1.0F, 1.0F, 1.0F, 0.0F);

 という一節がいくつかあったのですが、colorにマウスカーソルを合わせて説明を見てみると、第一引数から順に、赤、緑、青、アルファ値(透明度、あるいは不透明度?)を0.0F~1.0Fで指定しているらしいことがわかりました(値の範囲は推測ですが)。ということは、ダメージ時に見えるようになるのは、ダメージ時には別でこのcolorメソッドが呼ばれていて、赤味が強い色調で不透明に描画されているからなのでは……? と考え、全てのcolorメソッドの第四引数(アルファ値)を1.0Fに変えたところ、無事に平時も描画されるようになりました。

↓訂正例
コード: 全て選択
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);

 Qubbleでモデルデータを出力したときそのままのコードが前者のものなので、Qubbleで作ったモデルがそこにあるはずなのに見えない! という方はこれが原因の可能性大です。

 今後、まともなアニメーションが追加できるようになったら解決済みとします。
 他の方のアドバイスもどんどん募集させていただきます。
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 7
登録日時: 2018年4月13日(金) 00:21

  • (PostNo.315857)

Re: 追加したMobが透明化(非ポーション効果)してしまう【1.10.2/Mob追加】

投稿記事by Kashiwagi_K » 2018年4月17日(火) 17:18

 ソースコードを色々読んでいて時間がかかったのですが、とりあえず既存のRenderLivingなどの派生クラスならdoRenderメソッド→renderModelメソッド経由で該当モデルのrenderメソッドが呼ばれるので、モデルのrenderメソッド(引数は揃えておく)内でレンダリングする前にsetRotationAnglesメソッドを呼んでおいて各パーツの角度を設定しておけばOKということがわかりました。

Kashiwagi_K さんが書きました:他にも、エンティティモデルのクラスにModelBaseを継承させたところ棒立ちになってしまったので、ModelBipedを継承させてbipedHeadやbipedBodyなどに各パーツを対応させたのですが、用意したモデルがスケルトンやスティーブよりやや小さいせいか、頭や腕がスケルトンやスティーブの対応パーツがあるであろう位置に表示されて、胴体からサヨナラしてしまいます(アニメーションは再生されるのですが)。

 これについては、基底クラスであるModelBipedクラスで呼ばれたsetRotationPointでスティーブやスケルトンを基準とした値に設定されていたのが原因なので、こちら側のsetRotationAnglesなどの中で改めてsetRotationPointを呼んで、引数はコンストラクター内のsetRotationPointと同じものを指定してやれば良さそうです。
 ageInTicksを使えば時間に依存するアニメーションもできそうですね。あと角度指定はラジアンっぽいので注意が必要ですね……。
 limbSwingやlimbSwingAmountはちょっと詳細が不明ですが、追々研究していくことにします。教えてくださる方がいらっしゃるなら大歓迎です。

 とはいえ一応ここまでで目的は達成できたので、このトピックは解決済みとしておきます。ありがとうございました。

livingmaid.png

コードを以下のようにすることでできました!

コード: 全て選択
@Override
    public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float rotationYaw, float rotationPitch, float scale) {
       this.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, rotationYaw, rotationPitch, scale, entityIn);

        GlStateManager.pushMatrix();
        this.MaidRightLeg.render(scale);
        this.MaidLeftLeg.render(scale);
        this.MaidBody.render(scale);
        this.MaidHead.render(scale);
        this.MaidRightArm.render(scale);
        this.MaidLeftArm.render(scale);
        this.MaidSkirtForward.render(scale);
        this.MaidSkirtBack.render(scale);
        this.MaidSkirtLeft.render(scale);
        this.MaidSkirtRight.render(scale);
        GlStateManager.popMatrix();
    }

    public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float pHeadYaw, float pHeadPitch, float scaleFactor, Entity entityIn) {
       setDefaultPose(limbSwing, limbSwingAmount, ageInTicks, pHeadYaw, pHeadPitch, scaleFactor, entityIn);
    }

    public void setPartAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }

    public void setDefaultPose(float limbSwing, float limbSwingAmount, float ageInTicks, float pHeadYaw, float pHeadPitch, float scaleFactor, Entity entityIn) {
       bipedHead.setRotationPoint(0.0F, 4.0F, 0.0F);
       bipedBody.setRotationPoint(0.0F, 4.0F, 0.0F);
       bipedRightArm.setRotationPoint(-4.0F, 5.3F, 0.0F);
       bipedLeftArm.setRotationPoint(4.0F, 5.3F, 0.0F);
       bipedRightLeg.setRotationPoint(-1.5F, 14.0F, 0.0F);
       bipedLeftLeg.setRotationPoint(1.5F, 14.0F, 0.0F);

       bipedHead.rotateAngleX = pHeadPitch * 0.017453292F; //degree to radian
       bipedHead.rotateAngleY = pHeadYaw * 0.017453292F;

       float f = MathHelper.sin(this.swingProgress * (float)Math.PI);
        float f1 = MathHelper.sin((1.0F - (1.0F - this.swingProgress) * (1.0F - this.swingProgress)) * (float)Math.PI);
        setPartAngle(bipedRightArm, -((float)Math.PI / 8F) - (f * 1.2F - f1 * 0.4F) + (MathHelper.sin(ageInTicks * 0.067F) * 0.05F), 0.0F, -((float)Math.PI / 8F));
        setPartAngle(bipedLeftArm, -((float)Math.PI / 8F) - (f * 1.2F - f1 * 0.4F) + (MathHelper.sin(ageInTicks * 0.067F) * 0.05F), 0.0F, (float)Math.PI / 8F);

        setPartAngle(bipedRightLeg, MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount, 0.0F, 0.0F);
        setPartAngle(bipedRightLeg, MathHelper.cos(limbSwing * 0.6662F + (float)Math.PI) * 1.4F * limbSwingAmount, 0.0F, 0.0F);
    }
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 7
登録日時: 2018年4月13日(金) 00:21


Return to 質問:開発・制作関連

x