CAVE9

今日はレースゲームプログラムと3Dデータ読み込みプログラムがちゃんと動いた、バンザーイ!しかも、担当の教授が「土日も自分がいるときに使ってもいいよ」とメアド交換、ヤッター! 今日はいい日だー

<今日やったこと>
・レースゲームプログラムがVS.netが入っていないPCで動かなかった問題解決、無事表示できました。

・同じ問題で動かなかった3Dデータ表示プログラムもうまくいきました。

今日は他にもCAVEの動作を確認するプログラムをいくつか動かしてみる予定でしたが、残りの時間は担当の教授にこのプログラムを見てもらうことに使いました。なんせ、ビジュアルのインパクトは今までで最大なので。教授ともいろんな話をして、楽しんでもらえたようです。

明日は、研究課題を表示するプログラムの改良、これも楽しみ。

投稿者 robosheep : 2005年11月25日 20:32 | トラックバック

CAVE8

 今日は久しぶりのCAVEだったのに1時間も使えなかった・・・。会議の結果、僕にCAVEを一人で使用できる権限を与えてもらったはずなのだが、管理の方の教授は二人以上でないと駄目だと考えているらしい。高価な機械だし、デリケートなので心配するのは分かるが、研究がぜんぜん進まない。もっとCAVE使いたい・・・。

とりあえず今日の結果

・jpeg読み込みライブラリを使ったプログラムがコンパイルできない問題が少し解決。プロパティ->c/c++->コード生成->ランタイムライブラリを変えたら、コンパイルできた。最初は(別な学生が設定したものだが)マルチスレッドDLLになっていたが、デバックモードだったのでマルチスレッド デバック DLLにした。それからCAVEライブラリもlibcave_ogl_mt_MD.libからlibcave_ogl_mt_MDd.libに変更。

・上のプログラムでコンパイルはできたが、3番目のPC(側面描画用)でMSVCP71D.dllがありませんというエラーメッセージが出て、実行できなかった。コントロール(1番目の)PCにはVC++.netが入っているので、.NET Framework SDKもインストールされているが、他のPCには入っていないためこのような事態になったものと考えられる。

・ナビゲーション関数がどう働いているのか調べるプログラムを作って実行。原因不明のエラーで停止。

投稿者 robosheep : 2005年11月18日 19:10 | トラックバック

2次元レースゲームのコース当たり判定できた

2drace01.jpg

GAME PROGRAMMING GEMSのアルゴリズム。
水平な(すべての頂点のY座標が0な)4角形があるとして、ある点P(X,Z)がその4角形の各辺からどのぐらいの割合の位置にあるのかを高速に割り出せるものです。一度に一方向(縦横/前後)しか測定できませんが、それでも高速です。
とりあえず前後方向に調べるとして
P:調べたい位置
Pl:後方の辺上の任意の点
Pt:前方の辺上の任意の点
Nl:内側を向いた後方の辺上の単位法線
Nt:内側を向いた前方の辺上の単位法線
・:ベクトルの内積
Vlp=P-Pl
Vtp=p-pt
として求める値、D(0~1の浮動小数点数値)は
D=Vlp・Nl/(Vlp・Nl + Vtp・Nt)

このDは後方の辺から前方の辺への位置の割合を示していて、後方の辺上では0.0、前方の辺上では1.0になるばかりではなく、中間では0.5、4角形から前方にはみ出すと1.0以上、後方に出ると、0.0以下と適切な値を返してくれます。この関数が驚異的なのは早さもありますが、4角形がどんな形であっても使えるということです。もちろん後方の辺と前方の辺が平行でなくても全然かまいません。すごいっすねぇ

デバック用に頂点だとか辺法線を表示してますが、一応ちゃんと当たり判定してます。あたった後の処理は減速するだけなんですが。まぁとりあえず一息つけます。
でもよく考えてみたら、これは当たり判定に使うべきではない?この限定条件ならもっと高速なアルゴリズムがあるんだろうか?

