#include <frustum.h>
Nevrax France
Definition at line 47 of file frustum.h.
Public Member Functions | |
CFrustum (float left, float right, float bottom, float top, float znear, float zfar, bool perspective=true) | |
ctor. | |
CFrustum () | |
Un-initialized frustum. | |
void | getValues (float &left, float &right, float &bottom, float &top, float &znear, float &zfar) const |
Get the value of the frustum. | |
void | init (float width, float height, float znear, float zfar, bool perspective=true) |
Init a centered frustum. | |
void | init (float left, float right, float bottom, float top, float znear, float zfar, bool perspective=true) |
Init a frustum. | |
void | initPerspective (float fov, float aspectRatio, float znear, float zfar) |
CVector | project (const CVector &vec) const |
CVector | projectZ (const CVector &vec) const |
CVector | unProject (const CVector &vec) const |
CVector | unProjectZ (const CVector &vec) const |
Data Fields | |
float | Bottom |
NB: znear and zfar must be >0 (if perspective). | |
float | Far |
NB: znear and zfar must be >0 (if perspective). | |
float | Left |
NB: znear and zfar must be >0 (if perspective). | |
float | Near |
NB: znear and zfar must be >0 (if perspective). | |
bool | Perspective |
float | Right |
NB: znear and zfar must be >0 (if perspective). | |
float | Top |
NB: znear and zfar must be >0 (if perspective). |
|
Un-initialized frustum.
Definition at line 56 of file frustum.h. References NL3D_MEM_FRUSTRUM.
00057 { 00058 NL3D_MEM_FRUSTRUM 00059 } |
|
ctor.
Definition at line 61 of file frustum.h. References init(), and NL3D_MEM_FRUSTRUM.
00062 { 00063 NL3D_MEM_FRUSTRUM 00064 init( left, right, bottom, top, znear, zfar, perspective); 00065 } |
|
Get the value of the frustum.
Definition at line 64 of file frustum.cpp. References NL3D_MEM_FRUSTRUM. Referenced by NL3D::CViewport::getRayWithPoint().
|
|
Init a centered frustum.
Definition at line 51 of file frustum.cpp. References height, init(), NL3D_MEM_FRUSTRUM, and width.
00052 { 00053 NL3D_MEM_FRUSTRUM 00054 init(-width/2, width/2, -height/2, height/2, znear, zfar, perspective); 00055 } |
|
Init a frustum.
Definition at line 39 of file frustum.cpp. References NL3D_MEM_FRUSTRUM. Referenced by NL3D::CEvent3dMouseListener::CEvent3dMouseListener(), CFrustum(), init(), initPerspective(), InitZBuffer(), and NL3D::CCamera::setFrustum().
00040 { 00041 NL3D_MEM_FRUSTRUM 00042 Left= left; 00043 Right= right; 00044 Bottom= bottom; 00045 Top= top; 00046 Near= znear; 00047 Far= zfar; 00048 Perspective= perspective; 00049 } |
|
Setup a perspective frustum, giving a fov in radians.
Definition at line 56 of file frustum.cpp. References init(), NL3D_MEM_FRUSTRUM, and w. Referenced by NL3D::CCamera::setPerspective().
00057 { 00058 NL3D_MEM_FRUSTRUM 00059 float w,h; 00060 w= 2*znear*(float)tan(fov/2); 00061 h= aspectRatio != 0.f ? w/aspectRatio : 0.f; 00062 init(w,h,znear,zfar,true); 00063 } |
|
project a vector (x,y,z) onto frustum.
Definition at line 77 of file frustum.cpp. References NL3D_MEM_FRUSTRUM, w, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by transformVectorToZBuffer().
00078 { 00079 NL3D_MEM_FRUSTRUM 00080 CVector ret; 00081 float decalX, decalY; 00082 float w, h; 00083 float OOw, OOh; 00084 00085 // Fast transform to openGL like axis. 00086 CVector pt; 00087 pt.x= vec.x; 00088 pt.y= vec.z; 00089 pt.z= -vec.y; 00090 00091 decalX= (Right+Left); 00092 decalY= (Top+Bottom); 00093 w= Right-Left; 00094 h= Top-Bottom; 00095 OOw= 1.0f/w; 00096 OOh= 1.0f/h; 00097 00098 // project to -1..+1. 00099 if(Perspective) 00100 { 00101 ret.x= (2*Near*pt.x + decalX*pt.z)*OOw; 00102 ret.x/= -pt.z; 00103 ret.y= (2*Near*pt.y + decalY*pt.z)*OOh; 00104 ret.y/= -pt.z; 00105 } 00106 else 00107 { 00108 ret.x= (2*pt.x-decalX)*OOw; 00109 ret.y= (2*pt.y-decalY)*OOh; 00110 } 00111 00112 00113 // Map it to 0..1. 00114 ret.x= 0.5f*(ret.x+1); 00115 ret.y= 0.5f*(ret.y+1); 00116 ret.z= 0; 00117 00118 return ret; 00119 } |
|
project a vector (x,y,z) onto frustum.
Definition at line 123 of file frustum.cpp. References NL3D_MEM_FRUSTRUM, w, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z.
00124 { 00125 NL3D_MEM_FRUSTRUM 00126 CVector ret; 00127 float decalX, decalY; 00128 float w, h; 00129 float OOw, OOh; 00130 00131 // Fast transform to openGL like axis. 00132 CVector pt; 00133 pt.x= vec.x; 00134 pt.y= vec.z; 00135 pt.z= -vec.y; 00136 00137 decalX= (Right+Left); 00138 decalY= (Top+Bottom); 00139 w= Right-Left; 00140 h= Top-Bottom; 00141 OOw= 1.0f/w; 00142 OOh= 1.0f/h; 00143 00144 // project to -1..+1. 00145 if(Perspective) 00146 { 00147 ret.x= (2*Near*pt.x + decalX*pt.z)*OOw; 00148 ret.x/= -pt.z; 00149 ret.y= (2*Near*pt.y + decalY*pt.z)*OOh; 00150 ret.y/= -pt.z; 00151 } 00152 else 00153 { 00154 ret.x= (2*pt.x-decalX)*OOw; 00155 ret.y= (2*pt.y-decalY)*OOh; 00156 } 00157 00158 00159 // Map it to 0..1. 00160 ret.x= 0.5f*(ret.x+1); 00161 ret.y= 0.5f*(ret.y+1); 00162 ret.z= pt.z; 00163 00164 return ret; 00165 } |
|
unproject a point from screen to the frustum space.
Definition at line 169 of file frustum.cpp. References NL3D_MEM_FRUSTRUM, nlstop, w, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z.
00170 { 00171 NL3D_MEM_FRUSTRUM 00172 CVector ret; 00173 float decalX, decalY; 00174 float w, h; 00175 00176 decalX= (Right+Left); 00177 decalY= (Top+Bottom); 00178 w= Right-Left; 00179 h= Top-Bottom; 00180 00181 // vec is a vector in a left hand axis. 00182 CVector pt; 00183 pt.x= vec.x; 00184 pt.y= vec.y; 00185 pt.z= vec.z; 00186 00187 // Map it to -1..1 00188 pt.x= 2*(pt.x-0.5f); 00189 pt.y= 2*(pt.y-0.5f); 00190 00191 // Map Z to Near..Far. 00192 // Z IN is 1/Z, and is in 0..1. 00193 // inverse to 1..0. 00194 pt.z= 1-pt.z; 00195 // Map ret.z to 1/Far..1/Near. 00196 pt.z= 1/Far+(1/Near-1/Far)*pt.z; 00197 // Inverse, so ret.z E Near..Far. 00198 pt.z= 1/pt.z; 00199 // Actually, pt.z==w, homogenous coordinate. 00200 00201 00202 // unproject 00203 if(Perspective) 00204 { 00205 // w of homogenous coordinate. 00206 float Wh; 00207 float Zin; 00208 Wh= pt.z; 00209 Zin= -pt.z; 00210 00211 // unproject. (Projection is: x'= x/w. y'= y/w). 00212 pt.x= pt.x*Wh; 00213 pt.y= pt.y*Wh; 00214 ret.x= (pt.x*w-decalX*Zin)/(2*Near); 00215 ret.y= (pt.y*h-decalY*Zin)/(2*Near); 00216 ret.z= Zin; 00217 } 00218 else 00219 { 00220 // NOT DONE YET. 00221 nlstop; 00222 /*ret.x= (pt.x*w+decalX)/2; 00223 ret.y= (pt.y*h+decalY)/2; 00224 */ 00225 } 00226 00227 // Fast transform from openGL like axis. 00228 pt =ret; 00229 ret.x= pt.x; 00230 ret.y= -pt.z; 00231 ret.z= pt.y; 00232 00233 return ret; 00234 } |
|
unproject a point from screen to the frustum space.
Definition at line 238 of file frustum.cpp. References NL3D_MEM_FRUSTRUM, w, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z.
00239 { 00240 NL3D_MEM_FRUSTRUM 00241 CVector ret; 00242 float decalX, decalY; 00243 float w, h; 00244 00245 decalX= (Right+Left); 00246 decalY= (Top+Bottom); 00247 w= Right-Left; 00248 h= Top-Bottom; 00249 00250 // vec is a vector in a left hand axis. 00251 CVector pt; 00252 pt.x= vec.x; 00253 pt.y= vec.y; 00254 pt.z= vec.z; 00255 00256 // Map it to -1..1 00257 pt.x= 2*(pt.x-0.5f); 00258 pt.y= 2*(pt.y-0.5f); 00259 00260 // unproject 00261 if(Perspective) 00262 { 00263 // w of homogenous coordinate. 00264 float Wh; 00265 float Zin; 00266 Wh= pt.z; 00267 Zin= -pt.z; 00268 00269 // unproject. (Projection is: x'= x/w. y'= y/w). 00270 pt.x= pt.x*Wh; 00271 pt.y= pt.y*Wh; 00272 ret.x= (pt.x*w-decalX*Zin)/(2*Near); 00273 ret.y= (pt.y*h-decalY*Zin)/(2*Near); 00274 ret.z= Zin; 00275 } 00276 else 00277 { 00278 // NOT DONE YET. 00279 //nlstop; 00280 /*ret.x= (pt.x*w+decalX)/2; 00281 ret.y= (pt.y*h+decalY)/2; 00282 */ 00283 // Yoyo: crash avoid for lem 00284 ret= vec; 00285 } 00286 00287 // Fast transform from openGL like axis. 00288 pt =ret; 00289 ret.x= pt.x; 00290 ret.y= -pt.z; 00291 ret.z= pt.y; 00292 00293 return ret; 00294 } |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), and NL3D::CDriverUser::setupMatrixContext(). |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), NL3D::CDriverUser::setupMatrixContext(), and NL3D::CCamera::update(). |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), and NL3D::CDriverUser::setupMatrixContext(). |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), NL3D::CDriverUser::setupMatrixContext(), and NL3D::CCamera::update(). |
|
Definition at line 52 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::isOrtho(), NL3D::CCamera::isPerspective(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), and NL3D::CDriverUser::setupMatrixContext(). |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), and NL3D::CDriverUser::setupMatrixContext(). |
|
NB: znear and zfar must be >0 (if perspective).
Definition at line 51 of file frustum.h. Referenced by NL3D::CCamera::buildCameraPyramid(), NL3D::CCamera::getFrustum(), NL3D::CCloudScape::render(), NL3D::CDriverUser::restoreMatrixContextMatrixOnly(), and NL3D::CDriverUser::setupMatrixContext(). |