ページ 11

3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 00:11
by AliceCoder
環境windows7 64bit, vc2010, C++

3Dのゲームを作ろうと思っています。
タイトルのとおり、球状の上をキャラに歩かせたいです

キャラはジャンプ、上下左右に移動できる
キャラが球の上に乗っていて、球転がしているみたいなイメージ
後に敵や球の地形も変化させたい(ゴツゴツの地形など・・・)
ずっとまっすぐ歩いたらもちろん最初にいた地点に戻る

どういう風に作ればよいのか悩んでいる状況です
自分なりの考えで、球の上をキャラが移動するだけを作ってみました
キャラに、球の半径分移動させた後、 回転(移動量)させ、 最後に球の半径分移動した分を引くという行列を適用させて作ってみました。
これに敵などを追加させようとなるとかなりややこしくて難しくなる気がします
キャラは常にまっすぐたっている状態でいいのですが、敵などは球状の地形に合わせて体を回転させないといけません(地面に垂直に)
そして一番の難関がゴツゴツなどの地形にすることです
まずこれはゴツゴツの球を表示させること自体が自分的に難しいです
メタセコイアでXファイルとしてつくるか、配列などで何とか表現してやるか
配列で表現できたら後々楽できそうですけど自分では表現の仕方が思いつきませんでした。
Xファイルで作った場合の地形との判定が、全てのポリゴンとの判定になると思うのですが処理的に重過ぎると思いました。

どのように設計したらいいのか意見などを聞きたいです
説明が下手なので、説明で足りないところがあったら聞いてください

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 00:32
by softya(ソフト屋)
これマリオギャラクシーでも苦労したと聞いているので結構難しいと思います。
マリオギャラクシーに近いイメージですよね?

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 00:51
by AliceCoder
softya(ソフト屋) さんが書きました:これマリオギャラクシーでも苦労したと聞いているので結構難しいと思います。
マリオギャラクシーに近いイメージですよね?
マリオギャラクシーを先ほど確認したところ私のイメージどおりでした
やっぱり作るのって難しいんですね
もう少しこの質問を続けてみて、いい意見がなければ、できるか分かりませんけど無理やり作ってみることにします。

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 00:54
by h2so5
地形との判定についてはそれほど心配する必要はないんじゃないかと思います。
DXライブラリでも実装されていますが、空間分割によって近くのポリゴンとだけ判定することができます。

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 00:55
by softya(ソフト屋)
当たり判定は球の中心にレイを飛ばして当たり判定するって方法があります。
これは地面にレイを飛ばして地形判定するって行為の応用です。

マリオギャラクシーの様に複数の球が相互作用しなかれば何とか成るかと思いますが、どうしょう?

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 01:16
by AliceCoder
h2so5 さんが書きました:地形との判定についてはそれほど心配する必要はないんじゃないかと思います。
DXライブラリでも実装されていますが、空間分割によって近くのポリゴンとだけ判定することができます。
なるほど、そういう手法があったんですね。勉強になりました。ありがとうございます
softya(ソフト屋) さんが書きました:当たり判定は球の中心にレイを飛ばして当たり判定するって方法があります。
これは地面にレイを飛ばして地形判定するって行為の応用です。

マリオギャラクシーの様に複数の球が相互作用しなかれば何とか成るかと思いますが、どうしょう?
なるほど、とりあえず地形との当たり判定はできそうに感じました。ありがとうございます

移動の処理などは今のままでいいのでしょうか
移動量を表すX,Y,Zをfloat型で宣言
まっすぐすすむとZに値を加算
本文にかいてある回転のときにZ分だけ回転
今は奥にしか移動を試していません
Yは球の半径に加算して処理しようかと思います

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 01:20
by softya(ソフト屋)
全部ベクトルで計算してください。
現在位置からの移動方向は、球体中心線に対して垂直なベクトルです。
体が落ちる方向も球体中心へのベクトルです。

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 02:55
by GRAM
完全に素人の意見なのであまり当てにしないでください。