投稿者 robosheep : 2005年11月13日 16:55 | トラックバック

当たり判定用コースの判別

GAME PROGRAMMING GEMSにレースゲームでのコース移動距離を調べる面白いアルゴリズムが載っていたので、それを使ってモデリングで作る当たり判定領域ができないか考えています。

んで、そのためには3角ポリゴンの塊であるコースを調べて、4角ポリゴンに分けなくてはいけません。これが思ってたより難しく、手間取りました。

やり方としては
1. 最初の4角形を決める
 1.1. 1番目の3角形を最初の4角形の1部とする。
 1.2. それに隣接する(2頂点を共有する)3角形を探す(必ず2つある)
 1.3. 2つの3角形をそれぞれ元の三角形と合わせて4角形を作り、その全長が短い方を正しい4角形とする。
 1.4. 最初の4角形に隣接する(2頂点を共有する)3角形を探す(必ず2つある)。そして、(どちらでもいいので)最初の3角形を次の4角形の一部とする。

2.2つ目以降の4角形を決める
 2.1. 今回の4角形の一部である3角形は決まっているので、これに隣接する3角形を探す
 2.2. そのうち、前回の4角形の一部ではないもの(1点しか共有しないもの)を選び、合わせて4角形を作る。
 2.3. この4角形に隣接する(2頂点を共有する)3角形を探す(必ず2つある)
 2.4. そのうち、前回の4角形の一部ではないもの(共有点を持たないもの)を次の4角形の1部とする。
 以下 2.1.〜2.4.を繰り返し

人間が物を見て何気なく判別してることって、コンピュータにやらせると難しいのだと改めて感じました。もっとシンプルなアルゴリズムがあるはずなので、なんか思いついたら教えてください、よろしく。

とりあえずMilkShape 3D でデータを作って、プログラムにかけました。それが次の画像。
collision01.gif

3角ポリゴンの並んだ面が、4角ポリゴンの面になっています、成功〜。

投稿者 robosheep : 2005年11月12日 22:39 | コメント (1) | トラックバック


一番最初の4角ポリゴンを見つける方法(全長が短い方を正しいとする)が、なんか微妙なんだよなぁ。もっと確実は方法はないものか・・・。

投稿者 robosheep : 2005年11月13日 08:57

4次元立方体表示

hypercube01.jpg

 4次元物体のデータ(点、線、2次元面)を読み込んで描画するプログラムです。4次元立方体データを書き込むプログラムを作り、これで表示してみました。

 4次元立方体を定義するのは簡単だと思ってたんですが意外に難しい。できることにはできるんですが、綺麗なコードになりません、誰か御教授を。

まぁ それぞれの座標を2進数の各桁として、各頂点を定義する(0101→p(-1,1,-1,1))まではいいとして。それぞれの点の2進数値の”ハミング距離が1の2つの点に線を”、”ハミング距離が2以下の4つの点に面を”張るっていうのでいいと思うんですが、実際のコードがどうしても汚くなってしまいますです・・・・。

投稿者 robosheep : 2005年11月10日 15:17 | トラックバック

CAVE7

 あー 疲れた、さすがに6時間あの部屋はつらい。空気は悪いし、5台のCRTと3D酔い発生器からの攻撃力が予想以上に強い。ということで、7回目いってみよう。

 今日はレースプログラムと3Dデータ表示、それからいままでの問題直したやつに、音とJoyPadのテストまでやろうとしてたので、ウキウキでした。最初は・・・。

<今日やったこと>

・ブレンドがうまくいかない問題解決。Depth Testに加えglDepthFuncをGL_ALWAYSにしたら、直った。普通にOpenGLでの僕のミスです。

・4次元上の点を表示するプログラム成功。ワンド(コントローラ)の位置座標の範囲が分かったら、ほぼ問題解決しました。

