#include using namespace wfl; using namespace psl; void main(void) { Start(); wfl::SetNumThreads(); //最大限にプロセッサコアを用いる //モデルの設定 double objectSize = 4e-3; //物体の実サイズを4mmとする Point posObject(0, 0, -20e-3); //物体の中心位置 //物体モデルファイルの読み込みと設定 IndexedFaceSet model; model.LoadMqo("miku1\\miltukumiku.mqo"); //物体データの読み込み.UVマッピングデータも読み込まれる model.Localize(); //物体を一時的に原点に置く model.SetHeight(objectSize); //物体サイズ(高さ)を設定 model += posObject; //物体位置を設定 model.AutoNormalVector(); //グーローシェーディングのための準備 model.SortByDepth(); //スイッチバック法のために奥行き方向にソートする //フレームバッファの設定 double px = 1e-6, py = 1e-6; //サンプリング間隔 int nx = 4096, ny = 4096; //サンプリング数 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("miku1\\miltukumiku.mqo", texNames); //ファイル名リストを読み込む TfbUvMapping texture(texNames, ".\\miku1\\", 2.2, wfl::GRAY_SCALE); //UVマッピングオブジェクト //ファイルの場所としてカレント下"miku1"を指定 //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(texture); //上で用意したUVマッピングオブジェクトを組み込む //物体モデルmodelからの光波を計算してフレームバッファに加算 sb.AddObjectFieldSb(frame, model); //スイッチバック法で物体光波計算 frame.SaveAsWf("object.wf"); //デバッグ用にセーブ //フレネルホログラム用の物体光波を得るためホログラムの位置(z=0)まで伝搬計算する //frame.ExactAsmProp(-posObject.GetZ()); frame.AsmProp(-posObject.GetZ()); //45行で帯域制限をオンにしたため,4倍拡張は不要 frame.SaveAsWf("frame.wf"); //物体光波の保存 }