3Dモデルをマウスで移動させたい

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

3Dモデルをマウスで移動させたい

#1

投稿記事 by わからんこ » 14年前

Dxlibを使って3Dモデルの表示を行い、

キーボードでの移動は理解できたのですが、次はマウスを使って移動させたと考えたのですが
行き詰まってしまいました。

私が実現したい動作としましては、

[マウスでクリックしたところに3Dモデルが歩いてくる]です。

私が詰まっているのが、マウスの位置座標をどうやってモデルの位置座標に変換するか

という所です。

カメラはモデルの斜め上から眺めている状態です。

参考になるサイト、本、勉強しなければならない事なども教えてください。

回答お願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 3Dモデルをマウスで移動させたい

#2

投稿記事 by h2so5 » 14年前

座標系の変換については、DXライブラリに関数があります。

http://homepage2.nifty.com/natupaji/DxL ... tml#R12N11

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

Re: 3Dモデルをマウスで移動させたい

#3

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

何を持ってマウスの2次元座標を3次元空間の座標とするかが問題です。
クリックポイントを描画されている地面の3次元空間値に変換するのか、仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。
そういうところは、どうお考えでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#4

投稿記事 by わからんこ » 14年前

>クリックポイントを描画されている地面の3次元空間値に変換するのか、

>仮想的に主人公の足元に広がるXZ平面を座標値にするのかで動きは変わってきます。

両者はどういった違いがあるのでしょうか?

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

Re: 3Dモデルをマウスで移動させたい

#5

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

マウスが指した地面・地形の方向に向かうと仮定すると主人公より画面2D座標上は↑方向にあるにもかかわらず3D空間上は手前(カメラに近い)ある地形も考えれるわけです。崖の出っ張りとかね。こうなると主人公は手前に移動してしまう訳ですね。これはフィールドタイプのゲームなら問題に成るパターンだと思います。
逆にシミュレーションやRTSならマウスの指している地形に向かって移動してくれないと話しにならないので逆にXZ平面で移動方向を決められると困るわけです。

と言うことで作るゲームの種類で理想は変わると言うお話です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#6

投稿記事 by わからんこ » 14年前

なるほど・・・

私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動

という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?

この網目を張り巡らせたステージを俯瞰から眺めている状態です。

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

Re: 3Dモデルをマウスで移動させたい

#7

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

わからんこ さんが書きました:なるほど・・・

私が考えているの、将棋の盤のように16×16の網目を作って、クリックしたマスに移動

という形なので、どちらかというと挙げて頂いた例の後者に近い形でしょうか?

この網目を張り巡らせたステージを俯瞰から眺めている状態です。
そういうことであれば、h2so5 さんが紹介したページを見れば地形ポリゴンの座標を得る方法が載っていますので試してみてください。
座標が分かればベクトルが分かるので移動できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#8

投稿記事 by わからんこ » 14年前

いろいろ試してみたのですが、いまひとつわかりません。

この場合、

ConvScreenPosToWorldPos( ) ;

これを使い、マウスの座標から、カメラの可視範囲の最短と最長を求め、

この二つを結んだ線分がわかるようになってので、

MV1_COLL_RESULT_POLY MV1CollCheck_Line( ) ;

が使えるようになり、マップ地面との当たり判定が可能。

当たりのフラグが立った位置がマウスで指定した、モデルが移動すべき場所の座標になる。

?こう考えているのですがうまくいかないです。

書いてて意味がわからなくなってしまいました

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

Re: 3Dモデルをマウスで移動させたい

#9

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

どううまく行かないのでしょうか?
それとサンプルそのままで実行してもダメですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#10

投稿記事 by わからんこ » 14年前

マウスが指すスクリーン座標を、ワールド座標に直すことができました。

多分ですが、、

今まではモデルの移動にはカメラの向いてる方向と入力を受けたキーを使って

ベクトルを作成し、モデルの座標と足して移動後の座標を求めていたのですが、

今、マウスの座標を使ってベクトルを算出する方法がわからないです・

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

Re: 3Dモデルをマウスで移動させたい

#11

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

モデルと目的地の3次元座標が分かるなら、それぞれのx,y,zの差分がベクトルです(高さが不要なら取り除いて下さい)。
ただし、そのままベクトルを足し込むと一気に目的地に達してしまうのでVNorm()関数で正規化したりVScale()で調整をしたりしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#12

投稿記事 by わからんこ » 14年前

がんばってみます!

わからんこ

Re: 3Dモデルをマウスで移動させたい

#13

投稿記事 by わからんこ » 14年前

アドバイスの通り、一気に目的地にたどり着くことはなくなったのですが、

モデルが向きべき方向はどうやって考えたらよいのでしょうか?

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

Re: 3Dモデルをマウスで移動させたい

#14

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

水平方向の2次元ベクトルからatan2で角度を求める方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#15

投稿記事 by わからんこ » 14年前

>水平方向の2次元ベクトルからatan2で角度を求める方法

ありがとうございます。ちょっと調べてきます。

Dxlibの座標系は左手座標系であっていますか?

床ポリゴンとの当たり判定の際、x軸成分が余り変化せず

y軸成分が変化しています。

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

Re: 3Dモデルをマウスで移動させたい

#16

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

DXライブラリは左手系のはずです。DirectXが左手系ですので。
まぁ、地面がどの座標平面なのかはカメラ次第というところもありますので、試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#17

投稿記事 by わからんこ » 14年前

すいません。

向きの問題はいまだに解決してないのですが、

その前にひとつ疑問がありまして、先の問題のモデルの移動の際、サンプルコードにあった、

// // ルートフレームの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モデルをマウスで移動させたい

#18

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

私の紹介したコードだじゃないですよね?
前後のコードが分からないとなんとも言えません。
※ 基本状態だとZ方向は奥行きのはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

わからんこ

Re: 3Dモデルをマウスで移動させたい

#19

投稿記事 by わからんこ » 13年前

解決したのですが、お礼も申し上げず放置してしまって申し訳ありません。

今後この様なことがないよう気をつけます。

閉鎖

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