アニメーション時のモデル座標とカメラモーションについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
coc

アニメーション時のモデル座標とカメラモーションについて

#1

投稿記事 by coc » 12年前

二つのモデル(A,B)にアニメーションさせたデータを再生しようとしております。

アニメーションの作り方はMMDで二つのモデルを読み込み、出力は別々にしています。
そのためローカル座標内の比率は共有しております。

AからBに会話をした時にこのアニメーションを再生しているのですが、会話をした位置によってAの座標が変化してしまい困っております。
再生前に

コード:

//モーションのため相手の位置を代入
A_Pos = B_Pos;
//向きを合わせる
VECTOR B_Rot = MV1GetRotationXYZ( B_Handle );
MV1SetRotationXYZ( A_ModelHandle, B_Rot);
この様に代入処理をする事で同じローカル座標比率でも問題無いように設計しています。
デバッグで確認した所、AとBの座標はアニメーション中もずっと同じでした。

またAにオブジェクト(剣など)が付属しているのですが、このオブジェクトも上記処理でAと位置、向きを同じにしております。
しかしこのオブジェクトはアニメーション中Aに付随せずに、ちゃんとアニメーション作成時に設定した位置にいます。
デバッグで確認してもAと同じ座標でした。

かなり不可解なのですが、モデルを描画する際に座標以外に描画位置が切り替わる事があるのでしょうか?


二点目はカメラモーションの読み込みについてです。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=2084
こちらを元に組んだのですが、

コード:

    MATRIX VRotMat, HRotMat, MixRotMat, TwistRotMat ;
	VECTOR CamLoc, CamDir, CamUp ;
	VECTOR Location, Rotation ;
	float Length, ViewAngle ;

	// カメラの注視点を取得
	Location = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 0, Time ) ;

	//モデルの拡大率分スケールする
	const float ZOOM_SIZE = 15.0f;
	Location = VScale(Location,ZOOM_SIZE);

	//拡大行列の取得
	MATRIX ScaleMat = MGetScale( VGet( ZOOM_SIZE,ZOOM_SIZE,ZOOM_SIZE) );

	// カメラの回転値を取得
	Rotation = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 1, Time ) ;

	// カメラの注視点までの距離の符号を逆転したものを取得
	Length = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 2, Time ) ;

	Length *= ZOOM_SIZE;

	// カメラの視野角を取得
	ViewAngle = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 3, Time ) ;

	// 垂直方向の回転行列を取得
	VRotMat = MGetRotX( -Rotation.x ) ;

	// 水平方向の回転行列を取得
	HRotMat = MGetRotY( -Rotation.y ) ;

	// 垂直方向の回転行列と水平方向の回転行列を合成
	MixRotMat = MMult( VRotMat, HRotMat ) ;

	//拡大
	//MixRotMat = MMult( MixRotMat, ScaleMat ) ;

	// カメラの向きを算出
	CamDir = VTransform( VGet( 0.0f, 0.0f, 1.0f ), MixRotMat ) ;

	// 捻り回転行列を取得
	TwistRotMat = MGetRotAxis( CamDir, -Rotation.z ) ;

	// 捻り回転行列を合成行列に合成
	MixRotMat = MMult( MixRotMat, TwistRotMat ) ;

	// カメラの上方向の向きを算出
	CamUp  = VTransform( VGet( 0.0f, 1.0f,  0.0f ), MixRotMat ) ;

	// カメラの座標を算出
	CamLoc = VTransform( VGet( 0.0f, 0.0f, Length ), MixRotMat ) ;
	CamLoc = VAdd( CamLoc, Location );
        //Aに座標をあわせる
	CamLoc = VAdd(CamLoc,A_Pos);

	// カメラの注視点を算出
	Location = VAdd( CamLoc, CamDir ) ;

	// 視野角をセット
	SetupCamera_Perspective( ViewAngle / 180.0f * DX_PI_F ) ;

	// カメラの座標と注視点と上方向をセット
	SetCameraPositionAndTargetAndUpVec( CamLoc, Location, CamUp ) ;
pmdを読み込んでいる関係で拡大させる必要に気付きLocationとLengthを拡大しています。
しかしこれだと思ったよりもカメラの動きによるカメラ位置の変化が大きすぎる結果となってしまいました。
(カメラの座標自体はそこそこ正しいのですが)
どの様に修正したら宜しいのでしょうか・・・?
正直な所どなたかに実際のソースコードを見て頂きたいのですが、モデルなどの兼ね合いで公開する訳にもいかず心底困っておりますorz

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アニメーション時のモデル座標とカメラモーションについて

#2

投稿記事 by softya(ソフト屋) » 12年前

各モデルがモデル・ファイル内の座標系で体の中心の足元が(0,0,0)に存在しているか確認したほうが良いと思います。
中心になっていないと回転させた場合、中心軸がズレて回転します。

あとカメラの問題は、カメラとモデルがpmd系ならスケール全体をそっちに合わせたほうが楽だと思います。
ソースコードとデータを見せたい場合は、だれでもダウンロードできるデータを使い短いソースコードを用意してもらえば良いかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#3

投稿記事 by coc » 12年前

ご回答有り難う御座います。
モデルファイルの足下を調べましたが問題は見つかりませんでした・・。

カメラに関してはスケールを全てpmd基準にしましたが変化無く全く同じ動きでした。
そこで色々探していた所、影描画の際に深度設定時にカメラを使用していた事が原因で、そちらの順番などを設定し直した所かなり惜しい状態になりました。
カメラモーション自体の角度、タイミングは完璧ですが、最初から最後まで全体的に映している角度がずれてしまっています。
(カメラの水平角度が+何度してくれれば全てマッチするというような状況です。垂直角度は問題無かったです。)
このズレは会話位置や話しかける角度などにより変化はしませんでした。


モデルデータを探したのですがboneが異なるため上手くアニメーションしてくれませんorz
もう少し探してみます。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#4

投稿記事 by coc » 12年前

カメラについて原因が判明しました。
カメラモーションは常に0度を向いてしまっているため、対象のモデルが0度以外の方向を向いていると正しい方向に認識されません。(モデル位置に関してもこれが原因でした)
そこでモデルの方向からカメラの方向に補正を掛けようと思い至ったのですが、
例えば180度反転させたい場合前述したソース内で

コード:

Rotation.y -= DX_PI_F;
if(Rotation.y < -DX_PI_F){
	Rotation.y += DX_TWO_PI_F;
}
この様な形で記述しておりますが、思った地点にカメラが移動してもらえません。
(角度や捻り具合は間違い無いので座標の問題です)
どの角度でもカメラの注視点は同じだと考えてましたがそうではないのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アニメーション時のモデル座標とカメラモーションについて

#5

投稿記事 by softya(ソフト屋) » 12年前

私の時間がないので、シンプルに問題を再現できるソースがあると検証できるのですが。
行列ではなく角度で補正している段階でやばい感じはします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#6

投稿記事 by coc » 12年前

一応ボーンを揃えたモデルの自作とカメラモーションと再現コードは用意してあるのですが、こういう場所で公開はしたくないため宜しければメールアドレスを教えて頂いても宜しいでしょうか?

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#7

投稿記事 by coc » 12年前

反転処理はコメントアウトしておいてありますので、そのままデバッグすると正しいカメラモーションが流れます。
確認次第、main関数上のモデル反転のコメントアウトを外して頂き確認して頂ければ幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アニメーション時のモデル座標とカメラモーションについて

#8

投稿記事 by softya(ソフト屋) » 12年前

ここに掲載できる程度の物でお願いします。多くの人に検証してもらえます。
あとボーン・モデルとか複雑な要因は必要ないと思われますので、出来るだけシンプルにしてみてください。
簡単なカメラデータとモデルなしでBOX表示でも再現するんじゃないかと予想しております。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#9

投稿記事 by coc » 12年前

箱で再現しました。
4面色違いになっております

http://www.dotup.org/uploda/www.dotup.o ... 5.zip.html
宜しくお願い致します

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アニメーション時のモデル座標とカメラモーションについて

#10

投稿記事 by softya(ソフト屋) » 12年前

受け取りました。
再生は出来ましたが、正解のモーションが分からないのですがpmd としての正解を動画には出来ないでしょうか?

【補足】
カメラモデルから角度を取り出しているのが全ての原因な気がするので行列のまま取り出せば解決する気がしております。
時間が取れたらコードを書いてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#11

投稿記事 by coc » 12年前

/**********/
で囲ってある中をコメントアウト(モデルの角度と反転処理部分)して頂ければ正しいモーションとなります。

動画はちょっとやってみた事が無いため難しいかもしれません。

あれこれ新規のカメラモーションを試してみていますが、

・短い?
・余り移動しない?
のカメラモーションではこの角度の反転処理でも上手くいっている様です。

お渡ししているカメラモーションとの違いがまだ明確化出来てはいませんorz

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アニメーション時のモデル座標とカメラモーションについて

#12

投稿記事 by softya(ソフト屋) » 12年前

とりあえず知らべてみました。
問題のSetupVMDCameraMotionParam()に関しては、DXLIB作者さんの言われるとおりに書かないと動かなさそうです。
ただ、完全にバグが潰れているのか?は疑問ですのでDXLIB作者さんに確認したほうが良さそうです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coc

Re: アニメーション時のモデル座標とカメラモーションについて

#13

投稿記事 by coc » 12年前

了解致しました。
あれからずっと試行錯誤していましたが、結局カメラモーション自体をプログラムに合わせるという形で一応無理やり解決させました。
有り難う御座いました。

閉鎖

“C言語何でも質問掲示板” へ戻る