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

📄 aabb.cpp

📁 小型的3D游戏引擎
💻 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 + -