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

📄 math.cpp

📁 小型的3D游戏引擎
💻 CPP
字号:
#include "math.h"
#include "vector.h"
#include "triangle.h"
#include "obb.h"

////////////////////////////////////////////////////////////////////////////////////////////

void Swap(float & a, float & b)
{
    float t;
    t = a;
    a = b;
    b = t;
}

////////////////////////////////////////////////////////////////////////////////////////////

/*
float Clamp(float value, float min, float max)
{
	if (value > max)
		value -= (max-min);
	
	if (value < min)
		value += (max-min);
	
	if ((value > max) || (value < min))
		value = Clamp(value, min, max);
  
	return value;
}
*/

////////////////////////////////////////////////////////////////////////////////////////////

float NormalizeAngle(float value)
{
	if( value > 360 )
		value -= 360;
	
	if( value < 0 )
		value += 360;
	
	if( (value > 360) || (value < 0) )
		value = NormalizeAngle(value);
  
	return value;
}

////////////////////////////////////////////////////////////////////////////////////////////

static float Abs( float scalar )
{
	if( scalar >= 0 )
		return scalar;
	else
		return -scalar;
}

////////////////////////////////////////////////////////////////////////////////////////////

GcVector3 GcMath::ClaculateNormal(GcPoint3 p1, GcPoint3 p2, GcPoint3 p3)
{
	GcVector3 temp1;
	GcVector3 temp2;

	// Extract the vectors from the point
	temp1 = p1 - p2;
	temp2 = p1 - p3;

	// Calculate the normal
	temp1.Normalize(temp2);

	return temp1;
}

////////////////////////////////////////////////////////////////////////////////////////////

void GcMath::ProjectTriangle(const GcVector3 & V, const GcTriangle & triangle, 
							 float & min, float & max)
{
    float dot;
	
	// Take one point of the triangle and project onto V
	// For starting, we assume this to be the max and min until proven otherwise
	min = V.DotProduct( triangle.a );
    max = min;

    	
	// Project the next point of the triangle onto V
	dot = V.DotProduct( triangle.b );
    
	// Is it a new max/min ?
	if( dot < min )
        min = dot;
    else if( dot > max )
        max = dot;

    
	// Project the last point of the triangle onto V
	dot = V.DotProduct( triangle.c );
    
	// Is it a new max/min ?
	if( dot < min )
        min = dot;
    else if( dot > max )
        max = dot;
}

////////////////////////////////////////////////////////////////////////////////////////////

// FIXA CONST
void GcMath::ProjectOBB( const GcVector3 & V, GcOBB & obb, float & min, float & max )
{
//    GcOBB FANJAVLAHELVETE = obb;
	GcVector3 center = obb.GetWorldTranslation();
	GcVector3 extent = obb.Extents();
	GcVector3 distance;
	
	// Project the OBB center onto the given vector
	// This gives us a reference point on the vector
	float obbCenterOnV = V.DotProduct( center );
    
	
	

	
	// Project each axis onto V so we get a radius of the OBB on V
	distance.x = extent.x * ( V.DotProduct( obb.Axis(0) ) );
	distance.y = extent.y * ( V.DotProduct( obb.Axis(1) ) );
	distance.z = extent.z * ( V.DotProduct( obb.Axis(2) ) );

	float radius = fabs( distance.x ) + fabs( distance.y ) + fabs( distance.z );
    
	min = obbCenterOnV - radius;
    max = obbCenterOnV + radius;
}

////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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