#include "psl.h" using namespace wfl; using namespace psl; int main(void) { Start(); // 物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadWrl("cube.wrl"); //読み込み model.Localize(); //物体を原点付近に置く model.SetWidth(6e-3); //外接矩形の横幅が6mmになるように物体サイズを設定 // フレームバッファの設定 double px = 4e-6, py = 4e-6; //サンプリング間隔 int nx = 1024, ny = 1024; //サンプリング数 WaveField temp(nx, ny, px, py, 532e-9);//フレームバッファのテンプレート SegWaveField frame(3, 2, temp); //テンプレートから3x2の分割光波を作成 //シェーダーの設定 //WaveField diffuser(0); //特殊な拡散位相を持ちる場合 //diffuser.LoadWf("diffuser1024x1024.wf");//拡散位相の読み込み Vector light(-1.0, -3.0, -1.0); //照明光の方向 double env = 0.1; //環境光の割合 double gamma = 0.3; //補正制限値 TfbFlatShading flatShader(/*diffuser, */gamma, light, env); //フラットシェーディング準備 // SurfaceBuilderの設定 SurfaceBuilder sb(frame); sb.SetDiffractionRatio(0.9); //回折率設定 sb.SetCullingRate(0.6); //カリング率設定 sb.SetShader(flatShader); //上で用意したシェーダーを組み込む //物体モデルmodelからの光波を計算してフレームバッファに加算 for (int j = 0; j < frame.GetMy(); j++) { for (int i = 0; i < frame.GetMx(); i++) { frame.Segment(i, j); sb.AddObjectField(frame, model);//各セグメントに物体光波を加算 frame.SaveSeg(); } } //フレネルホログラム用の物体光波を得るためホログラムの位置まで伝搬計算する SegWaveField hologram(3, 2, temp); //ここではホログラムのセグメント数は物体光波と同じ hologram.SetCenter(Point(0, 0, 50e-3)); //ホログラム(伝搬先)の位置は50mm進んだ位置 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(); } } hologram.SaveAsSegWf("hologram.wf"); //保存のためセーブ hologram.SaveAsCombinedWf("hologram.wf"); //確認のためセーブ(デバッグ用) }