Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

Atmosphere.h

Go to the documentation of this file.
00001 
00002 /*
00003     TEDDY - General graphics application library
00004     Copyright (C) 1999, 2000, 2001  Timo Suoranta
00005     tksuoran@cc.helsinki.fi
00006 
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Lesser General Public
00009     License as published by the Free Software Foundation; either
00010     version 2.1 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Lesser General Public License for more details.
00016 
00017     You should have received a copy of the GNU Lesser General Public
00018     License along with this library; if not, write to the Free Software
00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020 
00021     $Id: Atmosphere.h,v 1.1 2002/01/08 20:47:04 tksuoran Exp $
00022 */
00023 
00024 
00029 #ifndef TEDDY__SPACE_GAME__ATMOSPHERE_H
00030 #define TEDDY__SPACE_GAME__ATMOSPHERE_H
00031 
00032 
00033 #include "Teddy/Maths/Matrix.h"
00034 #include "Teddy/Maths/Plane.h"
00035 #include "Teddy/Maths/Vector.h"
00036 using namespace Teddy::Maths;
00037 
00038 
00039 namespace Teddy     {
00040 namespace SpaceGame {
00041 
00042 
00053 class Ellipsoid {
00054 public:
00055     Matrix A;  // 3x3
00056     Vector B;  // 3x1
00057     float  C;  // scalar
00058 };
00059 
00060 
00071 class Ellipse {
00072 public:
00073     Matrix A;  //  2x2
00074     Vector B;  //  2x1
00075     float  C;
00076 };
00077 
00078 
00098 extern void PerspProjEllipsoid (
00099     const Ellipsoid &ellipsoid,
00100     const Vector    &eye,
00101     const Plane     &plane,
00102     Ellipse         &ellipse
00103 );
00104 
00105 
00110 extern void ConvertEllipse (
00111     Ellipse &ellipse,
00112     Vector  &center,
00113     Vector  &axis0,
00114     Vector  &axis1,
00115     float   &halfLength0,
00116     float   &halfLength1
00117 );
00118 
00119 
00120 };  //  namespace SpaceGame
00121 };  //  namespace Teddy
00122 
00123 
00124 #endif  //  TEDDY__SPACE_GAME__ATMOSPHERE
00125 
00126 
00127 /*
00128 
00129 > How do I get ellipsoid in the form the code
00130 > takes input from my sphere which has radius r
00131 > and location specified as OpenGL modelview
00132 > matrix?
00133 
00134 This discussion assumes that you have already transformed
00135 your sphere into eye coordinates.
00136 
00137 The GeneralEllipsoid class is based on the ellipsoid
00138 representation
00139 
00140     X^T*A*X + B^T*X + C = 0
00141     
00142     A is a 3x3 symmetric matrix,
00143     B is a 3x1 vector,
00144     C is a scalar.
00145 
00146 The superscript T means "transpose".  
00147 
00148 The equation for a sphere is
00149 
00150     (X-K)^T*(X-K) = R^2.
00151 
00152     center K
00153     radius R
00154 
00155 Multiplying the left-hand side and 
00156 subtracting R^2 to the left produces
00157 
00158     X^T*I*X - 2*K^T*X + K^T*K - R^2 = 0
00159 
00160     I is the 3x3 identity matrix.
00161     
00162 In setting up the GeneralEllipsoid object
00163 
00164     X^T*A*X + B^T*X + C = 0
00165     
00166     A is a 3x3 symmetric matrix,
00167     B is a 3x1 vector,
00168     C is a scalar.
00169 
00170 you need
00171 
00172     A = I             3x3 Matrix: Identity
00173     B = -2*K          3x1 Vector: -2 * center 
00174     C = K^T*K - R^2   1   Scalar: center transpose ^ center - radius * radius ?
00175 
00176 
00177 
00178 Since you are in eye coordinates, the 'eye' input to the
00179 projector is the zero vector (0,0,0).  The view plane has
00180 normal N = (0,0,1) and plane constant n, the near value
00181 for the frustum.  That is, the plane is Dot(N,X) = n.
00182 
00183 The returned GeneralEllipse object (a 2D object) is in the
00184 form
00185 
00186     Y^T*A*Y + B^T*Y + C = 0
00187     
00188     (not the same A, B,C in the ellipsoid).
00189 
00190 Matrix A is a symmetric 2x2 matrix,
00191 B        is a 2x1 vector, and 
00192 C        is a scalar.  
00193 
00194 The 2D plane in which the ellipse is defined is the near plane.
00195 The origin of that plane is the center of the frustum near face.
00196 
00197 If you need to GeneralEllipse in factored form:
00198 Complete the square,
00199 
00200     (Y-U)^t A (Y-U) = U^t A U - C where
00201 
00202     U = -0.5 A^{-1} B.  
00203     
00204 Define M = A/(U^t A U - C).  
00205 The ellipse is
00206 
00207     (Y-U)^t M (Y-U) = 1.  
00208     
00209 Factor M = R^t D R (can do this with an eigensolver)
00210 where R is orthonormal and D is diagonal with
00211 positive // diagonal terms.
00212 
00213 If Z = R(Y-U) = (z1,z2), and D = diag(d1,d2), then the
00214 ellipse is
00215 
00216     1 = Z^t D Z = d1*z1^2+d2*z2^2.
00217 
00218 
00219 The silhouette is a hyperbola whenever part
00220 of the sphere is behind the viewer.  (E.g,
00221 when the viewer is standing at the shore
00222 looking out over the Pacific Ocean at the
00223 horizon.)  It's a parabola when the sphere
00224 is tangent to the view plane (the plane
00225 containing the view point, with normal equal
00226 to the view direction.)
00227 
00228 */
00229