3Dモデルをマウスで移動させたい
-
わからんこ
3Dモデルをマウスで移動させたい
Dxlibを使って3Dモデルの表示を行い、
キーボードでの移動は理解できたのですが、次はマウスを使って移動させたと考えたのですが
行き詰まってしまいました。
私が実現したい動作としましては、
[マウスでクリックしたところに3Dモデルが歩いてくる]です。
私が詰まっているのが、マウスの位置座標をどうやってモデルの位置座標に変換するか
という所です。
カメラはモデルの斜め上から眺めている状態です。
参考になるサイト、本、勉強しなければならない事なども教えてください。
回答お願いします。
キーボードでの移動は理解できたのですが、次はマウスを使って移動させたと考えたのですが
行き詰まってしまいました。
私が実現したい動作としましては、
[マウスでクリックしたところに3Dモデルが歩いてくる]です。
私が詰まっているのが、マウスの位置座標をどうやってモデルの位置座標に変換するか
という所です。
カメラはモデルの斜め上から眺めている状態です。
参考になるサイト、本、勉強しなければならない事なども教えてください。
回答お願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
何を持ってマウスの2次元座標を3次元空間の座標とするかが問題です。
クリックポイントを描画されている地面の3次元空間値に変換するのか、仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
そういうところは、どうお考えでしょうか?
クリックポイントを描画されている地面の3次元空間値に変換するのか、仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
そういうところは、どうお考えでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
>クリックポイントを描画されている地面の3次元空間値に変換するのか、
>仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
両者はどういった違いがあるのでしょうか?
>仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
両者はどういった違いがあるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
マウスが指した地面・地形の方向に向かうと仮定すると主人公より画面2D座標上は↑方向にあるにもかかわらず3D空間上は手前(カメラに近い)ある地形も考えれるわけです。崖の出っ張りとかね。こうなると主人公は手前に移動してしまう訳ですね。これはフィールドタイプのゲームなら問題に成るパターンだと思います。
逆にシミュレーションやRTSならマウスの指している地形に向かって移動してくれないと話しにならないので逆にXZ平面で移動方向を決められると困るわけです。
と言うことで作るゲームの種類で理想は変わると言うお話です。
逆にシミュレーションやRTSならマウスの指している地形に向かって移動してくれないと話しにならないので逆にXZ平面で移動方向を決められると困るわけです。
と言うことで作るゲームの種類で理想は変わると言うお話です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
なるほど・・・
私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動
という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?
この網目を張り巡らせたステージを俯瞰から眺めている状態です。
私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動
という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?
この網目を張り巡らせたステージを俯瞰から眺めている状態です。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
そういうことであれば、h2so5 さんが紹介したページを見れば地形ポリゴンの座標を得る方法が載っていますので試してみてください。わからんこ さんが書きました:なるほど・・・
私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動
という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?
この網目を張り巡らせたステージを俯瞰から眺めている状態です。
座標が分かればベクトルが分かるので移動できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
いろいろ試してみたのですが、いまひとつわかりません。
この場合、
ConvScreenPosToWorldPos( ) ;
これを使い、マウスの座標から、カメラの可視範囲の最短と最長を求め、
この二つを結んだ線分がわかるようになってので、
MV1_COLL_RESULT_POLY MV1CollCheck_Line( ) ;
が使えるようになり、マップ地面との当たり判定が可能。
当たりのフラグが立った位置がマウスで指定した、モデルが移動すべき場所の座標になる。
?こう考えているのですがうまくいかないです。
書いてて意味がわからなくなってしまいました
この場合、
ConvScreenPosToWorldPos( ) ;
これを使い、マウスの座標から、カメラの可視範囲の最短と最長を求め、
この二つを結んだ線分がわかるようになってので、
MV1_COLL_RESULT_POLY MV1CollCheck_Line( ) ;
が使えるようになり、マップ地面との当たり判定が可能。
当たりのフラグが立った位置がマウスで指定した、モデルが移動すべき場所の座標になる。
?こう考えているのですがうまくいかないです。
書いてて意味がわからなくなってしまいました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
どううまく行かないのでしょうか?
それとサンプルそのままで実行してもダメですか?
それとサンプルそのままで実行してもダメですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
マウスが指すスクリーン座標を、ワールド座標に直すことができました。
多分ですが、、
今まではモデルの移動にはカメラの向いてる方向と入力を受けたキーを使って
ベクトルを作成し、モデルの座標と足して移動後の座標を求めていたのですが、
今、マウスの座標を使ってベクトルを算出する方法がわからないです・
多分ですが、、
今まではモデルの移動にはカメラの向いてる方向と入力を受けたキーを使って
ベクトルを作成し、モデルの座標と足して移動後の座標を求めていたのですが、
今、マウスの座標を使ってベクトルを算出する方法がわからないです・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
モデルと目的地の3次元座標が分かるなら、それぞれのx,y,zの差分がベクトルです(高さが不要なら取り除いて下さい)。
ただし、そのままベクトルを足し込むと一気に目的地に達してしまうのでVNorm()関数で正規化したりVScale()で調整をしたりしてください。
ただし、そのままベクトルを足し込むと一気に目的地に達してしまうのでVNorm()関数で正規化したりVScale()で調整をしたりしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
水平方向の2次元ベクトルからatan2で角度を求める方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
>水平方向の2次元ベクトルからatan2で角度を求める方法
ありがとうございます。ちょっと調べてきます。
Dxlibの座標系は左手座標系であっていますか?
床ポリゴンとの当たり判定の際、x軸成分が余り変化せず
y軸成分が変化しています。
ありがとうございます。ちょっと調べてきます。
Dxlibの座標系は左手座標系であっていますか?
床ポリゴンとの当たり判定の際、x軸成分が余り変化せず
y軸成分が変化しています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
DXライブラリは左手系のはずです。DirectXが左手系ですので。
まぁ、地面がどの座標平面なのかはカメラ次第というところもありますので、試してみてください。
まぁ、地面がどの座標平面なのかはカメラ次第というところもありますので、試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
わからんこ
Re: 3Dモデルをマウスで移動させたい
すいません。
向きの問題はいまだに解決してないのですが、
その前にひとつ疑問がありまして、先の問題のモデルの移動の際、サンプルコードにあった、
// // ルートフレームの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軸をいじるのかがわからなくなっているので、
回答おねがいします。
向きの問題はいまだに解決してないのですが、
その前にひとつ疑問がありまして、先の問題のモデルの移動の際、サンプルコードにあった、
// // ルートフレームの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軸をいじるのかがわからなくなっているので、
回答おねがいします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3Dモデルをマウスで移動させたい
私の紹介したコードだじゃないですよね?
前後のコードが分からないとなんとも言えません。
※ 基本状態だとZ方向は奥行きのはずです。
前後のコードが分からないとなんとも言えません。
※ 基本状態だとZ方向は奥行きのはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。