MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Priest
記事: 123
登録日時: 7年前
住所: 愛知

MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#1

投稿記事 by Priest » 7年前

キャラクタを、現在の姿勢をそのままに首だけを傾けるという処理をしたいです。
(例えば、体は進行方向を向いて、顔は敵の方を向く。等)

その手法として以下の2つを考えました:
1:"右に90度向いているアニメーションデータ"と"左に90度向いているアニメーションデータ"の2つを用意し、
 そのブレンド率を操作することで、首の傾きを表現する。
2:ある一つのアニメーションに対して、首を実際に傾けたものを別に何十パターンのアニメーションデータを用意して切り替える。
 (一つのアニメーションに対して、首の傾きが、5,10,15,……,170,175,180度のものをすべて用意する。)

この2つの中で実装に現実的な1を選択し、検証してみましたが、結果は添付した動画データのようになってしまいました。
horror.zip
(2.02 MiB) ダウンロード数: 52 回
※なお、この動画のダウンロードはこの問題の検証のためのみに用いられるものとし、
動画を何かしらの素材として、使用、公開などを行うことを禁止します。


私が作りたいのはホラーゲームではないので、もし有効な手段があれば教えていただきたいと思っています。
現在、手法2については試していません。(あまりにもこちらの負荷が大きすぎるので躊躇っています。)

それではお手数ですがよろしくお願いします。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#2

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

検証用のモデルとソースコードが無いと返答が難しいかと思います。
あと、DXLIBでバグの多い方面ですのでバージョンを最新にしてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#3

投稿記事 by Priest » 7年前

softyaさん

返信ありがとうございます。

ライブラリは最新の状態となっています。(Ver3.10a)

やはりこれだけの情報では難しいですよね。
しかし動画で使用したモデルに関しては、権利関係の都合上用意が難しいので、
一度トピックは閉じ、個人で検証を重ねていこうかと思います。

何か分かったらこちらに投稿するように致します。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#4

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

Priest さんが書きました:やはりこれだけの情報では難しいですよね。
しかし動画で使用したモデルに関しては、権利関係の都合上用意が難しいので、
一度トピックは閉じ、個人で検証を重ねていこうかと思います。
ですよね。
なので、検証用のモデルと書いたのですが、それも難しいですか?
問題が再現さえすれば、別のモデルで構わないと思うんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#5

投稿記事 by Priest » 7年前

では、少しお時間はかかりますが検証用モデルを探してきます。
それと同時に添付するソースコードは、動画のような動作を再現するものとなります。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#6

投稿記事 by Dixq (管理人) » 7年前

MMD用に配布されているモデルは比較的緩い利用条件になっているモデルがありますよ。
例えばLat式ミクなんかだと

=== れあどめ.txt 引用 ===
::使用条件::
モデルデータは、版権元のキャラクター利用のガイドラインと同様になります。
その範囲内であればデータの改変・流用を含む利用・再配布等オールOKです。
======================

となっています。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#7

投稿記事 by Priest » 7年前

検証用モデルの調達とソースコードできました。
切り張りしていたらどこかでミスしてエラー吐きまくってました。
遅くなってすみません。

添付ファイルからご覧ください。

とりあえず、再配布可の所から拝借させていただきました。

