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

OpenGL

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // 3dBoundingBox.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. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. //////////////////////////////////////////////////////////////////
  27. // C3dBoundingBox
  28. IMPLEMENT_DYNAMIC(C3dBoundingBox, CObject)
  29. /////////////////////////////////////////////////////////////////////////////
  30. // C3dBoundingBox construction
  31. C3dBoundingBox::C3dBoundingBox()
  32. {
  33. // Assign Default values to member attributes
  34. m_fHighlightColor[0] = 0.90f; // Bright Red
  35. m_fHighlightColor[1] = 0.10f;
  36. m_fHighlightColor[2] = 0.10f;
  37. m_fHighlightColor[3] = 1.00f;
  38. m_fHighlightOffset = 0.50f;
  39. m_fHighlightLineWidth = 4.00f;
  40. }
  41. /////////////////////////////////////////////////////////////////////////////
  42. // C3dBoundingBox Destructor
  43. C3dBoundingBox::~C3dBoundingBox()
  44. {
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // C3dBoundingBox Implementation/Methods
  48. void C3dBoundingBox::TransformBounds(Matx4x4 XformMatrix)
  49. {
  50. // Our bounding box is defined my two (2) member variables; m_fMin & m_fMax
  51. // with these two points, we can derive the remaining points of our bounding
  52. // box, which is defined as follows:
  53. /*
  54.     p7=m_fMin[X],m_fMax[Y],m_fMax[Z] *  ____________  * p1=m_fMax
  55.                                        /            /
  56.                                      /            /  |
  57. p6=m_fMin[X],m_fMin[Y],m_fMax[Z] * /------------/  * p2=m_fMax[X],m_fMin[Y],m_fMax[Z]
  58.                                    |    Z   Y   |    |
  59.                                    |    | /     |    |
  60.                                    |     --  X  |    |
  61.     p8=m_fMin[X],m_fMax[Y],m_fMin[Z] *          |    / * p4=m_fMax[X],m_fMax[Y],m_fMin[Z]
  62.                                    |            |  / 
  63.                       p5=m_fMin  * |____________|/ * p3=m_fMax[X],m_fMin[Y],m_fMin[Z]
  64. */
  65. // Calculate bounding box remaining six(6) points, multiply by the transformation
  66. // matrix, then determine the new transformed bounding box m_fMin & m_fMax
  67. // coordinates.
  68. VECTORF p1, p2, p3, p4, p5, p6, p7, p8;
  69. if(!XformMatrix)
  70. return; // nothing to do!
  71. VecCopy3f(m_fMax, p1);
  72. Vec3f(m_fMax[X], m_fMin[Y], m_fMax[Z], p2);
  73. Vec3f(m_fMax[X], m_fMin[Y], m_fMin[Z], p3);
  74. Vec3f(m_fMax[X], m_fMax[Y], m_fMin[Z], p4);
  75. VecCopy3f(m_fMin, p5);
  76. Vec3f(m_fMin[X], m_fMin[Y], m_fMax[Z], p6);
  77. Vec3f(m_fMin[X], m_fMax[Y], m_fMax[Z], p7); 
  78. Vec3f(m_fMin[X], m_fMax[Y], m_fMin[Z], p8);
  79. // Transform the bounding box points
  80. VecTransformf(p1, p1, XformMatrix);
  81. VecTransformf(p2, p2, XformMatrix);
  82. VecTransformf(p3, p3, XformMatrix);
  83. VecTransformf(p4, p4, XformMatrix);
  84. VecTransformf(p5, p5, XformMatrix);
  85. VecTransformf(p6, p6, XformMatrix);
  86. VecTransformf(p7, p7, XformMatrix);
  87. VecTransformf(p8, p8, XformMatrix);
  88. // Find the Min/Max bounds of the newly transformed bounding box
  89. SetMinMax(p1, p2);
  90. SetMinMax(p3);
  91. SetMinMax(p4);
  92. SetMinMax(p5);
  93. SetMinMax(p6);
  94. SetMinMax(p7);
  95. SetMinMax(p8);
  96. }
  97. void C3dBoundingBox::SetMinMax(VECTORF A)
  98. {
  99. if(A[X] < m_fMin[X])
  100. m_fMin[X] = A[X];
  101. if(A[X] > m_fMax[X])
  102. m_fMax[X] = A[X];
  103. if(A[Y] < m_fMin[Y])
  104. m_fMin[Y] = A[Y];
  105. if(A[Y] > m_fMax[Y])
  106. m_fMax[Y] = A[Y];
  107. if(A[Z] < m_fMin[Z])
  108. m_fMin[Z] = A[Z];
  109. if(A[Z] > m_fMax[Z])
  110. m_fMax[Z] = A[Z];
  111. }
  112. void C3dBoundingBox::SetMinMax(VECTORF A, VECTORF B)
  113. {
  114. if(A[X] < B[X]) {
  115. m_fMin[X] = A[X];
  116. m_fMax[X] = B[X];
  117. }
  118. else {
  119. m_fMin[X] = B[X];
  120. m_fMax[X] = A[X];
  121. }
  122. if(A[Y] < B[Y]) {
  123. m_fMin[Y] = A[Y];
  124. m_fMax[Y] = B[Y];
  125. }
  126. else {
  127. m_fMin[Y] = B[Y];
  128. m_fMax[Y] = A[Y];
  129. }
  130. if(A[Z] < B[Z]) {
  131. m_fMin[Z] = A[Z];
  132. m_fMax[Z] = B[Z];
  133. }
  134. else {
  135. m_fMin[Z] = B[Z];
  136. m_fMax[Z] = A[Z];
  137. }
  138. }
  139. void C3dBoundingBox::SetMinMax(C3dBoundingBox* pBox)
  140. {
  141. if(pBox->m_fMin[X] < m_fMin[X])
  142. m_fMin[X] = pBox->m_fMin[X];
  143. if(pBox->m_fMax[X] > m_fMax[X])
  144. m_fMax[X] = pBox->m_fMax[X];
  145. if(pBox->m_fMin[Y] < m_fMin[Y])
  146. m_fMin[Y] = pBox->m_fMin[Y];
  147. if(pBox->m_fMax[Y] > m_fMax[Y])
  148. m_fMax[Y] = pBox->m_fMax[Y];
  149. if(pBox->m_fMin[Z] < m_fMin[Z])
  150. m_fMin[Z] = pBox->m_fMin[Z];
  151. if(pBox->m_fMax[Z] > m_fMax[Z])
  152. m_fMax[Z] = pBox->m_fMax[Z];
  153. }
  154. void C3dBoundingBox::Display(float fOffset,
  155.  float fLineSize,
  156.  int iSlices,
  157.  int iStacks,
  158.  float fColor[3],
  159.  BOOL bSolid)
  160. {
  161. VECTORF p1, p2, p3, p4, p5, p6, p7, p8;
  162. VecCopy3f(m_fMax, p1);
  163. Vec3f(m_fMax[X], m_fMin[Y], m_fMax[Z], p2);
  164. Vec3f(m_fMax[X], m_fMin[Y], m_fMin[Z], p3);
  165. Vec3f(m_fMax[X], m_fMax[Y], m_fMin[Z], p4);
  166. VecCopy3f(m_fMin, p5);
  167. Vec3f(m_fMin[X], m_fMin[Y], m_fMax[Z], p6);
  168. Vec3f(m_fMin[X], m_fMax[Y], m_fMax[Z], p7); 
  169. Vec3f(m_fMin[X], m_fMax[Y], m_fMin[Z], p8);
  170. // Save our current state..
  171. glPushAttrib(GL_ALL_ATTRIB_BITS);
  172. // Disable texture maping
  173. glDisable(GL_TEXTURE_2D);
  174. glDisable(GL_LIGHTING);
  175. // Display bounding box as wireframe..
  176. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  177. // Set the Box's color
  178. if(fColor)
  179. glColor4fv(fColor);
  180. else
  181. glColor4fv(m_fHighlightColor);
  182. glLineWidth(3.0f);
  183. glBegin(GL_POLYGON); // front CCW order...
  184. glVertex3fv(p2);
  185. glVertex3fv(p6);
  186. glVertex3fv(p5);
  187. glVertex3fv(p3);
  188. glEnd();
  189. glBegin(GL_POLYGON); // back
  190. glVertex3fv(p1);
  191. glVertex3fv(p4);
  192. glVertex3fv(p8);
  193. glVertex3fv(p7);
  194. glEnd();
  195. glBegin(GL_POLYGON); // left
  196. glVertex3fv(p5);
  197. glVertex3fv(p6);
  198. glVertex3fv(p7);
  199. glVertex3fv(p8);
  200. glEnd();
  201. glBegin(GL_POLYGON); // right
  202. glVertex3fv(p1);
  203. glVertex3fv(p2);
  204. glVertex3fv(p3);
  205. glVertex3fv(p4);
  206. glEnd();
  207. glBegin(GL_POLYGON); // top
  208. glVertex3fv(p1);
  209. glVertex3fv(p2);
  210. glVertex3fv(p6);
  211. glVertex3fv(p7);
  212. glEnd();
  213. glBegin(GL_POLYGON); // bottom
  214. glVertex3fv(p4);
  215. glVertex3fv(p3);
  216. glVertex3fv(p5);
  217. glVertex3fv(p8);
  218. glEnd();
  219. // Restore our states
  220. glPopAttrib();
  221. }