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

📄 matrix.h

📁 030_Particle_system using opengl
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef _MATRIX4_H
#define _MATRIX4_H

/* matica vyzera takto:
  (  m11  m12  m13  m14  )      (  m[ 0]  m[ 4]  m[ 8]  m[12]  )      ( e[0][0] e[1][0] e[2][0] e[3][0] )
  (  m21  m22  m23  m24  ) ---- (  m[ 1]  m[ 5]  m[ 9]  m[13]  ) ---- ( e[0][1] e[1][1] e[2][1] e[3][1] )
  (  m31  m32  m33  m34  ) ---- (  m[ 2]  m[ 6]  m[10]  m[14]  ) ---- ( e[0][2] e[1][2] e[2][2] e[3][2] )
  (  m41  m42  m43  m44  )      (  m[ 3]  m[ 7]  m[11]  m[15]  )      ( e[0][3] e[1][3] e[2][3] e[3][3] )
  v OpenGL sa matice ukladaju nie po riadkoch, ale po stlcoch, t.j. 11,21,31,41,12,22,32,42,...
  mij, i je riadok, j je stlpec  mij == m[ (j-1)*4+i-1 ] == e[j][i]
  vec sa pouziva ako stlpcovy vektor t.j. vec = mat4*vec
*/

#include "Vector.h"
//#include <math.h>

#ifndef PI180
#define PI180	0.0174532925199432957692369076848861f	// pi / 180
#endif

class mat4 
{
public:
	union 
	{
		float m[16];
		float e[4][4];
		struct 
		{
			float m11; float m21; float m31; float m41;
			float m12; float m22; float m32; float m42;
			float m13; float m23; float m33; float m43;
			float m14; float m24; float m34; float m44;
		};
	};

	inline mat4();					// konstruktor, vytvori jednotkovu maticu
	inline mat4( const mat4 &a);	// kopirovaci konstruktor
	// zadanie je po riadkoch, v opacnom porati ako su v OpenGL (tam su po stlpcoch)
	inline mat4( const float Am11, const float Am12, const float Am13, const float Am14,
					 const float Am21, const float Am22, const float Am23, const float Am24,
					 const float Am31, const float Am32, const float Am33, const float Am34,
					 const float Am41, const float Am42, const float Am43, const float Am44);

	inline mat4 operator+() const;		// pozitive
	inline mat4 operator-() const;		// negative

	inline mat4 operator!() const;		// Inverse
	inline mat4 operator~() const;		// Transpose

	inline void operator+= ( const mat4 &a );
	inline void operator-= ( const mat4 &a );
	inline void operator*= ( const mat4 &b );		// sprava
	inline void operator/= ( const mat4 &a );
	inline void operator*= ( const float f );	// vynasobi, kazdy prvok matice s f
	inline void operator/= ( const float f );

	inline friend mat4 operator+ ( const mat4 &a, const mat4 &b );
	inline friend mat4 operator- ( const mat4 &a, const mat4 &b );
	inline friend mat4 operator* ( const mat4 &a, const mat4 &b );
	inline friend mat4 operator/ ( const mat4 &a, const mat4 &b );

	inline friend mat4 operator* ( const mat4 &a, const float f );
	inline friend mat4 operator* ( const float f, const mat4 &a );
	inline friend mat4 operator/ ( const mat4 &a, const float f );
	inline friend mat4 operator/ ( const float f, const mat4 &a );

	inline friend vec operator*( const mat4 &m, const vec &v );

	inline float Det2();
	inline float Det3();
	inline float Det4();

	inline void Identity();	
	inline void RotX( const float angle );
	inline void RotY( const float angle );
	inline void RotZ( const float angle );
	inline void Scale( const float x, const float y, const float z );
	inline void Scale( const vec &V );
	inline void Translate( const float x, const float y, const float z );
	inline void Translate( const vec &V );
	
	inline void glGetMatrix();
	inline void glSetMatrix() const;
	inline void glMultMatrix() const;

	inline void MakeMatrix( const vec vr, const vec vu, const vec ve );
	inline void Rotate( const vec &p, const vec &vec, const float angle);

	inline void MirrorMatrix( const vec &normal, const vec &pointOnPlane);
	inline void MirrorMatrix( const vec &normal, float distance);

//	inline void Invert();		// ??
//	void GetEulerAngles( float &xT, float &yT, float &zT );
//	void BuildMirrorPlane( const UPlane plane );
};

