仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

2010年01月

レイトレーシングアルゴリズム実験①

まずレイトレの四角形の当たり判定を行なう前によくある球の当たり判定をおさらいしてみます



絶対必要なのが視線方向ベクトルと視線位置ベクトル


方向ベクトルは視線がどこの方向を向いているか、x、y、z、成分の3つの値で設定します

位置ベクトルはx、y、z、の位置をあらわしているベクトルです



視線方向をVベクトル、視線位置をMベクトルとし、判定をする球の中心位置ベクトルをQベクトル、球の単位ベクトルをP、半径をrとします


※VとPは単位ベクトル

4b8b9221.png




あとは数Bでやったハズの交点を求める計算をします。


球と線分の交点はベクトルVに変数tを掛けてtVとし、それが位置Qから見てrの距離に存在できるかを考えます。



上の図から Q+rP=M+tV


という式が立てられます

注意したいのはPベクトルの向きが決定されてないのでx、y、zの成分を3つ比べて連立方程式を解く

という方法は使えません。


なので |P|=1.0 という条件をうまく使って解くことを考えます

P^2 (Pの2乗) は1なので


r^2=(rP)^2=(M+tV-Q)^2  ・・・・・①


という式が立てられます。

MとQはすでにx、y、zの成分が決定しているので新しいベクトルHをつくり


H=M-Q


として①に代入&変形し


(H+tV)^2-r^2=0    ・・・・・・②


と t の2次方程式を作り、解の公式を使って t を求めます。

②を展開し


t^2 + 2tH・V + H^2 - r^2 = 0    ・・・・③


これで、ニーエーブンノ・・・の公式が使えますね


a=1

b=2H・V

c=H^2-r^2


bはベクトル同士の掛け算が入っているので内積を使います

H=(x1,y1,z1)

V=(x2,y2,z2)

のとき

H・V=x1*x2 + y1*y2 + z1*z2

です。


またbが2の倍数なので

b'=b/2  とおき


エーブンノマイナスビーダッシュ・・・の公式を使って


t=( -b'±√b'^2-ac ) / a


ここで t は0、1つまたは2つの解をもつことが判明します。


2つの場合は交点が2つ、すなわち球に視線が刺さっているような状態です。

1つの場合は接していると言えます。

0の場合は交点がありません。



また解が虚数でなくても t は正でなければいけないし

交点が2つの場合は

視線は球の奥じゃなく手前の交点で反射してますから解の公式の±の部分は-であると決定できます。

t は図の通り視線の長さです。


さてここまでが思考上の筋道です。

数学が絡むアルゴリズムを考える場合は、プログラムをいきなり書き始める前にこのように思考上で筋道を作ることが絶対必要です。





では、これらをプログラムでやってみましょう。



計算するに当たり初期状態で必要な変数は

ベクトルV、M、Qのx、y、z成分の値を記憶している変数です。

その変数はこのブログでは仮にVx,Vy,Vz,Mx・・・・・・とします。





Hx=Mx-Qx

Hy=My-Qy

Hz=Mz-Qz

b=Hx*Vx + Hy*Vy + Hz*Vz           ;内積の計算で解の公式のbに出力

c=Hx*Hx + Hy*Hy + Hz*Hz - r*r       ;ベクトルの距離の計算で解の公式のcに出力

D4=b*b-c                      ;解の公式の4分のDに出力

if D4<0.0:gosub*交点なし処理          ;ルートの中がマイナスのとき条件分岐

t=-b-sqrt(d4)

if t<0.0:gosub*交点なし処理           ;交点はあるが視点の後ろにある場合条件分岐

gosub*交点あり処理               ;視線と球が当たった時の処理、交点の位置はM+tV








以上が当たり判定部分の計算プログラムです。

紙の上で計算したときより、いらない計算や式は全部省いているので相当短くっています。


結果的にPベクトルは使わないので最初に設定しておく必要もなくプログラム上では変数を作る必要がありません。



交点がない場合はまた別の球と当たり判定をします

全ての球とぶつからなく、視線が地面or空まで伸びる場合はその色を、画面のドットの色として出力します。




交点がある場合は、入射してくる光線のベクトルを決定するためにまた別の計算を行わなければいけません。

その計算とは法線の計算です。

入射ベクトルを求めるには以下の図のように法線ベクトルを求める必要があります。

f8b0024f.png


法線ベクトルは球の中心から交点までのベクトルを単位ベクトルに変換すれば完成です。

-入射ベクトルを求める計算は図のように


-入射ベク = cos(θ) × 法線ベク × 2 + 視線ベク


ですぐ求まります。


cos(θ)は法線ベクと視線ベクの内積に等しいです。(ただし両方単位ベクトルでないといけない)



そして入射ベクトルが求まれば、視点位置=交点、視線ベクトル=-入射ベクトル、としてカメラの位置と方向を改めて決定し、再度当たり判定処理をすればいつかは地面or空に当たるときが来ますので、それまで何回もループさせます。

(処理が重い場合は反射の回数制限をする場合もある)

レイトレーシング試作CG実験

あれからいろいろプログラムを高速化するべく改善してみようとしましたがまだまだ自分のレイトレーシングの技術の足りなくて四苦八苦…


だけど、HSPでこんな綺麗なCGを作れるとは…と改めてレイトレーシングの凄さに痛感しました!


自分のイメージ通りに作れると感動しますよ!



自分で絵が描けなくても、または絵が超絶に下手でもコンピューターに描いてもらえばいいのです!
これぞプログラマーの特権!


なんとプログラム技術を伸ばせば絵の技術も同時にあがると!(ドット絵は含まれないが)



ところで何回かプログラムいじってて気がついたのですが、なぜレイトレーシングと言うと球と地面だけなのか…


グーグルの画像検索でレイトレーシングと検索するとほとんどが球の反射



でも、球しかない世界はつまらなすぎる…


レイトレの描画アルゴリズムを簡単に言うと、視点に入る光線を逆探知して物体との当り判定をし当たってたら反射する前の光線を逆探知…また当り判定に戻る…を繰り返します


物体との当たり判定にはベクトルを使って計算している訳だが、これはつまりベクトルで表現できる図形ならなんでも大丈夫ってことなんじゃ?
私の憶測ですけど


ベクトルで表現できる図形と言えばもうなんでもあり、ただの平面や歪んだ面、当然球も、面を組み合わせれば立体も、そして円柱を曲げて作ったような立体のリングなど…
ただよくあるレイトレでわざわざ球にする意味は確かにあり、有限のポリゴンで表現できない形だしレイトレの特徴を一番良く表現できてる図形だからなのでしょう


が、理論上平面やリングとかもレンダリング可能なはずだと私は思います!


そうと決まれば、早速実験!

平面のベクトル方程式

P=a+sB+tC (大文字がベクトル)

で平面のレンダリングをやってみようと思います!

レイトレーシング試作CG第二

あれから年が過ぎたのも忘れて、レイトレーシングプログラムとにらめっこを続けました・・
15d371b1.png
 





前と比べ徐々に良くなってきました。



まず太陽の反射光、特に白飛びしてる部分が画面に入るようにしないとこの球にメタルっぽさが生まれないと言うことに気づきました!



また影も誇張してみました



球で反射するときに光の強さが 0.ウン 倍になる(弱まる)ように設定したとたん、急にリアルになってきました!



それにしても計算時間がかなりかかる・・・



この画像を作るのにPentium M = 1.73Ghz のパワーで、3,4分かかりました・・



今度はアルゴリズムの最適化で高速化を目指していきたいと思います

レイトレーシング試作CG1   あけましておめでとうございます

いきなり去年の話になりますが、私のブログを紹介してくださったメカマスター氏の「鋼鉄親子でゲーム漬け 」が不定期更新になってしまうという衝撃的なニュースがありましたね



有り得ないと分かっていても、今まで私のブログと鋼鉄親子のブログ両方を見ていてくださった方(あくまでもいるなら)は、鋼鉄親子の回数が減った分私のブログを見る回数が増えるのでは・・・?

などど0.0000・・%の期待にかけてこのごろ更新頑張ってます


いきなり最近になって更新しだしたのはそのためです


ついでにクォリティの向上にも勤めています!


なるべく見やすくしていきたいと思ってます。




このごろレイトレーシングにはまっていて、去年一昨年のHSPコンテストで衝撃的だったあのレイトレに近い劣化版を作ってみました。


8eaae062.png



うーん、イマイチ。



例のすごかったレイトレと何が違うのか・・・まずメタル感がないのと、なんだか画面全体が暗くてよく分からない・・



完全に真似しているわけではないので、球の位置、大きさ、数、色、やバック、タイルの色とか、結構違います。



だけど、光の反射のアルゴリズムはいろんなサイトで勉強してなるべく例のレイトレみたくメタルっぽさを出せたらいいなぁと思ったのですが、期待通りのメタルさがでません


自分で工夫を加えないといけないみたいですね。




ひとまず、こんな調子でレイトレーシングの技術を伸ばして行きたいと思います・・ヾ( ´ー`)ノシ

プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