#include using namespace wfl; using namespace psl; void main(void) { Start(); wfl::SetNumThreads(); //最大限にプロセッサコアを用いる //モデルの設定 double objectSize = 6e-3; //物体の実サイズを6mmとする Point posObject(0, 0, -50e-3); //物体の中心位置 //物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadMqo("bus.mqo"); //物体データの読み込み.UVマッピングデータも読み込まれる model.Localize(); //物体を一時的に原点に置く model.SetWidth(objectSize); //物体サイズを設定 model += posObject; //物体位置を設定 model.AutoNormalVector(); //グーローシェーディングのための準備 //フレームバッファの設定 double px = 10e-6, py = 10e-6; //サンプリング間隔 int nx = 1024, ny = 1024; //サンプリング数 WaveField frame(nx, ny, px, py); frame.SetOrigin(posObject); //フレームバッファの位置は物体モデルの中心 frame.Clear(); //シェーダーの設定 //WaveField diffuser(0); //特殊な拡散位相を使う場合 //diffuser.LoadWf("diffuser1024x1024.wf");//拡散位相の読み込み Vector light(-1.0, -1.0, -0.3); //照明光の方向 double env = 0.1; //環境光の割合 double gamma = 0.01; //補正制限値 TfbGouraudShading gouraudShader(/*diffuser,*/ gamma, light, env);//グーローシェーディング //UVテクスチャマッピングの設定 std::vector texNames; //テクスチャ画像ファイル名のリスト GetTextureNamesMqo("bus.mqo", texNames); //ファイル名リストを読み込む TfbUvMapping busTexture(texNames, ".\\", 2.2, wfl::GRAY_SCALE); //UVマッピングオブジェクト //ファイルの場所としてカレントディレクトリを指定 //SurfaceBuilderの設定 SurfaceBuilder sb(frame); //帯域制限のため,サンプル数とサンプル間隔等を正しく設定 sb.SetBandLimitMethod(3); //帯域制限をレベル3にする. sb.SetCenter(Point(0, 0, 0)); //帯域制限のため,ホログラムの中心位置(0,0,0)を設定 sb.SetDiffractionRatio(0.9); //回折率設定 sb.SetCullingRate(0.6); //カリング率設定 sb.SetShader(gouraudShader); //上で用意したシェーダーオブジェクトを組み込む sb.SetTexture(busTexture); //上で用意したUVマッピングオブジェクトを組み込む //物体モデルmodelからの光波を計算してフレームバッファに加算 sb.AddObjectField(frame, model); //物体光波計算 frame.SaveAsWf("object.wf"); //デバッグ用にセーブ //フレネルホログラム用の物体光波を得るためホログラムの位置(z=0)まで伝搬計算する //frame.ExactAsmProp(-posObject.GetZ()); frame.AsmProp(-posObject.GetZ()); //43行で帯域制限をオンにしたため,4倍拡張は不要 frame.SaveAsWf("frame.wf"); //物体光波の保存 }