このページはez-HTML7.71で作成しました。
R.Buss氏 Ray Tracing プログラムを動かす
2022/8/31
これは、下の参考[1]の著者作成のソフトウェア「Ray Trace software package release 3.3」を、焦点を絞ってテストした結果報告である。
レイトレースは理論的に多岐にわたり難しい。しっかりとした基礎の上に
レイトレースのプログラムをやりたいと思っている人の参考になれば幸いです。
実行例 |
|
|
Utah Teapot Phong |
Utah Teapot Cook_Torrance |
|
|
BezierFlower |
Texture(BMP) |
準備-プログラム本体
- Buss氏は「ファイルに変更があった場合は、フィル名を変えるように」と言っている.
そのため制約があるので、あらかじめご理解ください。
- Ray Trace software package, release 3.3.
からzipファイルをダウンロード、解凍.これは各自でやってください.
- 展開すると、いくつのフォルダがある.main関数のフォルダはRayTraceとRayTraceKdである.
- 2つあるのは新旧版で"Kd"の方が新版である.Buss氏も"Kd"をすすめている.
ただ自分の場合は力量、目的を考えてよりシンプルなRayTraceを使った(使う関数に変更はないようだ).
- RayTraceフォルダには2つのcppファイルがある(RayTrace.cpp,RayTraceData.cpp).
前者がmainで後者がデータ処理用である.
準備-変更点
- テストファイル(zip)ダウンロード.
展開すると4つのフォルダがある.
- それぞれのフォルダ内の"*Ray.cpp"を元のRayTrace.cppと,"*Data.cpp"をRayTraceData.cppと置き換える.
ヘッダファイルは変更のある場合のみ名前を変えてフォルダに入れている.それをRayTraceData.hと置き換える。
- 今回のプログラムでは、RayTraceKdフォルダは当然利用しない.
その他、DataStructs,RaytraceMgr
フォルダも使わない.
訂正:両フォルダからはDataStructs/Array.h, RaytraceMgr/SceneDescription.hの2つが利用される.失礼しました.
- 実は各フォルダの"*Ray.cpp"の内容はほとんど同じで,元のプログラムに簡単なAntialiasing処理を付け加えただけ.
- "Phong", "Cook_Torrance"フォルダは、レイトレースでは有名な"Utah Teapot"をPhongとCookTorranceモデルで描くものである.
- "BezierFlower"フォルダはBezier曲面の応用である.
花びらの部分は,
CYBERBUST POV-Ray TECHNIQUE「A-7」
でのベジェデータを少し変更して利用させていただきました. 作者の方に感謝いたします.
- "Texture"フォルダは"BezierFlower"にビットマップファイル(簡単なグラディーション)によるテクスチャを
適用したものである.
- それぞれ、実行結果は上の「実行例」の通り.
動作環境
プログラムには"Visual C"プロジェクトファイルが添付されているが、
自分は"VC"を使ったことがないので、以下のような環境になった.
- OS::windows10 64bits
- IDE::Code::Bocks V20.03(以下codeblocks)
- "テストファイル"各フォルダにある"*.cbp"ファイルはcodeblocksのプロジェクトファイルである.
追加:上の訂正に伴いプロジェクトファイルも一部修正した.
- コンパイラ & デバッガ::MSYS2 MinGW x64(以下,mingw)
- MingGWはcodeblocksをダウンロードするとき、一緒にダウンロードできる.その方が簡単.
追加:ただし、freeglutは別に入れる必要がある.
>
- グラフィクス::OpenGL+FreeGLUT(以下 opengl,freeglut),freeglutはMSYS2でインストール可能.
- "GLUT"がopenglのインターフェースとして有名だが、今はサポートされていない.その後継がfleeglutである.
- freeglutはヘッダファイルとして"glut.h","freeglut.h"2つ提供している.
前者を使えば、プログラムの"#include<GL/glut.h>"の部分は変更する必要ない.
ビルド
- 以下のことは各自の責任でお願いします.
- RayTraceフォルダに差し替えファイルとcoldeblocksプロジェクトファイルを入れ、
codeblocksからプロジェクトファイルを開き"Build".
- プロジェクトファイルがやっていることは、使用フォルダ内の「すべて」のファイルをコンパイル・リンクし、
"-lglu32 -lopengl32 -lfreeglut"でopengl関係のライブラリをリンクさせることである.
- mingwでコンパイルするとエラーがでる.エラーの内容とそのファイル名、対処を下の表にした.
ファイル名は変更しない.
エラー |
ファイル・箇所 |
関数・変数 |
余分なクラス修飾子 |
OpenglRender/GlutRenderer.h|89|
Graphics/TextureMapBase.h|45|
VrMath/LinearR4.h|207|
|
InitLightsAndView( const...)
ReflectDirToCubeMap( const ...)
operator*= (const ...)
|
処理 |
関数の前のクラス修飾子を消去.
|
エラー |
ファイル・箇所 |
関数・変数 |
あいまいな変数? |
Graphics/CameraView.h|292|
|
SetClippingDistances( double near...)
|
処理 |
エラーの原文は、"expected primary-expression before ';'"である.
意味がいまいちだが、ここに使われている"near","far"が
予約語なのか?
これらはlocal変数なのでnear->n,far->fに変更する.
それと共に、この関数のクラス内宣言(103行)の引数に"near","far"が使われているが、
これらを消去する.
|
エラー |
ファイル・箇所 |
関数・変数 |
呼ばれた関数が存在しない |
Graphics/RbgImage.h
Graphics/RbgImage.cpp
|
DrawToOpenglBuffe(..)
|
処理 |
RgbImage Version 4.0をダウンロード(zip)して上のファイルと置き換える.
|
- ウォーニングは無視する.>
プログラムについての補足
- プログラムは最初openglモードで起動する."g"キーでレイトレースを開始(時間がかかる).
- Buss氏の著作(1)同様このプログラムも多岐にわたっている。そしていろいろな意味で「優しい」とは言えない.
- しかし自分が見た範囲で言えば、大体レイトレースのプログラムはプリミティブ(球、直方体)などの表示と
光の透過ぐらいで終わる.
- その意味ではBuss氏のプログラムは意欲的で深い.「格闘」していけばそれなりの結果を出してくれると思う.
- そのほかのテスト例. RayTraceKd/RayTraceKd.cppからオブジェクトを球だけに絞ったものである.
|
光の透過・屈折、テクスチャー |
- 連絡先:eizo49@hotmail.co.jp
他の作成プログラム
参考
- S.R.Buss 3-D Computer Graphics - A Matehematical Introduction with OpenGL
Cambridge University Press 2003
- OpenSCAD https://openscad.org/
- BezierSurface https://openhome.cc/eGossip/OpenSCAD/BezierSurface.html
- The Utah Teapot http://www.holmes3d.net/graphics/teapot/