このクラスは、パノラマカメラアングルで詳細に本の原則を説明しています。直接実装コードへ。
クラスの宣言:
#pragma回 #ifndefの__SPHERICAL_HEADER__ の#define __SPHERICAL_HEADER__ の#include "camera.h" クラス球状:公共カメラ{ パブリック: 球状(); 〜球面(); 球状(constの球面&SP); 空set_fov(constのldouble HFOV、constのldouble VFOV)。 ボイドset_angle(CONST ldouble度) CONST(Point3と&PP、CONST整数HRES、CONST整数VRES、CONST ldouble S CONST)するVector3 ray_direction。 仮想カメラ*クローン()constは、 仮想空render_scene(ワールド&W)。 (球状&SP CONST)球状&演算子=。 プライベート: ldouble lambda_max、psi_max。 }。 #endifの
クラスの実装:
#include "pch.h" の#include "spherical.h" の#include "../utilities/world.h" の#include "../utilities/viewplane.h" の#include "../samplers/sampler.h" #include "../tracers/tracer.h" 球状::球状():カメラ()、lambda_max(180)、psi_max(180){} 球状::〜球状(){} 球状::球状(CONST球状& SP):カメラ(SP)、lambda_max(sp.lambda_max)、psi_max(sp.psi_max){} ボイド球状:: set_fov(CONST ldouble HFOV、CONST ldouble VFOV){ lambda_max = HFOV / 2。 psi_max = VFOV / 2。 } ボイド球状:: set_angle(CONST ldouble DEG){ ldouble RAD =ラジアン(度) アップ= Point3と(STD :: COS(RAD)* up.x -のstd ::罪(RAD)* up.y、 std ::罪(RAD)* up.x +のstd :: COS(RAD)* up.y、up.z)。 球状のVector3 :: ray_direction(CONST Point3と&PP、CONST整数HRES、CONST整数VRES、CONST ldouble S)のconst { Point3とのPN(2.0 /(S * HRES)* pp.x、2.0 /(S * VRES)* pp.y 、0); ldoubleラムダ= pn.x *ラジアン(lambda_max)、 PSI = pn.y *ラジアン(psi_max)。 ldouble PHI = M_PI -ラムダ、 シータ= 0.5 * M_PI - PSI。 ldouble sin_phi = STD ::罪(PHI)、cos_phi = STD :: COS(PHI)、sin_theta = STD ::罪(シータ)、cos_theta = STD :: COS(シータ)。 するVector3 DIR = sin_theta * sin_phi * U + cos_theta * V + sin_theta * cos_phi * W。 ディレクトリを返します。 } カメラ*球面::クローン()constは{ 新しい球面(* this)を返します。 } 空球状:: render_scene(ワールド&W){ レイ線; } ViewPlane VP(w.vp)。 整数深さ= 0。 POINT3 SP、PP。 w.open_window(vp.hres、vp.vres)。 ray.o =目; vp.s = 1 / vp.s。 (整数R = vp.vres - 1、R> = 0; R - )のための//左コーナーから右コーナーにレンダリング するための(整数C = 0; C <vp.hres、C ++){ てRGBColor色; 以下のための(整数p = 0; p <vp.nsamples; p ++){ SP = vp.sampler-> sample_unit_square(); pp.x =(C - 0.5 * vp.hres + sp.x)* vp.s。 pp.y =(R - 0.5 * vp.vres + sp.y)* vp.s。 ray.d = ray_direction(PP、vp.hres、vp.vres、vp.s)。 カラー+ = w.tracer_ptr-> trace_ray(光線); 色/ = vp.nsamples。 カラー* = exposure_time。 w.display_pixel(R、C、色)。 } } 球状&球状::演算子=(CONST球状&SP){ IF(この==&SP) リターン*この; カメラ::演算子=(SP); lambda_max = sp.lambda_max。 psi_max = sp.psi_max。 *これを返します。 }
(そのような材料の添加後など、その結果を見て)テストレンダリング: