⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 collide.cc

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 CC
字号:
// -*- C++ -*-// by Bill Bouma and George Vanecek Jr. Aug, 1994.// Compile by: g++ -O2 -s -o cull cull.cc algebra3.o -lm#include "algebra3.h"           // See Graphics Gems IV, pg534-557typedef vec3          Point;    // Points are not Vectorstypedef vec3          Vector;   // Vectors are not Pointstypedef unsigned int  Index;    // Array Indicestypedef unsigned int  Counter;class Polygon {public:  Polygon           ( const char         pId,                      const Vector&      nV,                      const Counter      nPs,                      const Point* const p )  : id(pId), pts(p), nPts(nPs), normalVector(nV){ }  const Vector& normal( ) const { return normalVector; }  char            name( ) const { return id; }  Counter      nPoints( ) const { return nPts; }  const Point&   point( const Index i ) const { return pts[i]; }private:  const char          id;            // Unique Id  const Counter       nPts;          // pts[0..nPts-1]  const Point*  const pts;           // Points around Polygon  const Vector        normalVector;  // Unit Vector};class MovingPolyhedron {public:  MovingPolyhedron ( const char           pId,                     const Vector&        rv,                     const Vector&        vv,                     const Vector&        wv,                     const mat4&          m,                     const Counter        nP,                     const Polygon* const ps )  : id(pId), r(rv), v(vv), w(wv), R(m), polys(ps), nPolys(nP) { }  const Polygon&    polygon( const Index i ) const { return polys[i]; }  void                 cull( const MovingPolyhedron& ) const;private:  const char           id;      // Unique Id  const Polygon* const polys;   // Points in local coordinates  const Counter        nPolys;  // polys[0..nPolys-1]  Vector               r;       // Center of Rotation (in world coords.)  Vector               v;       // Linear Velocity (in world coords.)  Vector               w;       // Angular Velocity (in world coords.)  mat4                 R;       // Orientation Matrix};void MovingPolyhedron::cull( const MovingPolyhedron& j ) const{  const mat4   RIi = ((mat4&)R).transpose();  const Vector aij = RIi * (v - j.v - (w ^ r) + (j.w ^ j.r));   const Vector wij = RIi * (j.w - w);  for( Index gi = 0; gi < nPolys; ++gi ) {    const Polygon& g = polygon(gi);    for( Index pi = 0; pi < g.nPoints(); ++pi )      if( ( aij + (g.point(pi) ^ wij )) * g.normal() > 0.0 )        break;    cout << "Polygon " << g.name() << " of Polyhedron " << id         << " is" << ( pi == g.nPoints()  ? " " : " not ")         << "culled." << endl;  }}const Counter NPolyPoints = 4;const Counter NFaces      = 6;static const Point leftPoints[NPolyPoints]  = {  Point(-1,-1,-1), Point(-1,-1, 1), Point(-1, 1, 1), Point(-1, 1,-1) };static const Point rightPoints[NPolyPoints] = {  Point( 1,-1,-1), Point( 1, 1,-1), Point( 1, 1, 1), Point( 1,-1, 1) };static const Point topPoints[NPolyPoints]   = {  Point(-1, 1,-1), Point(-1, 1, 1), Point( 1, 1, 1), Point( 1, 1,-1) };static const Point bottomPoints[NPolyPoints]= {  Point(-1,-1,-1), Point( 1,-1,-1), Point( 1,-1, 1), Point(-1,-1, 1) };static const Point backPoints[NPolyPoints]  = {  Point(-1,-1,-1), Point(-1, 1,-1), Point( 1, 1,-1), Point( 1,-1,-1) };static const Point frontPoints[NPolyPoints] = {  Point(-1,-1, 1), Point( 1,-1, 1), Point( 1, 1, 1), Point(-1, 1, 1) };static const Polygon cube[NFaces]= {  Polygon( 'a', Vector(-1, 0, 0), NPolyPoints, leftPoints   ),  Polygon( 'b', Vector( 1, 0, 0), NPolyPoints, rightPoints  ),  Polygon( 'c', Vector( 0, 1, 0), NPolyPoints, topPoints    ),  Polygon( 'd', Vector( 0,-1, 0), NPolyPoints, bottomPoints ),  Polygon( 'e', Vector( 0, 0,-1), NPolyPoints, backPoints   ),  Polygon( 'f', Vector( 0, 0, 1), NPolyPoints, frontPoints  )};int main(){  MovingPolyhedron A( 'A',                      Vector(10,10, 0 ), // Position                      Vector( 0, 0, 0 ), // Velocity                      Vector( 0, 0, 0 ), // Angular Velocity                      identity3D(),                      NFaces, cube );  MovingPolyhedron B( 'B',                      Vector(10,10,10 ), // Position                      Vector( 0, 0,-1 ), // Velocity                      Vector( 0, 1, 0 ), // Angular Velocity                      identity3D(),                      NFaces, cube );  A.cull( B );  B.cull( A );               }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -