📄 aabb.cpp
字号:
#include "aabb.h"
#include "plane.h"
#include <windows.h>
#include <gl/gl.h>
GcAABB::GcAABB()
{
m_orthogonals[0] = GcVector3(1, 0, 0);
m_orthogonals[1] = GcVector3(0, 1, 0);
m_orthogonals[2] = GcVector3(0, 0, 1);
}
GcAABB::GcAABB( GcVector3 & v )
{
SetExtents(v);
GcAABB();
}
GcAABB::GcAABB( GcVector3 & v, GcVector3 & pos )
{
GcAABB();
SetExtents(v);
SetTranslation(pos);
}
GcAABB::GcAABB( GcAABB & aabb )
{
m_extents = aabb.GetExtents();
m_orthogonals[0] = aabb.GetOrthogonal(0);
m_orthogonals[1] = aabb.GetOrthogonal(1);
m_orthogonals[2] = aabb.GetOrthogonal(2);
SetTranslation( aabb.GetWorldTranslation() );
}
void GcAABB::SetExtents( GcVector3 & v )
{
m_extents = v;
GcVector3 & center = GetWorldTranslation();
m_points[0] = center + GcVector3( m_extents.x, m_extents.y, m_extents.z );
m_points[1] = center + GcVector3( -m_extents.x, m_extents.y, m_extents.z );
m_points[2] = center + GcVector3( -m_extents.x, m_extents.y, -m_extents.z );
m_points[3] = center + GcVector3( m_extents.x, m_extents.y, -m_extents.z );
m_points[4] = center + GcVector3( m_extents.x, -m_extents.y, m_extents.z );
m_points[5] = center + GcVector3( -m_extents.x, -m_extents.y, m_extents.z );
m_points[6] = center + GcVector3( -m_extents.x, -m_extents.y, -m_extents.z );
m_points[7] = center + GcVector3( m_extents.x, -m_extents.y, -m_extents.z );
}
std::string GcAABB::Info()
{
char buffer[64];
sprintf(buffer, "AABB Extents: %f %f %f", m_extents.x, m_extents.y, m_extents.z);
return std::string(buffer);
}
void GcAABB::RenderOutlines()
{
glPushMatrix();
glMultMatrixf(GetWorldMatrix());
glLineWidth(2);
glColor3f(0.5f, 0.0f, 0.0f);
glBegin( GL_LINES );
// Front top
glVertex3f( -m_extents.x, m_extents.y, -m_extents.z );
glVertex3f( m_extents.z, m_extents.y, -m_extents.z );
// Back top
glVertex3f( -m_extents.x, m_extents.y, m_extents.z );
glVertex3f( m_extents.z, m_extents.y, m_extents.z );
// Left top
glVertex3f( -m_extents.x, m_extents.y, -m_extents.z );
glVertex3f( -m_extents.x, m_extents.y, m_extents.z );
// Right top
glVertex3f( m_extents.x, m_extents.y, -m_extents.z );
glVertex3f( m_extents.x, m_extents.y, m_extents.z );
// Front bottom
glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z );
glVertex3f( m_extents.z, -m_extents.y, -m_extents.z );
// Back bottom
glVertex3f( -m_extents.x, -m_extents.y, m_extents.z );
glVertex3f( m_extents.z, -m_extents.y, m_extents.z );
// Left bottom
glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z );
glVertex3f( -m_extents.x, -m_extents.y, m_extents.z );
// Right bottom
glVertex3f( m_extents.x, -m_extents.y, -m_extents.z );
glVertex3f( m_extents.x, -m_extents.y, m_extents.z );
// Front left
glVertex3f( -m_extents.x, m_extents.y, -m_extents.z );
glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z );
// Front right
glVertex3f( m_extents.z, m_extents.y, -m_extents.z );
glVertex3f( m_extents.z, -m_extents.y, -m_extents.z );
// Back left
glVertex3f( -m_extents.x, m_extents.y, m_extents.z );
glVertex3f( -m_extents.x, -m_extents.y, m_extents.z );
// Back right
glVertex3f( m_extents.z, m_extents.y, m_extents.z );
glVertex3f( m_extents.z, -m_extents.y, m_extents.z );
glEnd();
//glColor3f(1.0f, 1.0f, 1.0f);
glPointSize(7.0f);
glBegin( GL_POINTS );
glVertex3fv( m_points[0] );
glVertex3fv( m_points[1] );
glVertex3fv( m_points[2] );
glVertex3fv( m_points[3] );
glVertex3fv( m_points[4] );
glVertex3fv( m_points[5] );
glVertex3fv( m_points[6] );
glVertex3fv( m_points[7] );
glEnd();
glPointSize(1);
glLineWidth(1);
glPopMatrix();
}
const bool GcAABB::Intersects( GcAABB * box )
{
bool collides = false;
GcVector3 & positionA = GetWorldTranslation();
GcVector3 & positionB = box->GetWorldTranslation();
GcVector3 & extentsA = m_extents;
GcVector3 & extentsB = box->GetExtents();
const GcVector3 T = positionB - positionA;//vector from A to B
if( fabs(T.x) <= (extentsA.x + extentsB.x) &&
fabs(T.y) <= (extentsA.y + extentsB.y) &&
fabs(T.z) <= (extentsA.z + extentsB.z) )
return true;
return false;
}
GcVector3 GcAABB::Point( int i )
{
GcVector3 & center = GetWorldTranslation();
switch( i )
{
case 0: return(center + GcVector3( m_extents.x, m_extents.y, m_extents.z ) ); break;
case 1: return(center + GcVector3( -m_extents.x, m_extents.y, m_extents.z ) ); break;
case 2: return(center + GcVector3( -m_extents.x, m_extents.y, -m_extents.z ) ); break;
case 3: return(center + GcVector3( m_extents.x, m_extents.y, -m_extents.z ) ); break;
case 4: return(center + GcVector3( m_extents.x, -m_extents.y, m_extents.z ) ); break;
case 5: return(center + GcVector3( -m_extents.x, -m_extents.y, m_extents.z ) ); break;
case 6: return(center + GcVector3( -m_extents.x, -m_extents.y, -m_extents.z ) ); break;
case 7: return(center + GcVector3( m_extents.x, -m_extents.y, -m_extents.z ) ); break;
default: return GcVector3(-1, -1, -1);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -