トップページ > 記事閲覧
3Dモデルのフレームがねじれてしまう問題
名前:名無三 日時: 2020/07/04 14:21

ローカル座標関連での質問なのですが(DXLIBに直接関係ないです、すいません…)、 現在手を持っていきたい位置に追従するように腕のフレームを操作する部分を実装しています。 余弦定理を用いて腕の曲げ方を指定するというもので、現状 1:上腕を曲げる角度を取得し適応する 2:下腕は手の方向に向けばいい(と思っていた)のでそちらに向ける というステップで動かしているのですが、下腕が体の回転に応じてねじれるように回転してしまいます。 該当部分の抜き出し+αです、いろいろラップしているので見難かったら申し訳ありません。 //RIGHTarm1_f=上腕フレームの番号と元のローカル座標を保持するpair //RIGHTarm3_f=下腕フレームの以下同文 //RIGHThand_f=手フレームの以下同文 //getcos_tri=1引数目に対し余弦定理でcosを求める関数 VECTOR_ref vec_aim = c.pos; VECTOR_ref vec_a1 = MATRIX_ref::Vtrans((vec_aim - c.body.frame(c.RIGHTarm1_f.first)).Norm(), m_inv);//向けたい点へのベクトル VECTOR_ref vec_a1L1 = VECTOR_ref(VGet(0.f, -1.f, vec_a1.y() / vec_a1.z())).Norm();//真下に降ろしたベクトル float rad_t = getcos_tri( (c.body.frame(c.RIGHThand_f.first) - c.body.frame(c.RIGHTarm3_f.first)).size(), (c.body.frame(c.RIGHTarm3_f.first) - c.body.frame(c.RIGHTarm1_f.first)).size(), (c.body.frame(c.RIGHTarm1_f.first) - vec_aim).size() ); VECTOR_ref vec_t = vec_a1 * rad_t + vec_a1L1 * std::sqrtf(1.f - rad_t * rad_t); //上腕 ここはよし c.body.SetFrameLocalMatrix(c.RIGHTarm1_f.first, m_inv*MATRIX_ref::Mtrans(c.RIGHTarm1_f.second)); MATRIX_ref a1_inv = MATRIX_ref::RotVec2(c.body.frame(c.RIGHTarm3_f.first) - c.body.frame(c.RIGHTarm1_f.first), vec_t); c.body.SetFrameLocalMatrix(c.RIGHTarm1_f.first, a1_inv*MATRIX_ref::Mtrans(c.RIGHTarm1_f.second)); //下腕 ここがおかしい、ねじれる c.body.SetFrameLocalMatrix(c.RIGHTarm3_f.first, m_inv*a1_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHTarm3_f.second)); MATRIX_ref a3_inv = MATRIX_ref::RotVec2( c.body.frame(c.RIGHThand_f.first) - c.body.frame(c.RIGHTarm3_f.first), vec_aim - c.body.frame(c.RIGHTarm3_f.first) ); c.body.SetFrameLocalMatrix(c.RIGHTarm3_f.first, a3_inv*m_inv*a1_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHTarm3_f.second)); そして該当のvisualstudio2017プロジェクトです。route.hppの614行目以降に今回の実装を記しています。 drive.google.com/file/d/1kvf9dq0LfSOLAauC4vEfKWyR6C74EfDS/view?usp=sharing 実行後、ロードを挟んで武器選択画面が出ますのでスペースを押してゲーム画面に進んでください。武器選択とゲーム画面が開かれている際にはエスケープで終了できます。 実行中はマウスが画面中央に固定されますのでご了承ください。 この腕のねじれを解消し、ゲーム画面中で赤いメッシュが常に上を向くようにするにはどうすれば良いでしょうか?
メンテ

Page: 1 |

Re: 3Dモデルのフレームがねじれてしまう問題 ( No.1 )
名前:管理人 日時:2020/07/04 22:41

