#include using namespace wfl; using namespace psl; void main(void) { Start(); wfl::SetNumThreads(); //最大限にプロセッサコアを用いる //モデルの設定 double objectSize = 3e-3; //物体の実サイズ Point posObject(0, 0, -20e-3); //物体の中心位置 //物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadMqo("testmodel\\star8.mqo"); model.Localize(); //物体を一時的に原点に置く model.SetWidth(objectSize); //物体サイズ(幅)を設定 model += posObject; //物体位置を設定 model.AutoNormalVector(); //グーローシェーディングのための準備 //フレームバッファの設定 double lambda[] = { 630e-9, 540e-9, 460e-9 }; //フルカラー用に用いる波長(R, G, B) double px = 1e-6, py = 1e-6; //サンプリング間隔 int nx = 4096, ny = 4096; //サンプリング数 WaveField frame(nx, ny, px, py); //シェーダーの設定 Vector light(-0.408, -0.408, -0.816); //照明光の方向 (この方向はMqoのデフォルト) double gamma = 0.01; //補正制限値 //物体光波のレンダリング for (int RGBcounter = 1; RGBcounter <= 3; RGBcounter++){ Printf("\n\n%d色目の計算開始\n", RGBcounter); frame.Clear(); frame.SetWavelength(lambda[RGBcounter - 1]); //各色の波長設定 frame.SetOrigin(posObject); //フレームバッファの位置は物体モデルの中心 TfbLambertShading shading(gamma, light, (ColorMode)RGBcounter);//ランバートシェーダ //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(shading); //上で用意したシェーダーオブジェクトを組み込む //物体モデルmodelからの光波を計算してフレームバッファに加算 sb.AddObjectFieldSb(frame, model, 1); //スイッチバック法で物体光波計算 //デバッグ用にセーブ if (RGBcounter == RED) frame.SaveAsWf("object-R.wf"); if (RGBcounter == GREEN) frame.SaveAsWf("object-G.wf"); if (RGBcounter == BLUE) frame.SaveAsWf("object-B.wf"); //フレネルホログラム用の物体光波を得るためホログラムの位置(z = 0)まで伝搬計算する frame.ExactAsmProp(-frame.GetOrigin().GetZ()); //物体光波の保存 if (RGBcounter == RED) frame.SaveAsWf("frame-R.wf"); if (RGBcounter == GREEN) frame.SaveAsWf("frame-G.wf"); if (RGBcounter == BLUE) frame.SaveAsWf("frame-B.wf"); } }