ページ 1 / 1
3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 15:45
by わからんこ
Dxlibを使って3Dモデルの表示を行い、
キーボードでの移動は理解できたのですが、次はマウスを使って移動させたと考えたのですが
行き詰まってしまいました。
私が実現したい動作としましては、
[マウスでクリックしたところに3Dモデルが歩いてくる]です。
私が詰まっているのが、マウスの位置座標をどうやってモデルの位置座標に変換するか
という所です。
カメラはモデルの斜め上から眺めている状態です。
参考になるサイト、本、勉強しなければならない事なども教えてください。
回答お願いします。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 15:49
by h2so5
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 16:45
by softya(ソフト屋)
何を持ってマウスの2次元座標を3次元空間の座標とするかが問題です。
クリックポイントを描画されている地面の3次元空間値に変換するのか、仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
そういうところは、どうお考えでしょうか?
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 18:46
by わからんこ
>クリックポイントを描画されている地面の3次元空間値に変換するのか、
>仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
両者はどういった違いがあるのでしょうか?
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 19:02
by softya(ソフト屋)
マウスが指した地面・地形の方向に向かうと仮定すると主人公より画面2D座標上は↑方向にあるにもかかわらず3D空間上は手前(カメラに近い)ある地形も考えれるわけです。崖の出っ張りとかね。こうなると主人公は手前に移動してしまう訳ですね。これはフィールドタイプのゲームなら問題に成るパターンだと思います。
逆にシミュレーションやRTSならマウスの指している地形に向かって移動してくれないと話しにならないので逆にXZ平面で移動方向を決められると困るわけです。
と言うことで作るゲームの種類で理想は変わると言うお話です。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 19:47
by わからんこ
なるほど・・・
私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動
という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?
この網目を張り巡らせたステージを俯瞰から眺めている状態です。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 19:58
by softya(ソフト屋)
わからんこ さんが書きました:なるほど・・・
私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動
という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?
この網目を張り巡らせたステージを俯瞰から眺めている状態です。
そういうことであれば、h2so5 さんが紹介したページを見れば地形ポリゴンの座標を得る方法が載っていますので試してみてください。
座標が分かればベクトルが分かるので移動できると思います。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月21日(月) 23:10
by わからんこ
いろいろ試してみたのですが、いまひとつわかりません。
この場合、
ConvScreenPosToWorldPos( ) ;
これを使い、マウスの座標から、カメラの可視範囲の最短と最長を求め、
この二つを結んだ線分がわかるようになってので、
MV1_COLL_RESULT_POLY MV1CollCheck_Line( ) ;
が使えるようになり、マップ地面との当たり判定が可能。
当たりのフラグが立った位置がマウスで指定した、モデルが移動すべき場所の座標になる。
?こう考えているのですがうまくいかないです。
書いてて意味がわからなくなってしまいました
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月22日(火) 10:53
by softya(ソフト屋)
どううまく行かないのでしょうか?
それとサンプルそのままで実行してもダメですか?
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月23日(水) 01:23
by わからんこ
マウスが指すスクリーン座標を、ワールド座標に直すことができました。
多分ですが、、
今まではモデルの移動にはカメラの向いてる方向と入力を受けたキーを使って
ベクトルを作成し、モデルの座標と足して移動後の座標を求めていたのですが、
今、マウスの座標を使ってベクトルを算出する方法がわからないです・
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月23日(水) 11:11
by softya(ソフト屋)
モデルと目的地の3次元座標が分かるなら、それぞれのx,y,zの差分がベクトルです(高さが不要なら取り除いて下さい)。
ただし、そのままベクトルを足し込むと一気に目的地に達してしまうのでVNorm()関数で正規化したりVScale()で調整をしたりしてください。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月24日(木) 01:24
by わからんこ
がんばってみます!
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月26日(土) 22:21
by わからんこ
アドバイスの通り、一気に目的地にたどり着くことはなくなったのですが、
モデルが向きべき方向はどうやって考えたらよいのでしょうか?
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月26日(土) 22:51
by softya(ソフト屋)
水平方向の2次元ベクトルからatan2で角度を求める方法があります。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月26日(土) 23:39
by わからんこ
>水平方向の2次元ベクトルからatan2で角度を求める方法
ありがとうございます。ちょっと調べてきます。
Dxlibの座標系は左手座標系であっていますか?
床ポリゴンとの当たり判定の際、x軸成分が余り変化せず
y軸成分が変化しています。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月27日(日) 00:08
by softya(ソフト屋)
DXライブラリは左手系のはずです。DirectXが左手系ですので。
まぁ、地面がどの座標平面なのかはカメラ次第というところもありますので、試してみてください。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月28日(月) 23:16
by わからんこ
すいません。
向きの問題はいまだに解決してないのですが、
その前にひとつ疑問がありまして、先の問題のモデルの移動の際、サンプルコードにあった、
// // ルートフレームのZ軸方向の移動パラメータを無効にする
// {
// MATRIX LocalMatrix ;
// //ユーザー行列を解除する
// MV1ResetFrameUserLocalMatrix(mod.ModelHandle,2);
// // 現在のルートフレームの行列を取得する
// LocalMatrix=MV1GetFrameLocalMatrix(mod.ModelHandle, 2 );
// // Z軸方向の平行移動成分を無効にする
// LocalMatrix.m[ 3 ][ 2 ] = 0.0f ;
//
// // ユーザー行列として平行移動成分を無効にした行列をルートフレームにセットする
// MV1SetFrameUserLocalMatrix( mod.ModelHandle, 2, LocalMatrix ) ;
// }
この部分をコメントアウトすることでうまく移動できるようになったのですが、
このコードの意味はどういったもですか?
一応私の考えは、モデルが上下移動しない(意図しない空中浮遊?)為のコード
かと思うのですが・・・
ではなぜY軸ではなくZ軸をいじるのかがわからなくなっているので、
回答おねがいします。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年5月29日(火) 00:33
by softya(ソフト屋)
私の紹介したコードだじゃないですよね?
前後のコードが分からないとなんとも言えません。
※ 基本状態だとZ方向は奥行きのはずです。
Re: 3Dモデルをマウスで移動させたい
Posted: 2012年6月30日(土) 14:49
by わからんこ
解決したのですが、お礼も申し上げず放置してしまって申し訳ありません。
今後この様なことがないよう気をつけます。