すみません、フレームの角度を調節して希望の座標に希望のフレームを表示する、 という処理は所謂 IK ( Inverse Kinematics: 逆運動学 ) だと思われますが 私はまだIKの実装に挑戦したことが無いので、申し訳ありませんがお答えできません IK 角度制限 C++ アルゴリズム ↑こちらのようなキーワードで Google検索をしてみてください、IKに関して説明されている ウェブサイトが見つかると思います… m(_ _;m
メンテ
Re: 3Dモデルのフレームがねじれてしまう問題 ( No.2 )
名前:名無三 日時:2020/07/07 12:36

すいません、検索結果と正常な上腕をもとに修正できました。ご迷惑をおかけしました… (修正済みコード) VECTOR_ref vec_a1 = MATRIX_ref::Vtrans(((c.pos + c.pos_RIGHTHAND) - c.body.frame(c.RIGHTarm1_f.first)).Norm(), m_inv.Inverse());//基準 VECTOR_ref vec_a1L1 = VECTOR_ref(VGet(0.f, -1.f, vec_a1.y() / vec_a1.z())).Norm();//x=0とする VECTOR_ref vec_a1L2 = VECTOR_ref(VGet(-1.f, 0.f, vec_a1.x() / vec_a1.z())).Norm();//y=0とする float rad_t = getcos_tri((c.body.frame(c.RIGHThand_f.first) - c.body.frame(c.RIGHTarm2_f.first)).size(), (c.body.frame(c.RIGHTarm2_f.first) - c.body.frame(c.RIGHTarm1_f.first)).size(), (c.body.frame(c.RIGHTarm1_f.first) - (c.pos + c.pos_RIGHTHAND)).size()); VECTOR_ref vec_t = vec_a1 * rad_t + vec_a1L1 * std::sqrtf(1.f - rad_t * rad_t); // c.body.SetFrameLocalMatrix(c.RIGHTarm1_f.first, m_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHTarm1_f.second)); MATRIX_ref a1_inv = MATRIX_ref::RotVec2(c.body.frame(c.RIGHTarm2_f.first) - c.body.frame(c.RIGHTarm1_f.first), vec_t); c.body.SetFrameLocalMatrix(c.RIGHTarm1_f.first, a1_inv*MATRIX_ref::Mtrans(c.RIGHTarm1_f.second)); // c.body.SetFrameLocalMatrix(c.RIGHTarm2_f.first, m_inv.Inverse()*a1_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHTarm2_f.second)); MATRIX_ref a2_inv = MATRIX_ref::RotVec2(c.body.frame(c.RIGHThand_f.first) - c.body.frame(c.RIGHTarm2_f.first), MATRIX_ref::Vtrans(((c.pos + c.pos_RIGHTHAND) - c.body.frame(c.RIGHTarm2_f.first)).Norm(), m_inv.Inverse())); c.body.SetFrameLocalMatrix(c.RIGHTarm2_f.first, a2_inv*a1_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHTarm2_f.second)); // c.body.SetFrameLocalMatrix(c.RIGHThand_f.first, m_inv.Inverse()*a2_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHThand_f.second)); MATRIX_ref hand_inv = MATRIX_ref::RotVec2(c.body.frame(c.RIGHThand2_f.first) - c.body.frame(c.RIGHThand_f.first), MATRIX_ref::Vtrans(c.mat_RIGHTHAND.zvec()*-1.f, m_inv.Inverse())); c.body.SetFrameLocalMatrix(c.RIGHThand_f.first, hand_inv*a2_inv.Inverse()*MATRIX_ref::Mtrans(c.RIGHThand_f.second)); 追伸: Sword Boutサンプルゲーム内のデータに関しまして、他のサンプルゲームのようにMV1以外のmqoやxファイル形式で閲覧したく存じます。もしよろしければご一考お願い致します。
メンテ
Re: 3Dモデルのフレームがねじれてしまう問題 ( No.3 )
名前:管理人 日時:2020/07/08 01:25

おお、IK の実装を成功されたのですね、凄いです (・・; > Sword Boutサンプルゲーム内のデータに関しまして、他のサンプルゲームのようにMV1以外のmqoやxファイル形式で閲覧したく存じます。もしよろしければご一考お願い致します。 ご提案ありがとうございます Sword Bout 公開当時に MV1にする前のファイルをアップしようとしていて、途中でそれ以外のことが 忙しくなってしまって失念してしまっていたことを思い出しました… orz ( そして5年半が経過… ) こちらにキャラクターとステージの fbxファイルをアップしましたので、よろしければダウンロードしてください m(_ _)m ( Sword Bout のページにもダウンロードのリンクを張りました ) https://dxlib.xsrv.jp/SwordBout/File/SwordBoutResource.zip
メンテ
Re: 3Dモデルのフレームがねじれてしまう問題 ( No.4 )
名前:名無三(解決) 日時:2020/07/11 06:17

ありがとうございます、マップモデルなどにおいて参考にします! (IKに関しては間違いがありましたのでもう少し試行してきます)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存