球状のクラス定義と実装

このクラスは、パノラマカメラアングルで詳細に本の原則を説明しています。直接実装コードへ。

クラスの宣言:

#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。
	*これを返します。
}

(そのような材料の添加後など、その結果を見て)テストレンダリング:

おすすめ

転載: www.cnblogs.com/dalgleish/p/12651297.html