【追記】
Dixqさん、情報ありがとうございます!
探せばいろいろあるものですね。
私はこのキャラクタが好きなのであえてこれを選びました。(は、嘘です
添付ファイル
検証用.zip
(2.18 MiB) ダウンロード数: 26 回

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#8

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

アニメーション・データで首から上に回転以外のパラメータが見受けられるのですが、右と左に首を回すだけのデータを合成しても同じ事になりますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#9

投稿記事 by Priest » 7年前

顔以外をデフォルト位置にして、顔を90度と-90度に傾けたものを用意しアニメーションさせると、右向きと左向きが交互に出ました。

そして、それぞれを45度,-45度にしてみたところ!
首が回りました!

【追記】
しかし、元のデータでうまくいかなかった原因はなんでしょうか?
回転以外のパラメータが変に影響してしまうのでしょうか。
そういった意味では、この実装は厳しそうですか?
添付ファイル
検証用 (2).zip
(2.19 MiB) ダウンロード数: 19 回

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#10

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

回転以外のマトリクスデータが打ち消し合って変な変形を起こしていた可能性があります。
首を回すだけなら、ボーンの回転だけをいじるほうが良いでしょう。
こうしてはどうでしょう?
1.正面向きの上下動のモーション
2.右向きだけのモーション
3.左向きだけのモーション

1と2あるいは1と3をブレンドする。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#11

投稿記事 by Priest » 7年前

返答ありがとうございます。

こちらでさらに検証したところ、
上下動のモーションは歪みに影響はないことが分かりました。

首の回転について、例えば、
x軸回転: 4.5度
y軸回転: 80度
z軸回転: 7.8度

x軸回転: 5.3度
y軸回転: -80度
z軸回転: 6.2度

のように、y軸回転以外の角度が微妙に違うと変形を起こしてしまうようです。
これを、
x軸回転: 0度
y軸回転: 80度
z軸回転: 0度

x軸回転: 0度
y軸回転: -80度
z軸回転: 0度
とすると、上下移動があってもうまく回ります。

つまり、複数軸の回転が重なるとおかしくなるような気がします。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
lriki
記事: 88
登録日時: 9年前

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#12

投稿記事 by lriki » 7年前

DXライブラリってモーション適用後のフレームの行列を操作することはできませんでしたっけ?
首をターゲットに向ける回転行列を作って直接上書きした方が確実だと思うのですが・・・。

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#13

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

そうですね。
掛け合わせる順番の問題かもしれませんね。

アニメーションを適用したモデルに、首のフレームからMV1GetFrameLocalWorldMatrixでマトリクス得て、これを回転、再びMV1SetFrameUserLocalMatrixでセットするで行けるかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#14

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

softya(ソフト屋) さんが書きました:回転以外のマトリクスデータが打ち消し合って変な変形を起こしていた可能性があります。
首を回すだけなら、ボーンの回転だけをいじるほうが良いでしょう。
こうしてはどうでしょう?
1.正面向きの上下動のモーション
2.右向きだけのモーション
3.左向きだけのモーション

1と2あるいは1と3をブレンドする。
そういえば私の、この方法はどうだったんでしょうか?
2と3さえブレンドしなければ大丈夫だと思ったのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#15

投稿記事 by Priest » 7年前

梨樹さん

ありがとうございます!
実は行列を使った回転、移動、拡大縮小をやったことがないので、少し手間取りそうです。

softyaさん

その件については、まだ検証できていませんが、後ほど検証させていただきます。
結果は失敗した場合のみ動画でアップします。

>アニメーションを適用したモデルに、首のフレームからMV1GetFrameLocalWorldMatrixでマトリクス得て、これを回転、再びMV1SetFrameUserLocalMatrixでセットするで行けるかもしれません。
上記の通り行列になじみはありませんが、余力があれば検証してみます!

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#16

投稿記事 by Priest » 7年前

softyaさん

検証の結果、12,13ブレンドでうまくいくことが確認できました!
長時間の検証にお付き合いいただき本当にありがとうございました。

次は行列ですか。 行列かぁ…。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#17

投稿記事 by Priest » 7年前

すごい細かいことですが…、
先ほどの12,13ブレンドだと、上下動モーションの比率の差が出る影響で、上下動の幅にぶれが生じて変に見えてしまうかもしれません。

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

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

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#18

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

Priest さんが書きました:すごい細かいことですが…、
先ほどの12,13ブレンドだと、上下動モーションの比率の差が出る影響で、上下動の幅にぶれが生じて変に見えてしまうかもしれません。
ブレンドの特性上仕方ないかもしれませんが、確かにそっちは問題かもしれませんね。
2と3にも上下動を入れれば解決する気もしますが冗長でメンテナンス性の悪い作業ですので、オススメ出来ません。

隠しでMV1SetAttachAnimBlendRateToFrameってのがあるのを発見。
「MV1SetAttachAnimBlendRateToFrame」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1586
これを首のフレームにだけ適用すれば解決かもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Priest
記事: 123
登録日時: 7年前
住所: 愛知

Re: MMDを用いたアニメーションにおいて姿勢を変えずに首だけを傾ける手法について(DXライブラリ)

#19

投稿記事 by Priest » 7年前

>冗長でメンテナンス性の悪い
そうですよね。。。

URLについてはあす以降にじっくりと拝見しようと思います。
見つけていただいてありがとうございます!

そういうの、リファレンスにどんどん乗せて欲しいところですが…w

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

閉鎖

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