質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

691閲覧

UnityでMMDモデルのアニメーションを画面中央に捉えたい。

salisyade

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2023/03/15 14:03

実現したいこと

アニメーションするMMDモデルを画面の中心に捉え続けたい。

前提

「MikuMikuDance」用のモデルデータ(.pmx)をUnityにインポートして、Animatorで.VMDのアニメーションを制御してダンスさせています。

発生している問題・エラーメッセージ

モデルが移動するのですが、モデルはアニメーションをしているだけで、モデルのオブジェクトのpositionが変化しているわけではないので、私が書いたコードだとカメラがモデルを追従してくれません。
イメージ説明

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ReimuCameraController : MonoBehaviour 6{ 7 private GameObject Player; 8 private Vector3 Offset; //相対距離取得用 9 public GameObject Reimu; //モデルキャラクターの名前です。モデルを入れます。 10 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 this.Player = Reimu; 16 17   // MainCamera(自分自身)との相対距離を求める 18 Offset = transform.position - Player.transform.position; 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24   //向きと回転を制御 25 transform.position = Player.transform.position + Offset; 26 transform.rotation = Player.transform.rotation; 27 28 } 29}

試したこと

カメラにpositionのアニメーションをつけてゴリ押しでやろうと思いましたが、複雑なモーションなため断念しました。

補足情報(FW/ツールのバージョンなど)

PMX(PMD) + VMD を FBX に変換するツール & Unity (Mecanim) で一通り動作させるためのスクリプトです。
MMD4Mecanim (MMD4Mecanim_Beta_20201105.zip)
http://stereoarts.jp/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アニメーションに合わせてオブジェクトの位置が変化するように設定を調整する(つまりアニメーションがGenericならRoot nodeの設定を、Humanoidならルートモーション周りの設定を調整する)手があるかと思いますが、シンプルにカメラスクリプト側だけで対処するのでしたら、位置を取得するオブジェクトを変えてしまってはいかがでしょうか。

キャラクターオブジェクトの子階層へ潜ってみますと、おそらくどこかにアニメーションに合わせて位置が変化しているボーンがあるんじゃないかと思います(「joint_HipMaster」みたいな名前の、体のルート部分に相当するオブジェクトがないでしょうか?)。それをカメラスクリプトのReimuにセットしてはいかがでしょう。
ただし、もしかすると位置については好都合でも、回転についてはカメラに適用するには不都合な場合があるかもしれません。もしそのようなケースでしたら、カメラ用スクリプトが参照するオブジェクトを位置用と回転用に独立させてしまい、それぞれに好都合なオブジェクトをセットしてしまうのもいいんじゃないかと思います。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ReimuCameraController : MonoBehaviour 6{ 7 private Vector3 Offset; //相対距離取得用 8 9 // キャラクターへの参照を位置用と回転用の2つに分けて... 10 public Transform ReimuPosition; 11 public Transform ReimuRotation; 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 // 位置については位置用Transformを用い... 17 Offset = transform.position - ReimuPosition.position; 18 } 19 20 // Update is called once per frame 21 void Update() 22 { 23 // こちらも位置は位置用Transformを用い... 24 transform.position = ReimuPosition.position + Offset; 25 26 // 回転は回転用Transformを使ってはいかがでしょうか 27 transform.rotation = ReimuRotation.rotation; 28 } 29}

投稿2023/03/16 20:53

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

salisyade

2023/03/23 07:08

ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問