00001
00002
00003 #include "objet3d.hpp"
00004 #include <math.h>
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 void CapteurVisuel3D::CalculPerspective ()
00015 {
00016
00017 Vector3DH direction( _direction.b, _direction.a );
00018
00019
00020 realtype D = _direction.norme();
00021
00022
00023
00024 realtype costheta = 0.0f,
00025 sintheta = 0.0f;
00026
00027 direction.cos_sinangle_ver(costheta, sintheta);
00028
00029
00030
00031
00032
00033
00034
00035
00036 realtype cosphi= 0.0f,
00037 sinphi= 0.0f;
00038
00039 direction.cos_sinangle_hor(cosphi, sinphi);
00040
00041
00042 _perspective.setIdentity();
00043
00044
00045 Matrice44 mat;
00046 mat.setIdentity();
00047
00048
00049 mat.setTranslateX(-direction.compox());
00050 mat.setTranslateY(-direction.compoy());
00051 mat.setTranslateZ(-direction.compoz());
00052
00053 _perspective.multiplyByMatrix(mat);
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 mat.setIdentity();
00068 mat.setRotateZ(sinphi,
00069 cosphi);
00070 _perspective.multiplyByMatrix(mat);
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084 mat.setIdentity();
00085 mat.setRotateX(-sintheta,
00086 -costheta );
00087 _perspective.multiplyByMatrix(mat);
00088
00089
00090 mat.setIdentity();
00091 mat.xx = -1.0f;
00092
00093 _perspective.multiplyByMatrix(mat);
00094
00095
00096 realtype spin = ((realtype)(M_PI) / 180.0f)* _spin,
00097 cosspin = (realtype)cos( spin ),
00098 sinspin = (realtype)sin( spin );
00099
00100 mat.setIdentity();
00101 mat.setRotateZ(cosspin, -sinspin);
00102
00103 _perspective.multiplyByMatrix(mat);
00104
00105
00106 mat.setIdentity();
00107 realtype ouverture = (realtype)(M_PI / 180.0f)* _ouverture,
00108 halfsizeprojy = (realtype)tan(ouverture)* D,
00109 halfsizeprojx = halfsizeprojy*( _fenetre._halfsize.x/
00110 _fenetre._halfsize.y);
00111
00112
00113 mat.xx = 1.0f/halfsizeprojx;
00114 mat.yy = 1.0f/halfsizeprojy;
00115
00116
00117 mat.zw = 1.0f / D;
00118
00119 _perspective.multiplyByMatrix(mat);
00120 }
00121
00122 void CapteurVisuel3D::VisualisationFilaireObjet( HDC dc, RObjet3D obj )
00123 {
00124 int cardsommet = obj.data.cardsommets;
00125 PPixel pixels = new Pixel[ cardsommet ];
00126 Sommet3DH transform;
00127
00128
00129 for ( int i = 0; i < cardsommet; i ++ )
00130 {
00131 Sommet3DH& sommet = obj.data.sommets[i];
00132 transform.x = sommet.x;
00133 transform.y = sommet.y;
00134 transform.z = sommet.z;
00135 transform.w = sommet.w;
00136
00137 transform.multiplyByMatrix(_perspective);
00138
00139
00140 pixels[i].x = (int)((transform.x/transform.w)*
00141 _fenetre._halfsize.x );
00142 pixels[i].y = (int)((transform.y/transform.w)*
00143 _fenetre._halfsize.y );
00144 }
00145
00146 int cardarc = obj.data.cardarcs;
00147
00148
00149 for ( int i = 0; i < cardarc; i ++ )
00150 {
00151 RArcD arc = obj.data.arcs[i];
00152 Pixel& pixelini = pixels[arc.sini-1],
00153 pixelfin = pixels[arc.sfin-1];
00154
00155 MoveToEx(dc, pixelini.x, pixelini.y, NULL);
00156 LineTo(dc, pixelfin.x, pixelfin.y);
00157 }
00158
00159 if ( pixels ) delete [] pixels;
00160 }
00161
00162 void CapteurVisuel3D::VisualisationFilaireScene( HDC dc)
00163 {
00164 if (!_dans ) return;
00165 _dans->VisualisationFilaire( dc, (RCapteurVisuel3D)*this );
00166 }
00167
00168
00169
00170
00171 void Scene3D::VisualisationFilaire( HDC hdc, RCapteurVisuel3D obs )
00172 {
00173 if (!_obj ) return;
00174
00175 obs.VisualisationFilaireObjet( hdc, (RObjet3D)(*_obj) );
00176 }
00177
00178