inline mat4::mat4()		// konstruktor, vytvori jednotkovu maticu
{
	m11 = 1; m12 = 0; m13 = 0; m14 = 0;	// 1 0 0 0
	m21 = 0; m22 = 1; m23 = 0; m24 = 0;	// 0 1 0 0
	m31 = 0; m32 = 0; m33 = 1; m34 = 0;	// 0 0 1 0
	m41 = 0; m42 = 0; m43 = 0; m44 = 1;	// 0 0 0 1
}

inline mat4::mat4( const mat4 &a)	// kopirovaci konstruktor
{
	for(int i=0; i<16; i++) m[i]=a.m[i];
}

// zadanie je po riadkoch, v opacnom porati ako su v OpenGL (tam su po stlpcoch)
inline mat4::mat4( const float Am11, const float Am12, const float Am13, const float Am14,
						   const float Am21, const float Am22, const float Am23, const float Am24,
						   const float Am31, const float Am32, const float Am33, const float Am34,
						   const float Am41, const float Am42, const float Am43, const float Am44)
{
	m11 = Am11; m12 = Am12; m13 = Am13; m14 = Am14;
	m21 = Am21; m22 = Am22; m23 = Am23; m24 = Am24;
	m31 = Am31; m32 = Am32; m33 = Am33; m34 = Am34;
	m41 = Am41; m42 = Am42; m43 = Am43; m44 = Am44;
}

inline void mat4::Identity()
{
	m11 = 1; m12 = 0; m13 = 0; m14 = 0;	// 1 0 0 0
	m21 = 0; m22 = 1; m23 = 0; m24 = 0;	// 0 1 0 0
	m31 = 0; m32 = 0; m33 = 1; m34 = 0;	// 0 0 1 0
	m41 = 0; m42 = 0; m43 = 0; m44 = 1;	// 0 0 0 1
}

inline mat4 mat4::operator+() const
{	return *this;}

inline mat4 mat4::operator-() const
{
	return mat4( -m11, -m12, -m13, -m14,
					 -m21, -m22, -m23, -m24,
					 -m31, -m32, -m33, -m34,
					 -m41, -m42, -m43, -m44 );
}

inline mat4 mat4::operator!() const		// Inverse ???
{
	mat4 A;

	const float M3344 = m33 * m44 - m34 * m43;
	const float M3244 = m32 * m44 - m34 * m42;
	const float M3243 = m32 * m43 - m33 * m42;
	const float M2344 = m23 * m44 - m24 * m43;
	const float M2244 = m22 * m44 - m24 * m42;
	const float M2243 = m22 * m43 - m23 * m42;
	const float M2334 = m23 * m34 - m24 * m33;
	const float M2234 = m22 * m34 - m24 * m32;
	const float M2233 = m22 * m33 - m23 * m32;
	const float M3144 = m31 * m44 - m34 * m41;
	const float M3143 = m31 * m43 - m33 * m41;
	const float M2144 = m21 * m44 - m24 * m41;
	const float M2143 = m21 * m43 - m23 * m41;
	const float M2134 = m21 * m34 - m24 * m31;
	const float M2133 = m21 * m33 - m23 * m31;
	const float M3142 = m31 * m42 - m32 * m41;
	const float M2142 = m21 * m42 - m22 * m41;
	const float M2132 = m21 * m32 - m22 * m31;

	A.m11 =  m22 * M3344 - m23 * M3244 + m24 * M3243;
	A.m12 = -m12 * M3344 + m13 * M3244 - m14 * M3243;
	A.m13 =  m12 * M2344 - m13 * M2244 + m14 * M2243;
	A.m14 = -m12 * M2334 + m13 * M2234 - m14 * M2233;

	A.m21 = -m21 * M3344 + m23 * M3144 - m24 * M3143;
	A.m22 =  m11 * M3344 - m13 * M3144 + m14 * M3143;
	A.m23 = -m11 * M2344 + m13 * M2144 - m14 * M2143;
	A.m24 =  m11 * M2334 - m13 * M2134 + m14 * M2133;

	A.m31 =  m21 * M3244 - m22 * M3144 + m24 * M3142;
	A.m32 = -m11 * M3244 + m12 * M3144 - m14 * M3142;
	A.m33 =  m11 * M2244 - m12 * M2144 + m14 * M2142;
	A.m34 = -m11 * M2234 + m12 * M2134 - m14 * M2132;

	A.m41 = -m21 * M3243 + m22 * M3143 - m23 * M3142;
	A.m42 =  m11 * M3243 - m12 * M3143 + m13 * M3142;
	A.m43 = -m11 * M2243 + m12 * M2143 - m13 * M2142;
	A.m44 =  m11 * M2233 - m12 * M2133 + m13 * M2132;

	A /= m11 * A.m11 + m12 * A.m21 + m13 * A.m31 + m14 * A.m41;   // Determinant
	return A;
}

