#include "psl.h" using namespace wfl; using namespace psl; int main(void) { Start(); //壁紙・物体位置 Point posWallpaper(0, 0, -100e-3); //壁紙はz=-100mmの位置 Point posObject(0, 0, -50e-3); //物体はz=-50mmの位置 //デフォルトパラメータの設定 double px = 4e-6, py = 4e-6; //サンプリング間隔 double lambda = 532e-9; //波長 int nx = 1024, ny = 1024; //サンプリング数 WaveField::SetDefault(nx, ny, px, py, lambda); //壁紙(背景)の設定 double width = 8e-3, height = 8e-3; //壁紙のサイズ Texture wallPaper; wallPaper.LoadBmp("Checker(256x256).bmp", AMPLITUDE);//壁紙画像を壁紙光波の振幅とする wallPaper.SetWidth(width); //壁紙の幅を設定 wallPaper.SetHeight(height); //壁紙の高さを設定 wallPaper.SetOrigin(posWallpaper); //壁紙の位置を設定 //壁紙の光波を発生 SegWaveField wpFrame(2, 2); //2x2セグメントの壁紙用フレームバッファ wpFrame.SetCenter(posWallpaper); //壁紙光波の位置を設定 //WaveField diffuser(0); //拡散位相を使う場合 //diffuser.LoadWf("diffuser1024x1024.wf");//拡散位相を使う場合:拡散位相読み込み for (int j = 0; j < wpFrame.GetMy(); j++) { for (int i = 0; i < wpFrame.GetMx(); i++) { wpFrame.Segment(i, j); wpFrame.ResamplingAdd(wallPaper, NEAREST_NEIGHBOR);//壁紙画像を補完して加算 //MultiplyDiffuser(wpFrame, diffuser); //拡散位相を使う場合:壁紙画像に拡散位相の乗算 wpFrame.ModRandomPhase(); //通常は拡散位相を使わず乱数化 wpFrame.SaveSeg(); } } //物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadWrl("cube.wrl"); //読み込み model.Localize(); //物体を原点付近に置く model.SetWidth(6e-3); //外接矩形の横幅を6mmに設定 model += posObject; //物体モデルの位置設定 //シェーダーの設定 Vector light(-1.0, -2.0, -1.0); //照明光の方向 double env = 0.2; //環境光の割合 double gamma = 0.3; //補正制限値 TfbFlatShading flatShader(/*diffuser, */gamma, light, env); //フラットシェーディング準備 // SurfaceBuilderの設定 SurfaceBuilder sb; //デフォルトパラメータで生成 sb.SetDiffractionRatio(1.0); //回折率設定 sb.SetCullingRate(0.6); //カリング率設定 sb.SetShader(flatShader); //上で用意したシェーダーを組み込む //物体平面のフレームバッファ作成と,伝搬計算,シルエットマスク処理,物体光波計算 SegWaveField frame(3, 2); //3x2セグメントの物体平面フレームバッファ frame.SetCenter(posObject); //物体平面の位置設定 for (int j = 0; j < frame.GetMy(); j++) { for (int i = 0; i < frame.GetMx(); i++) { frame.Segment(i, j); frame.ShiftedAsmProp(wpFrame); //壁紙光波全体をカレントセグメントに伝搬 PaintObjectSilhouette(frame, model);//シルエットマスク処理 sb.AddObjectField(frame, model, 4); //物体モデルの光波計算(4スレッド使用) frame.SaveSeg(); } } wpFrame.Dispose("wallpaper.wf"); //壁紙フレームバッファを保存してメモリ廃棄 //ホログラム用のフレームバッファ作成と伝搬計算 SegWaveField hologram(3, 2); //ホログラム用フレームバッファ hologram.SetCenter(Point(0, 0, 0)); //ホログラム面は位置設定 for (int j = 0; j < hologram.GetMy(); j++) { for (int i = 0; i < hologram.GetMx(); i++) { hologram.Segment(i, j); hologram.ShiftedAsmProp(frame); //伝搬元の全セグメントからの光波を求める hologram.SaveSeg(); } } frame.Dispose("object.wf"); //物体面フレームバッファを保存してメモリ廃棄 hologram.SaveAsSegWf("hologram.wf"); //ホログラム面での物体光波を保存 hologram.SaveAsCombinedLw("debug.lw"); //縮小モデルによるデバッグ時のみ使用 }