4 Prefix: glc - OpenGL Core
5 Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Frustum und Kamera }
13 ugluVector, ugluMatrix;
16 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17 TglcFrustum = class(TObject)
19 function GetWidth: Single;
20 function GetHeight: Single;
21 function GetFOVAngle: Single;
22 function GetAspectRatio: Single;
24 fIsOrthogonal: Boolean;
25 fTop, fBottom, fLeft, fRight, fNear, fFar: Single;
27 property Top : Single read fTop;
28 property Bottom : Single read fBottom;
29 property Left : Single read fLeft;
30 property Right : Single read fRight;
31 property Near : Single read fNear;
32 property Far : Single read fFar;
33 property Width : Single read GetWidth;
34 property Height : Single read GetHeight;
35 property FOVAngle : Single read GetFOVAngle;
36 property AspectRatio : Single read GetAspectRatio;
37 property IsOrthogonal: Boolean read fIsOrthogonal;
39 procedure Frustum(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single);
40 procedure Perspective(const aFOVAngle, aAspectRatio, aNear, aFar: Single);
41 procedure Ortho(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single);
48 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
49 TglcCamera = class(TglcFrustum)
51 fPosition: TgluMatrix4f;
53 property Position: TgluMatrix4f read fPosition write fPosition;
55 procedure Move(const aVec: TgluVector3f);
56 procedure Tilt(const aAngle: Single);
57 procedure Turn(const aAngle: Single);
58 procedure Roll(const aAngle: Single);
60 function GetRay(const aPos: TgluVector2f): TgluRayf;
70 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
71 //TglcFrustum///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
72 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
73 function TglcFrustum.GetWidth: Single;
75 result := (fRight - fLeft);
78 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
79 function TglcFrustum.GetHeight: Single;
81 result := (fTop - fBottom);
84 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
85 function TglcFrustum.GetFOVAngle: Single;
87 result := arctan2(Height/2, fNear)/Pi*360;
90 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
91 function TglcFrustum.GetAspectRatio: Single;
93 result := Height / Width;
96 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
97 procedure TglcFrustum.Frustum(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single);
99 fIsOrthogonal := false;
108 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
109 procedure TglcFrustum.Perspective(const aFOVAngle, aAspectRatio, aNear, aFar: Single);
111 fIsOrthogonal := false;
114 fTop := fNear * tan(aFOVAngle / 360 * Pi);
116 fRight := aAspectRatio * fTop;
120 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
121 procedure TglcFrustum.Ortho(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single);
123 fIsOrthogonal := true;
132 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
133 procedure TglcFrustum.Activate;
135 glMatrixMode(GL_PROJECTION);
137 if fIsOrthogonal then
138 glOrtho(fLeft, fRight, fBottom, fTop, fNear, fFar)
140 glFrustum(fLeft, fRight, fBottom, fTop, fNear, fFar);
141 glMatrixMode(GL_MODELVIEW);
144 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
145 procedure TglcFrustum.Render;
147 min, max: TgluVector2f;
149 min[0] := fLeft / fNear * fFar;
150 min[1] := fBottom / fNear * fFar;
151 max[0] := fRight / fNear * fFar;
152 max[1] := fTop / fNear * fFar;
154 glBegin(GL_LINE_LOOP);
155 glVertex3f(fLeft, fTop, -fNear);
156 glVertex3f(fLeft, fBottom, -fNear);
157 glVertex3f(fRight, fBottom, -fNear);
158 glVertex3f(fRight, fTop, -fNear);
161 glBegin(GL_LINE_LOOP);
162 glVertex3f(min[0], min[0], -fFar);
163 glVertex3f(min[0], max[0], -fFar);
164 glVertex3f(max[0], max[0], -fFar);
165 glVertex3f(max[0], min[0], -fFar);
169 glVertex3f(0, 0, 0); glVertex3f(min[0], min[0], -fFar);
170 glVertex3f(0, 0, 0); glVertex3f(min[0], max[0], -fFar);
171 glVertex3f(0, 0, 0); glVertex3f(max[0], max[0], -fFar);
172 glVertex3f(0, 0, 0); glVertex3f(max[0], min[0], -fFar);
176 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
177 constructor TglcFrustum.Create;
188 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
189 //TglcCamera////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
190 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
191 procedure TglcCamera.Move(const aVec: TgluVector3f);
193 fPosition := gluMatrixMult(gluMatrixTranslate(aVec), fPosition);
196 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
197 procedure TglcCamera.Tilt(const aAngle: Single);
199 fPosition := gluMatrixMult(gluMatrixRotate(gluVector3f(1,0,0), aAngle), fPosition);
202 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
203 procedure TglcCamera.Turn(const aAngle: Single);
205 fPosition := gluMatrixMult(gluMatrixRotate(gluVector3f(0,1,0), aAngle), fPosition);
208 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
209 procedure TglcCamera.Roll(const aAngle: Single);
211 fPosition := gluMatrixMult(gluMatrixRotate(gluVector3f(0,0,1), aAngle), fPosition);
214 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
215 procedure TglcCamera.Activate;
218 glLoadMatrixf(@fPosition[0, 0]);
221 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
222 function TglcCamera.GetRay(const aPos: TgluVector2f): TgluRayf;
226 if (aPos[0] < 0) then
227 p[0] := -aPos[0] * fLeft
229 p[0] := aPos[0] * fRight;
230 if (aPos[1] < 0) then
231 p[1] := -aPos[1] * fBottom
233 p[1] := aPos[1] * fTop;
234 if (fIsOrthogonal) then begin
236 result.p := fPosition * p;
237 result.v := fPosition * gluVector3f(0, 0, -1);
240 result.p := gluVector3f(0, 0, 0);
241 result.v := fPosition * p;
243 result := gluRayNormalize(result);
246 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
247 constructor TglcCamera.Create;
250 fPosition := gluMatrixIdentity;