・迷路を表示するプログラムで、ゲームの進行を”開始画面”、”ゲーム”、”終了画面”に分けて、開始画面、ゲームを別なファイルにしたものを作りました。それはその状態ではコンパイルできず、結局開始画面を削除しました。

・CAVEで下プロジェクタに投影される映像が正しくない問題解決。やっぱりglLoadIdentityはCAVEでは使っちゃ駄目みたいです。代わりにglPushMatrix、glPopMatrixを使いました。

・迷路プログラムでglLoadIdentityを使わなかったときに、開始位置がおかしくなる問題解決。結局、開始位置が変なのではなく、迷路全体が小さすぎて位置がおかしく見えるだけでした。迷路を10倍ぐらいにしたら。普通に見えるようになりました。

・迷路は普通に表示できるようになりましたが。CAVEの4つの画面で微妙に位置がずれているのを発見。よく見ると、それぞれの画面で別な移動&当たり判定プロセスが動いているみたいです。(ありえん・・・。)

・上の問題が解決するかもと思い、OpenGLの行列変換関数(glRotate, etc...)などを使わずに、CAVENav~関数だけで移動・回転を行なうようにしようとしましたが、どうやってもうまくいかず。位置がずれたり、移動がおかしかったりしてました。(わからん・・・)

・迷路を改造したレースゲームのプログラムをコンパイルできず!Windows用に作ったプログラムさえ、同じ意味不明なエラーを吐いて、コンパイルされません。原因はJPEGファイルを読み込むライブラリにあるようです。画像は全部BMP使えってことでしょうか?・・・。

・レースゲームと同じ理由により、3Dデータを読み込むプログラムもコンパイルできずTT。今日一番楽しみにしてたのはこの2つだったのに・・・・。

・音、出ました。そりゃそうだWindows起動音してたし、いつも。

・JoyPad認識、んでJoyToKeyを使ってキーボード等の入力に変えて、CAVEでそれをつかまえることで、JoyPadでコントロールできるようになりましたー、やったー。USB延長ケーブル使えば距離の問題も解決。みんなが慣れ親しんだ、ゲームコントローラーの方がやっぱ使いやすいです。


 こんなんで、右の杭を打つと左の杭が出るがごとく、過去のバグを直したら新たなバグが発生しました。まともなプログラム動かせるのは、いつになることやら。

投稿者 robosheep : 2005年11月08日 20:42 | コメント (1) | トラックバック


そういえば、CAVEでの当たり判定についてもっと考えなくてはいけないことに気づきました。
というのもCAVEはOpenGL単位で10*10の立方体を現実の装置と結び付けています。つまり、視点を中心に小さな範囲で当たり判定を行っても、装置の中で人間が隅に移動してしまえば通れないはずの壁を抜けてしまうのです。

投稿者 robosheep : 2005年11月11日 20:26

3Dファイルの読み込み

http://www.morrowland.com/apron/tut_gl.php

 ここのサイトのプログラム参考にして、とりあえず3Dファイルの読み込み成功。しかし、Blenderとか利用できる3DCGソフトのデータはまだ読み込めん。ということで、サイトのサンプルデータしかロードできてないので、アップはしません。


 あと衝動買いで、衝突判定の本買っちまいました。明日には届くだろう。データのロードもうまくいったし、次は当たり判定ですよやっぱり。


 しかし、どう見てもゲーム作りだよな・・・・。まぁ研究もやってるし、教授も喜んでるし、大学に貢献してるんで問題ない!

投稿者 robosheep : 2005年11月06日 17:35 | コメント (1) | トラックバック


衝突判定の本、今日届いたー やほー。あー ゆっくりよみてぇー

投稿者 robo sheep : 2005年11月08日 21:24

レースゲームを作りたい

3drace01.jpg

3DRace01.zip

ということで、次のサンプル。ってただ迷路を大きくして加速度つけただけなんだけどね・・・。
まぁ最初ってことで。