inline mat4 mat4::operator~() const		// Transpose
{
	return mat4(m11, m21, m31, m41,
					m12, m22, m32, m42,
					m13, m23, m33, m43,
					m14, m24, m34, m44 );
}

inline void mat4::operator+= ( const mat4 &a )
{
	for(int i=0; i < 16; i++) m[i] += a.m[i];
}

inline void mat4::operator-= ( const mat4 &a )
{
	for(int i=0; i < 16; i++) m[i] -= a.m[i];
}

inline void mat4::operator*= ( const mat4 &b )
{
	mat4 a(*this);

	m11 = a.m11*b.m11 + a.m12*b.m21 + a.m13*b.m31 + a.m14*b.m41;
	m12 = a.m11*b.m12 + a.m12*b.m22 + a.m13*b.m32 + a.m14*b.m42;
	m13 = a.m11*b.m13 + a.m12*b.m23 + a.m13*b.m33 + a.m14*b.m43;
	m14 = a.m11*b.m14 + a.m12*b.m24 + a.m13*b.m34 + a.m14*b.m44;

	m21 = a.m21*b.m11 + a.m22*b.m21 + a.m23*b.m31 + a.m24*b.m41;
	m22 = a.m21*b.m12 + a.m22*b.m22 + a.m23*b.m32 + a.m24*b.m42;
	m23 = a.m21*b.m13 + a.m22*b.m23 + a.m23*b.m33 + a.m24*b.m43;
	m24 = a.m21*b.m14 + a.m22*b.m24 + a.m23*b.m34 + a.m24*b.m44;

	m31 = a.m31*b.m11 + a.m32*b.m21 + a.m33*b.m31 + a.m34*b.m41;
	m32 = a.m31*b.m12 + a.m32*b.m22 + a.m33*b.m32 + a.m34*b.m42;
	m33 = a.m31*b.m13 + a.m32*b.m23 + a.m33*b.m33 + a.m34*b.m43;
	m34 = a.m31*b.m14 + a.m32*b.m24 + a.m33*b.m34 + a.m34*b.m44;

	m41 = a.m41*b.m11 + a.m42*b.m21 + a.m43*b.m31 + a.m44*b.m41;
	m42 = a.m41*b.m12 + a.m42*b.m22 + a.m43*b.m32 + a.m44*b.m42;
	m43 = a.m41*b.m13 + a.m42*b.m23 + a.m43*b.m33 + a.m44*b.m43;
	m44 = a.m41*b.m14 + a.m42*b.m24 + a.m43*b.m34 + a.m44*b.m44;
}

inline void mat4::operator/= ( const mat4 &a )
{	*this *= !a;}

inline void mat4::operator *= (float f)
{
	for(int i=0; i < 16; i++) m[i] *= f;
}

inline void mat4::operator /= (float f)
{
	float d=1.0f/f;
	for(int i=0; i < 16; i++) m[i] *= d;
}

inline mat4 operator+ ( const mat4 &a, const mat4 &b )
{
	return mat4( a.m11 + b.m11, a.m12 + b.m12, a.m13 + b.m13, a.m14 + b.m14,
					 a.m21 + b.m21, a.m22 + b.m22, a.m23 + b.m23, a.m24 + b.m24,
					 a.m31 + b.m31, a.m32 + b.m32, a.m33 + b.m33, a.m34 + b.m34,
					 a.m41 + b.m41, a.m42 + b.m42, a.m43 + b.m43, a.m44 + b.m44 );
}

