3dPoint.cpp
上传用户:shxiangxiu
上传日期:2007-01-03
资源大小:1101k
文件大小:9k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dPoint.cpp : implementation file
  3. //
  4. // glOOP (OpenGL Object Oriented Programming library)
  5. // Copyright (c) Craig Fahrnbach 1997, 1998
  6. //
  7. // OpenGL is a registered trademark of Silicon Graphics
  8. //
  9. //
  10. // This program is provided for educational and personal use only and
  11. // is provided without guarantee or warrantee expressed or implied.
  12. //
  13. // Commercial use is strickly prohibited without written permission
  14. // from ImageWare Development.
  15. //
  16. // This program is -not- in the public domain.
  17. //
  18. /////////////////////////////////////////////////////////////////////////////
  19. #include "stdafx.h"
  20. #include "glOOP.h"
  21. #include <math.h>
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. //////////////////////////////////////////////////////////////////
  28. // C3dPoint
  29. IMPLEMENT_DYNAMIC(C3dPoint, CObject)
  30. /////////////////////////////////////////////////////////////////////////////
  31. // C3dPoint Construction
  32. C3dPoint::C3dPoint()
  33. {
  34. // Set the attributes to default values..
  35. m_fOrigin[0] = 0.0f;
  36. m_fOrigin[1] = 0.0f;
  37. m_fOrigin[2] = 0.0f;
  38. m_fOrigin[3] = 0.0f;
  39. m_Color.SetColor4f(.5f, .5f, .5f, .0f); // Default gray color
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. // C3dPoint Destructor
  43. C3dPoint::~C3dPoint()
  44. {
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // C3dPoint static functions
  48. void C3dPoint::Display(float x,
  49.    float y,
  50.    float z,
  51.    float fRadius,
  52.    float fColor[4],
  53.    BOOL  bSolid)
  54. {
  55. GLint iSlices = 5;
  56. GLint iStacks = 5;
  57. // Save the current transformation matrix..
  58.   glPushMatrix();
  59. // Disable textsure maping
  60. glDisable(GL_TEXTURE_2D);
  61. // Create a quadratic object used to draw our cylinders
  62. GLUquadricObj* pSphere = gluNewQuadric();
  63. ASSERT(pSphere);
  64. if(bSolid) {
  65. glPolygonMode(GL_FRONT, GL_FILL);
  66. gluQuadricDrawStyle(pSphere, GLU_FILL);
  67. }
  68. else {
  69. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  70. gluQuadricDrawStyle(pSphere, GLU_LINE);
  71. }
  72. // Set the Cylinder color
  73. if(fColor)
  74. glColor4fv(fColor);
  75. else {
  76. // Define default color..
  77. GLfloat fDefColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
  78. glColor4fv(fDefColor);
  79. }
  80. // translate the points origin
  81. glTranslated( x,  y,  z);
  82. gluSphere(pSphere, (GLdouble)fRadius, iSlices, iStacks);
  83. gluDeleteQuadric(pSphere);
  84. // Restore the current transformation matrix..
  85. glPopMatrix();
  86. }
  87. /////////////////////////////////////////////////////////////////////////////
  88. // C3dPoint virtual function implimentation
  89. void C3dPoint::Serialize(CArchive& ar)
  90. {
  91. CString szBuffer;
  92. if (ar.IsStoring())
  93. {
  94. // Save the Object Class header...
  95. // szBuffer.Format("n%sC3dPoint {n", szIndent);
  96. // ar.WriteString(szBuffer);
  97. // Save the base class object data...
  98. // C3dObject::Serialize(ar);
  99. // Save the this objects' specific data...
  100. // szBuffer.Format("%stDepth         < %f >n", szIndent, m_fDepth);
  101. // ar.WriteString(szBuffer);
  102. // szBuffer.Format("%s}n", szIndent); // end of object def
  103. // ar.WriteString(szBuffer);
  104. }
  105. else
  106. {
  107. // Read the derived class data..
  108. // ar.ReadString(szBuffer);
  109. // szBuffer.TrimLeft(); // Remove leading white spaces
  110. // sscanf(szBuffer, "Depth         < %f >n", &m_fDepth);
  111. }
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. // C3dPoint function implimentation
  115. void C3dPoint::Display(float fRadius,
  116.    float fColor[4],
  117.    BOOL  bSolid)
  118. {
  119. GLint iSlices = 5;
  120. GLint iStacks = 5;
  121. // Create a quadratic object used to draw our point
  122. GLUquadricObj* pQuad = gluNewQuadric();
  123. ASSERT(pQuad);
  124. // Save the current transformation matrix..
  125.   glPushMatrix();
  126. // Disable textsure maping
  127. glDisable(GL_TEXTURE_2D);
  128. if(bSolid) {
  129. glPolygonMode(GL_FRONT, GL_FILL);
  130. gluQuadricDrawStyle(pQuad, GLU_FILL);
  131. }
  132. else {
  133. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  134. gluQuadricDrawStyle(pQuad, GLU_LINE);
  135. }
  136. // Set the Cylinder color
  137. if(fColor)
  138. glColor4fv(fColor);
  139. else {
  140. // Define default color..
  141. GLfloat fDefColor[] = { 1.0f, 0.0f, 0.0f, 1.0f };
  142. glColor4fv(fDefColor);
  143. }
  144. // translate the points origin
  145. glTranslated( m_fOrigin[0], m_fOrigin[1], m_fOrigin[2]);
  146. gluSphere(pQuad, (GLdouble)fRadius, iSlices, iStacks);
  147. // Restore the current transformation matrix..
  148. glPopMatrix();
  149. gluDeleteQuadric(pQuad);
  150. }
  151. BOOL C3dPoint::HitTest(float x, float y, float z, float test)
  152. {
  153. float dif;
  154. dif = m_fOrigin[0]-x;
  155. if(fabs(dif)>test)
  156. return FALSE;
  157. dif = m_fOrigin[1]-y;
  158. if(fabs(dif)>test)
  159. return FALSE;
  160. dif = m_fOrigin[2]-z;
  161. if(fabs(dif)>test)
  162. return FALSE;
  163. return TRUE;
  164. }
  165. void C3dPoint::SetOrigin(GLfloat x, GLfloat y, GLfloat z)
  166. {
  167. // Set the point's origin
  168. m_fOrigin[X] = x;
  169. m_fOrigin[Y] = y;
  170. m_fOrigin[Z] = z;
  171. }
  172. void C3dPoint::GetOrigin(GLfloat *x, GLfloat *y, GLfloat *z)
  173. {
  174. // Get the points origin
  175. *x = m_fOrigin[X];
  176. *y = m_fOrigin[Y];
  177. *z = m_fOrigin[Z];
  178. }
  179. BOOL C3dPoint::IsPoint(C3dCamera* pCamera, C3dObject* pObject,
  180.    float x, float y, float z)
  181. {
  182. // IsPoint checks to see if the given x,y,z coordinate passes through this points
  183. // coordinates.
  184. // We perform the following steps to 'check' a point:
  185. // 1.  Get the direction vector of the given x,y,z coordinate relative to the 
  186. // camera position.
  187. // 2. Get the direction vector of a transformed point in the array relative
  188. // to the camera position.
  189. // 3. Calcualte the angle between these two vectors.
  190. // 4.  If the angle is small, this is the point!
  191. //
  192. Matx4x4 ObjXformMatrix;
  193. VECTORF CameraPosn, MousePosn, temp;
  194. VECTORF CameraToMouse, CameraToPoint;
  195. VECTORF PointPosn;
  196. float cosTheta;
  197. if(!pCamera || !pObject)
  198. return NULL;
  199. // Convert the mouse position to a vector
  200. Vec3f(x, y, z, MousePosn);
  201. // Get the camera origin
  202. Vec3f(pCamera->m_fOrigin[X],
  203.   pCamera->m_fOrigin[Y],
  204.   pCamera->m_fOrigin[Z],
  205.   temp);
  206. // Transform the camera's origin to world coordinates
  207. Transformf(temp, CameraPosn, pCamera->m_dModelViewMatrix);
  208. // Subtract the camera coordinate from the mouse coordinate
  209. // and normalize.  This is the direction vector from the Camera
  210. // to the mouse.
  211. VecSubf(CameraPosn, MousePosn, CameraToMouse);
  212. VecNormalizef(CameraToMouse);
  213. // Get the objects transformation matrix.  We will use this to
  214. // transform each point in the array to world coordinates.
  215. pObject->GetTransformMatrix(ObjXformMatrix);
  216. // Convert this point to a vector and multiply by the
  217. // transformation matrix
  218. Vec3f(m_fOrigin[X], m_fOrigin[Y], m_fOrigin[Z], temp);
  219. VecTransformf(temp, PointPosn, ObjXformMatrix);
  220. // Subtract the camera coordinate from the array point and 
  221. // normalize.  This is the direction vector from the Camera
  222. // to the array point.
  223. VecSubf(CameraPosn, PointPosn, CameraToPoint);
  224. VecNormalizef(CameraToPoint);
  225. // Calcualte the angle between vectors
  226. cosTheta = Degreesf(acos(VecDotf(CameraToMouse, CameraToPoint)));
  227. if(cosTheta < 0.5f) // 1/2 degree tolerence
  228. return TRUE; // Found a match
  229. return FALSE;
  230. }
  231. BOOL C3dPoint::IsPoint(C3dCamera* pCamera, Matx4x4 XformMatrix,
  232.    float x, float y, float z)
  233. {
  234. // IsPoint checks to see if the given x,y,z coordinate passes through this points
  235. // coordinates.
  236. // We perform the following steps to 'check' a point:
  237. // 1.  Get the direction vector of the given x,y,z coordinate relative to the 
  238. // camera position.
  239. // 2. Get the direction vector of a transformed point in the array relative
  240. // to the camera position.
  241. // 3. Calcualte the angle between these two vectors.
  242. // 4.  If the angle is small, this is the point!
  243. //
  244. VECTORF CameraPosn, MousePosn, temp;
  245. VECTORF CameraToMouse, CameraToPoint;
  246. VECTORF PointPosn;
  247. float cosTheta;
  248. if(!pCamera)
  249. return FALSE;
  250. // Convert the mouse position to a vector
  251. Vec3f(x, y, z, MousePosn);
  252. // Get the camera origin
  253. Vec3f(pCamera->m_fOrigin[X],
  254.   pCamera->m_fOrigin[Y],
  255.   pCamera->m_fOrigin[Z],
  256.   temp);
  257. // Transform the camera's origin to world coordinates
  258. Transformf(temp, CameraPosn, pCamera->m_dModelViewMatrix);
  259. // Subtract the camera coordinate from the mouse coordinate
  260. // and normalize.  This is the direction vector from the Camera
  261. // to the mouse.
  262. VecSubf(CameraPosn, MousePosn, CameraToMouse);
  263. VecNormalizef(CameraToMouse);
  264. // Convert this point to a vector and multiply by the
  265. // transformation matrix
  266. Vec3f(m_fOrigin[X], m_fOrigin[Y], m_fOrigin[Z], temp);
  267. VecTransformf(temp, PointPosn, XformMatrix);
  268. // Subtract the camera coordinate from the array point and 
  269. // normalize.  This is the direction vector from the Camera
  270. // to the array point.
  271. VecSubf(CameraPosn, PointPosn, CameraToPoint);
  272. VecNormalizef(CameraToPoint);
  273. // Calcualte the angle between vectors
  274. cosTheta = Degreesf(acos(VecDotf(CameraToMouse, CameraToPoint)));
  275. if(cosTheta < 0.5f) // 1/2 degree tolerence
  276. return TRUE; // Found a match
  277. return FALSE;
  278. }