1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
116: 名前は開発中のものです。 [sage] 2010/10/10(日) 07:27:55 ID:iMXoTcjW 一般的な方法としては、 ・E=視点座標、つまりカメラの位置をあらわす位置ベクトル ・L=投影面における視点からマウスカーソルまでの半直線ベクトル から、仮想空間内の任意の物体との交差判定、交差位置特定がきる。 Eは、普通、プログラム上で管理されている。 Lは、FOV(視野錘台)を自分で管理されているなら容易に計算できるが、 投影変換行列の逆行列を使っても計算できると思う(そういう便利な関数があるかもしれない)。 L = Mproj.inv x (mouseX,mouseY,1)T Mprij.inv = 投影変換行列の逆行列 (mouseX,mouseY,1) = マウスの座標(正規化装置座標系、同次座標表現) 特に、フィールドのような単一平面との交点計算は、 ・O=原点(フィールド面上にあること) ・N=フィールドの法線ベクトル(正規化ベクトル) に対して、Eがフィールドの表面にあると限定した場合、 LとNの内積が0以上の場合、交差しない(マウスカーソルは天空を指している) さもなければ、 ・h= フィールド面からEまでの高さ((E-O)とNの内積) から、 ・t= -h/(LとNの内積) を求めれば、目的とするフィールド上の点Fは、 ・F= E+L*t のような手順で計算できるはず。 あとは、(F-O)をフィールドの座標軸(X-O)(Y-O)で分解すれば、2次元座標に戻せる。 うろ覚えで書いているので細かい間違いがあるかも知れないが(違ってたら乞指摘)、 ゆっくりでいいんで、参考にしてもらえれば嬉しい。 頑張れ! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/116
120: SGGK ◆6pZCoAtaxk [sage] 2010/11/01(月) 00:11:40 ID:IY/H8hBE >>119 こ…、これは気付きませんでした。ありがとうございます。 試しにサンプルで使えそうな部分をコピーしてプログラムソースに貼り付けてまさかのコンパイル。 これではおそらくバグが山積みだろうと思ったら、予想外に通った。画像の文字の意味についてはまだ理解出来てません。 サンプルでは、スクリーン上のマウス座標から直線が延びているイメージで、ワールド座標内のポリゴンに当たったらそこが黄色になるという内容だろうと解釈。 マウスを左上に持っていくとフィールドの左上が黄色、右下にもっていくと右下が黄色、フィールド外だと変化なし。 とにかく反応していることが確かめられたので、このサンプルコードを自分がやろうとしていることを実現できるように 書き変えられるか考えてみようと思います。 参考画像をうp ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0134jpg.html もちろん>>116〜118についても継続するので、並行作業で行く予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/120
122: SGGK ◆6pZCoAtaxk [sage] 2010/11/04(木) 22:06:09 ID:vVAyUmeW >>121 >118の本の学習がなかなか進まなかったため、ご無沙汰してしまいました。(汗; ときどき停止するかもしれませんが頑張ります。 本の方は8章(〜144ページ)で一区切り。とりあえず8章まで読めればなんとかなりそうなので9章までの予定は中止。 14章も一部分だけ読んでみた。残りは必要なときが来たら挑戦するつもり。 >>116氏のをもう一度読んでみたところあともう少しでわかりそうな気がしてきたので、 あとはネット検索で投影変換行列を調べてみる予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/122
123: SGGK ◆6pZCoAtaxk [sage] 2010/11/11(木) 00:10:14 ID:OH7eCgI8 >>116氏のアドバイスについて今の自分に出来るところまで図示で理解しようとしてみたのでUP。 視野錘台がうまく斜めに書けていないとかいろいろあるけど、 この状態からさらに理解が進めばDXライブラリを使って自分なりの関数をどのように作ればよいのかがわかるかも…、 そんな時が来るかもしれないと期待してここでいったん区切ることにしてみます。(感謝!) いつも使わせてもらってたアップローダがサービス停止のようなので、いろいろ探して以下のところにしてみた。 (アップローダを使ってるスレを探してたらNE○Tスレを偶然見てこのアップローダの存在を知った。) 他にお勧めのアップローダがあれば、柔軟に対応します。 ttp://ux.getuploader.com/sggk/ 次は>>119氏のヒントを元に次の行動を決める予定 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/123
124: 名前は開発中のものです。 [sage] 2010/11/11(木) 00:28:36 ID:Jw3X6bp+ >>116 の Lは、 GetMousePoint( &Mx, &My ) ; ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) - E ; で求まるんじゃないだろうか。 そこで詰まったんじゃないの? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/124
139: SGGK ◆6pZCoAtaxk [sage] 2011/01/17(月) 23:51:17 ID:Px2vRAS2 >>115で言った >とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。 については、どうやら出来そうな感じ。 それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど、 テストプログラムでは、試したいDXライブラリの関数をメインループにそのまま書き込んだだけなので、 今までのクラスを使ったやり方に比べ単純な例で試して上手くいったと自分が思っているだけなのかもしれないので、 今度は、今までの2Dで動かしていたプログラムの中身を少しずつ3Dのライブラリ関数に置き換えて 動作を確認していき、これでうまくいくようならUPする予定。 フィールド上の一点を指定する方法については、 >>116氏の7行目の投影変換行列の逆行列を使う方法では、 自分の力不足のため投影変換行列を作れないので断念。 座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。 ライブラリを作れる人はすごいと思った。 >>119氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。 >>124氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。 これでやっと>>65に取り掛かる直前の状況になってきた感じ。(感謝!) もしうっかりスルーしてしまった項目があった場合、指摘あれば対応します。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/139
258: 名前は開発中のものです。 [sage] 2011/06/10(金) 19:38:35.81 ID:HbOQx0Jb 期限を守ることよりも確実に仕上げていくことが大事ですよ。 それと、安易に妥協しないことも終盤でのモチベーション維持につながると思います。 1番2番に関係しますが、>>116 は理解できましたか? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/258
259: SGGK ◆6pZCoAtaxk [sage] 2011/06/11(土) 00:17:49.91 ID:TMzi+Wx3 >>258 アドバイス、ありがとうございます。 そうですね。確かにそのような気もしてきました。(>>116の理解は一応大丈夫かなと思ってます。) もう少し1番を頑張ってみてカメラを動かせるようになってから、>>257をやってみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/259
338: SGGK ◆6pZCoAtaxk [sage] 2012/01/30(月) 23:23:48.35 ID:9k8tvKVu 次は>>116を参考にした処理がプログラム内に散らばっているので、これも整理しようと思う。 昨日と違い面倒なところがあるので時間かかるかもしれない。 昨日のはひとつのクラス内での話なので、一部分の処理を関数として書き直したい場合、 そのクラス内のメンバ関数として定義して使えば動くけど、 今回やろうとしているのは、処理がいろいろなクラスで使われているので、 今考えられるやり方としては、その処理を行う関数をメンバ関数にもつ新しいクラスを作って、 その新しいクラスのオブジェクトを>>116の処理を使っているいろいろなクラス内で定義する。 あとはその新しいクラスのオブジェクト経由?で>>116の処理を行うメンバ関数を呼び出せばなんとかできるのではと期待。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/338
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.019s