inline mat4 operator- ( const mat4 &a, const mat4 &b )
{
	return mat4( a.m11 - b.m11, a.m12 - b.m12, a.m13 - b.m13, a.m14 - b.m14,
					 a.m21 - b.m21, a.m22 - b.m22, a.m23 - b.m23, a.m24 - b.m24,
					 a.m31 - b.m31, a.m32 - b.m32, a.m33 - b.m33, a.m34 - b.m34,
					 a.m41 - b.m41, a.m42 - b.m42, a.m43 - b.m43, a.m44 - b.m44 );
}
inline mat4 operator* ( const mat4 &a, const mat4 &b )
{
	mat4 c;
	
	c.m11 = a.m11*b.m11 + a.m12*b.m21 + a.m13*b.m31 + a.m14*b.m41;
	c.m12 = a.m11*b.m12 + a.m12*b.m22 + a.m13*b.m32 + a.m14*b.m42;
	c.m13 = a.m11*b.m13 + a.m12*b.m23 + a.m13*b.m33 + a.m14*b.m43;
	c.m14 = a.m11*b.m14 + a.m12*b.m24 + a.m13*b.m34 + a.m14*b.m44;

	c.m21 = a.m21*b.m11 + a.m22*b.m21 + a.m23*b.m31 + a.m24*b.m41;
	c.m22 = a.m21*b.m12 + a.m22*b.m22 + a.m23*b.m32 + a.m24*b.m42;
	c.m23 = a.m21*b.m13 + a.m22*b.m23 + a.m23*b.m33 + a.m24*b.m43;
	c.m24 = a.m21*b.m14 + a.m22*b.m24 + a.m23*b.m34 + a.m24*b.m44;

	c.m31 = a.m31*b.m11 + a.m32*b.m21 + a.m33*b.m31 + a.m34*b.m41;
	c.m32 = a.m31*b.m12 + a.m32*b.m22 + a.m33*b.m32 + a.m34*b.m42;
	c.m33 = a.m31*b.m13 + a.m32*b.m23 + a.m33*b.m33 + a.m34*b.m43;
	c.m34 = a.m31*b.m14 + a.m32*b.m24 + a.m33*b.m34 + a.m34*b.m44;

	c.m41 = a.m41*b.m11 + a.m42*b.m21 + a.m43*b.m31 + a.m44*b.m41;
	c.m42 = a.m41*b.m12 + a.m42*b.m22 + a.m43*b.m32 + a.m44*b.m42;
	c.m43 = a.m41*b.m13 + a.m42*b.m23 + a.m43*b.m33 + a.m44*b.m43;
	c.m44 = a.m41*b.m14 + a.m42*b.m24 + a.m43*b.m34 + a.m44*b.m44;
	return c;
}

inline mat4 operator/ ( const mat4 &a, const mat4 &b )
{
	return a * !b;
}

inline mat4 operator* ( const mat4 &a, const float f )
{
	return mat4( a.m11*f, a.m12*f, a.m13*f, a.m14*f,
					 a.m21*f, a.m22*f, a.m23*f, a.m24*f,
					 a.m31*f, a.m32*f, a.m33*f, a.m34*f,
					 a.m41*f, a.m42*f, a.m43*f, a.m44*f );
}
inline mat4 operator* ( const float f, const mat4 &a )
{
	return mat4( a.m11*f, a.m12*f, a.m13*f, a.m14*f,
					 a.m21*f, a.m22*f, a.m23*f, a.m24*f,
					 a.m31*f, a.m32*f, a.m33*f, a.m34*f,
					 a.m41*f, a.m42*f, a.m43*f, a.m44*f );
}
inline mat4 operator/ ( const mat4 &a, const float f )
{
	float f_ = 1.0f/f;
	return mat4( a.m11*f_, a.m12*f_, a.m13*f_, a.m14*f_,
					 a.m21*f_, a.m22*f_, a.m23*f_, a.m24*f_,
					 a.m31*f_, a.m32*f_, a.m33*f_, a.m34*f_,
					 a.m41*f_, a.m42*f_, a.m43*f_, a.m44*f_ );
}
inline mat4 operator/ ( const float f, const mat4 &a )
{
	return f * !a;
}

inline vec operator*( const mat4 &m, const vec &v )
{																// m11 m12 m13 m14   v.x
	return vec( m.m11*v.x + m.m12*v.y + m.m13*v.z + m.m14,	// m21 m22 m23 m24 X v.y
					m.m21*v.x + m.m22*v.y + m.m23*v.z + m.m24,	// m31 m32 m33 m34   v.z
					m.m31*v.x + m.m32*v.y + m.m33*v.z + m.m34 );// m41 m42 m43 m44   1.0f
}

inline float mat4::Det2() 
{
	return m11 * m22 - m12 * m21; 
}

inline float mat4::Det3() 
{
	return	m11 * (m22 * m33 - m32 * m23) -
			m21 * (m12 * m33 - m32 * m13) +
			m31 * (m12 * m23 - m22 * m13);
}

inline float mat4::Det4()
{
	const float M3344 = m33 * m44 - m43 * m34;
	const float M2344 = m23 * m44 - m43 * m24;
	const float M2334 = m23 * m34 - m33 * m24;
	const float M1344 = m13 * m44 - m43 * m14;
	const float M1334 = m13 * m34 - m33 * m14;
	const float M1324 = m13 * m24 - m23 * m14;	
	return	m11 * (m22 * M3344 - m32 * M2344 + m42 * M2334) -
			m21 * (m12 * M3344 - m32 * M1344 + m42 * M1334) +
			m31 * (m12 * M2344 - m22 * M1344 + m42 * M1324) -
			m41 * (m12 * M2334 - m22 * M1334 + m32 * M1324);

⌨️ 快捷键说明

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