<操作方法>
マウス左:加速、ゲームスタート
マウス右:減速
マウスで画面上:上移動
マウスで画面下:下移動
マウスで画面右:右回転
マウスで画面左:左回転

投稿者 robosheep : 2005年11月05日 18:59 | コメント (1) | トラックバック


なんか家のPCでやったら動かないし・・・。

投稿者 robosheep : 2005年11月06日 01:53

CAVE6

 今日は一時間しかなかったよー まぁ記録

・迷路は、床プロジェクターの描画問題以外は正常に動きました、やったー。でもそれはCAVEのモデルビュー行列関数を使わずに、OpenGLのものをそのまま使った結果でした。

・床のプロジェクターに正面の画面が映る問題もほとんど解決。ナビゲーションに関してはOpenGLのモデルビュー行列関数を使わずに、CAVENavLoadIdentity, CAVENavTranslate, CAVENavRot, ... etcなどCAVE専用のものを使うと、うまくいくっぽいです。特にCAVENavLoadIdentityを使ってなかったのが原因で、これをつかうとすると必然的に平行移動などは描画のたびに初期化される。今までのサンプルの使い方、つまり行列の初期化をせずにどんどん重ねていくという方法は適当ではないのだろうか?・・・・。

・glutライブラリーを使って文字表示成功、しかしCAVEでのウィンドウサイズの扱いがいまいち分からない。

・ワンド(コントローラ)の物理座標とナビゲーションワールド座標は−5〜5の範囲だということが判明(物理座標とワールド座標同じってどうゆうことですか?)

投稿者 robosheep : 2005年11月04日 18:53 | コメント (1) | トラックバック


glLoadIdentityを使ってはいけない、しかし代わりにglPushMatrix, glPopMatrixを使うと、OpenGLの行列変換関数も使えるっぽいです。CAVENav関数はOpenGLの関数と微妙に違うので扱いにくいです。これを使う意味はあるんだろうか?

投稿者 robo sheep : 2005年11月05日 10:55

CAVE5回目

 昨日はCAVE5回目、昨日のことをまとめてみる。

・CAVEでは正確に各プロジェクターの画像を表示するために、OpenGLで使われるビューイングの関数を破棄する。なので、描画範囲を変更する時にはglPerspectiveなどではなく、CAVENear, CAVEFarという独自の変数を利用する。

・ブレンドがうまくいかないのは、デプステストをしていなかったせいだと考えていたが、違った。未だ原因不明。

・glutライブラリーがインストールされていなかった、次回入れよう。

・glutが使えなかったのでglutBitmapCharacterを使えなく、これを使い文字を描画しようとしていたので、文字が表示できなかった。

・文字が表示できないので、ワンド(コントローラ)の位置を使って、サンプルを回転させるプログラムで、ワンドの位置座標値の幅が分からなかった。

・迷路プログラムでCAVE移植プログラムが不完全だったため、デバックに多くの時間を浪費。CAVEと普通のOpenGLでは変換行列(平行移動、回転など)の仕様が異なるため、その違いをちゃんと考慮してプログラムしないといけない。

・中央しか歩けないように調節した迷路のプログラムは、回転した時に3D酔いしそうになる。オエっぷ

・CAVEで下に表示される画像に、何故か正面に表示されるような情景が映っていた。(正面の画像とは微妙に違う)

 というわけで、星のプログラムは表示範囲は解決したものの、ブレンドのバグは直らず。4次元物体の表示プログラムはワンドの範囲が分からなかったため、回転する時に消えてしまうバグが直らず。迷路プログラムは移植時の基本的なバグに悩まされ、変換行列の違いのためまともに移動することができずに終了。問題がたくさん残った。とりあえず、現在の迷路プログラムをちゃんとゲームとして完成させたいところだ。

投稿者 robosheep : 2005年11月03日 13:52 | トラックバック