「仮定:キャラクターは常に足が球体の中心を向いている」というのならば、
他にもっと素晴らしいやり方がたぶんあるんだろうということを考えたうえで
こんなのはどうだろう?というのを挙げます。
キャラクター毎に保持しているクォータニオンと半径で全キャラクターの位置と向きを決めるというやり方です。
このやりかたはキャラクターは浮動小数点数5つで、向きも含めて一意に場所が決まります。
(ただし必要に応じてx,y,z座標系も用います。こちらは上の5つから毎フレーム求めればいいと思います。)
クォータニオンじゃなくて回転行列でも多分おんなじことができると思います。
以下左手座標系で考えますが、概念的なものなのでどの座標系でもおよそ一緒だと思います

まず全キャラクターの配置ですが、x=0,y=0,z=0が球体の中心だとします
①すべてのキャラクターをx=0,y=0,z=0,z正の方向にxy平面に垂直に立つように配置します。
②各キャラクターが保持しているクォータニオンでそれぞれのキャラクターを回転させます
③保持している半径分だけ中心から外に動かします
これで球体上に一意にキャラクターが配置できると思います。
キャラクターの頭の向きが分かってて、かつ大きさが1ならずらすのはそのベクトルにrをかけるだけです。
つまり(0,r,0)のベクトルにクォータニオンQを与えたものがその物体の現在位置(x,y,z)です。

次に移動ですが
①現在キャラクターが向いている方向ベクトル(x,y,z座標系)は、キャラクターの前方向のベクトル(0,0,1)にクォータニオンを与えることで得られると思います。
②半径1の球体で速度aが出るようなキャラクターを半径rの位置で同じ速度で動かすのならば回転速度dθはdθ=a/rです。
③回転軸vは、頭の方向ベクトルと、①で求めたベクトルとの外積を取れば得られます。
④回転クォータニオン⊿Q = q(v,dθ)を求めます。
⑤現在のクォータニオンQにQ = Q*⊿Qの演算をします

向きの変更ですが
回転速度をbとして、回転軸v'は最初に求めた頭の方向なので、Q = Q* q(v',b)でいいかと

多分ですけど、移動についてはどの方向に歩いても1週して元の位置に戻ってこれると思います。
追尾のような簡単なものであれば
①自分と相手との相対位置ベクトル(x,y,z座標系)を得る
②頭の方向ベクトルを法線ベクトルにするような平面上へ写像する
③自分の向きベクトルが②で得られたベクトルと同じ向きになるように回転角b以内で向き変更する
で行けるんじゃないかと。(いけないかもしれません)

目線が合うかどうかとか、地面との接触とかは、ふつうの3Dのやり方と一緒だと思います。
結局はポリゴンと線分とが当たるかどうかということだと思うので。(その向きがy軸方向かそうでないかはあるにしろ)

あとクォータニオンを使ったのは、その他動くものについてsquadが使えると思ったからです。
つまるところクォータニオンならばスプライン曲線的なものが書けます。
(実は最初に巡回とかどうするんだろう?と思って浮かんだのがこれだったのでクォータニオンを使いました。)

ただしこれはあくまでも最初の仮定を成り立たせた場合です。
大陸間弾道ミサイルみたいな3次元的な回転をするものはわかりません。(足が下向いてるという仮定をそれてるから)
あとやっぱり僕が小一時間考えた程度では具体的な難所とかはやはり実際に作ったことがないのでよくわかりません。無責任ですがごめんなさい。

Re: 3Dゲーム 球状の上をキャラに歩かせたい

Posted: 2013年8月02日(金) 08:47
by AliceCoder
GRAMさん丁寧に解説していただきありがとうございます
具体的に書いてくださったので、とりあえずGRAMさんのやり方でやってみたいと思います

softya(ソフト屋) さん
ベクトルで管理する方法も試してみたいと思います
ありがとうございました

とりあえず解決ということにしときます