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

📄 matrix.h

📁 environment_mapped_bump_mapping using opengl
💻 H
📖 第 1 页 / 共 2 页
字号:
inline float CMatrix4::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);
}

inline void CMatrix4::RotX( const float angle )
{
	const float c = (float) cos( PI180*angle );
	const float s = (float) sin( PI180*angle );
	CMatrix4 m(*this);

	m.m12 =  c*m12 + s*m13;	m.m13 = -s*m12 + c*m13;		// 1  0  0  0
	m.m22 =  c*m22 + s*m23;	m.m23 = -s*m22 + c*m23;		// 0  c -s  0
	m.m32 =  c*m32 + s*m33;	m.m33 = -s*m32 + c*m33;		// 0  s  c  0
	m.m42 =  c*m42 + s*m43;	m.m43 = -s*m42 + c*m43;		// 0  0  0  1
	*this = m;
}

inline void CMatrix4::RotY( const float angle )
{
	const float c = (float) cos( PI180*angle );
	const float s = (float) sin( PI180*angle );
	CMatrix4 m(*this);

	m.m11 = c*m11 - s*m13;	m.m13 = s*m11 + c*m13;	// c  0  s  0
	m.m21 = c*m21 - s*m23;	m.m23 = s*m21 + c*m23;	// 0  1  0  0
	m.m31 = c*m31 - s*m33;	m.m33 = s*m31 + c*m33;	//-s  0  c  0
	m.m41 = c*m41 - s*m43;	m.m43 = s*m41 + c*m43;	// 0  0  0  1
	*this = m;
}

inline void CMatrix4::RotZ( const float angle )
{
	const float c = (float) cos( PI180*angle );
	const float s = (float) sin( PI180*angle );
	CMatrix4 m(*this);
	m.m11 = c*m11 + s*m12;	m.m12 = -s*m11 + c*m12;	// c -s  0  0
	m.m21 = c*m21 + s*m22;	m.m22 = -s*m21 + c*m22;	// s  c  0  0
	m.m31 = c*m31 + s*m32;	m.m32 = -s*m31 + c*m32;	// 0  0  1  0
	m.m41 = c*m41 + s*m42;	m.m42 = -s*m41 + c*m42;	// 0  0  0  1
	*this = m;
}

inline void CMatrix4::Scale( const float x, const float y, const float z )
{
	m11 *= x;	m12 *= y;	m13 *= z;	// x 0 0 0
	m21 *= x;	m22 *= y;	m23 *= z;	// 0 y 0 0
	m31 *= x;	m32 *= y;	m33 *= z;	// 0 0 z 0
	m41 *= x;	m42 *= y;	m43 *= z;	// 0 0 0 1
}
inline void CMatrix4::Scale( const CVector &V )
{
	m11 *= V.x;	m12 *= V.y;	m13 *= V.z;	// x 0 0 0
	m21 *= V.x;	m22 *= V.y;	m23 *= V.z;	// 0 y 0 0
	m31 *= V.x;	m32 *= V.y;	m33 *= V.z;	// 0 0 z 0
	m41 *= V.x;	m42 *= V.y;	m43 *= V.z;	// 0 0 0 1
}

inline void CMatrix4::Translate( const float x, const float y, const float z )
{
	m14 += m11*x + m12*y + m13*z;	// 1 0 0 x
	m24 += m21*x + m22*y + m23*z;	// 0 1 0 y
	m34 += m31*x + m32*y + m33*z;	// 0 0 1 z
	m44 += m41*x + m42*y + m43*z;	// 0 0 0 1
}
inline void CMatrix4::Translate( const CVector &V )
{
	m14 += m11*V.x + m12*V.y + m13*V.z;	// 1 0 0 V.x
	m24 += m21*V.x + m22*V.y + m23*V.z;	// 0 1 0 V.y
	m34 += m31*V.x + m32*V.y + m33*V.z;	// 0 0 1 V.z
	m44 += m41*V.x + m42*V.y + m43*V.z;	// 0 0 0 1
}

inline void CMatrix4::glGetMatrix(){glGetFloatv( GL_MODELVIEW_MATRIX, m);}
inline void CMatrix4::glSetMatrix() const {glLoadMatrixf( m);}
inline void CMatrix4::glMultMatrix() const {glMultMatrixf( m);}

// vytvori maticu m pre ktoru plati (v pripade, ze m14, m24, m34 == 0):
// m*vr = CVector(1,0,0)
// m*vu = CVector(0,1,0)
// m*ve = CVector(0,0,1)
// m*CVector(1,0,0) = CVector(vr.x, vu.x, ve.x)
// m*CVector(0,1,0) = CVector(vr.y, vu.y, ve.y)
// m*CVector(0,0,1) = CVector(vr.z, vu.z, ve.z)
// matica otoci vektor vr na os x, vu na os y a ve na os z

// matica mT = ~m (transponovana matica) (v pripade ze m14, m24, m34 == 0) 
// nam otoci os x na vr, os y na vu a os z na ve
// mT*CVector(1,0,0) = vr
// mT*CVector(0,1,0) = vu
// mT*CVector(0,0,1) = ve

// vr - vector right - vektor smerujuci vpravo
// vu - vector up    - vektor smerujuci hore
// ve - vector eye   - vektor smerujuci k ociam
// vektory musia byt normalizovane !

inline void CMatrix4::MakeMatrix( const CVector vr, const CVector vu, const CVector ve)
{
	m11 = vr.x;		m12 = vr.y;		m13 = vr.z;
	m21 = vu.x;		m22 = vu.y;		m23 = vu.z;
	m31 = ve.x;		m32 = ve.y;		m33 = ve.z;
}

inline void CMatrix4::Rotate( const CVector &p, const CVector &vec, const float angle)
{
	CVector v(vec);		// 2 krat rychlejsi
	v.Normalise();
	CMatrix4 s,u,I;

	// u = vvT
	u.m11 = v.x*v.x;	u.m12 = v.x*v.y;	u.m13 = v.x*v.z;
	u.m21 = v.y*v.x;	u.m22 = v.y*v.y;	u.m23 = v.y*v.z;
	u.m31 = v.z*v.x;	u.m32 = v.z*v.y;	u.m33 = v.z*v.z;
	u.m44 = 0;

	v *= (float)sin( angle*PI180);

	I.m44 = 0;
	s.m11 =    0;	s.m12 = -v.z;	s.m13 =  v.y;
	s.m21 =  v.z;	s.m22 =    0;	s.m23 = -v.x;
	s.m31 = -v.y;	s.m32 =  v.x;	s.m33 =    0;
	s.m44 = 0;

	//	R = vvT + cos(uhol)*(I-vvT) + sin(uhol)*s
	*this = u + (float)cos(angle*PI180)*(I-u) + s;
	m44 = 1;

/*	CMatrix4 T,Rx,Ry,Rz,Ryi,Rxi,Ti;
	CVector v(vec);
	float a;

	T.Translate( -p );		// posunutie do bodu -p
	Ti.Translate( p );		// posunutie do bodu p

	v.Normalise();
	a = (float) sqrt( v.y*v.y + v.z*v.z);		// a - velkost vektora premietnutneho do yz

	if(a!=0)				// ak a==0 nema zmysel rotovat okolo x, pretoze v=(1,0,0)
	{
		// 1. rotacia v okolo x tak aby sa v dostal do roviny xz
		//  v\   | y   v sa ma dostat na z (xz), uhol pre rotaciu je uhol medzi v a z
		//    \  |     velkost v v tomto priemete je a
		//     \ |     sin = v.y/a
		//      \|     cos = v.z/a = [(0, v.y, v.z)dot(0, 0, v.z)]/[a*v.z]
		// z-----+                         (  1    0     0  )
		// rotacna matica pre rotaciu x :  (  0   cos  -sin )
		//                                 (  0   sin   cos )
		Rx.m22 = v.z/a; Rx.m23 =-v.y/a;
		Rx.m32 = v.y/a; Rx.m33 = v.z/a;

		Rxi.m22 = v.z/a; Rxi.m23 = v.y/a;
		Rxi.m32 =-v.y/a; Rxi.m33 = v.z/a;
	}
	// 2. rotacia v okolo osi y tak aby sa v stotoznil so z
	//        ^ y           vektor v je uz v rovine xz
	//        |             v budeme rotavat okolo osi y, tak aby sa stotoznil so z
	//        |             -----+----- x  vektor v rotujeme v smere pravotocivej skrutky okolo osi y
	//        +----- x     -x   /|         velkost vektora je v je 1 = (v.x^2+a^2)^0.5
	//       / \               / |         sin = -v.x
	//      /   \             /  |         cos = a
	//    z/     \v         v/   | z                           (  cos  0  sin )
	//                          rotacna matica pre rotaciu y : (   0   1   0  )
	//                                                         ( -sin  0  cos )
	Ry.m11 = a;    Ry.m13 = -v.x;
	Ry.m31 = v.x;  Ry.m33 = a;
	
	Ryi.m11 = a;    Ryi.m13 = v.x;
	Ryi.m31 = -v.x; Ryi.m33 = a;
	
	// 3. rotacia okolo z o uhol angle
	Rz.RotZ( angle);

	*this = Ti*Rxi*Ryi*Rz*Ry*Rx*T;*/
}

/*
inline void CMatrix4::Invert()
{
    float a,b,c,d,e,f,g,h,i,j,k,l;
    float dW;

    a = m[ 0];	b = m[ 1];	c = m[ 2];
    d = m[ 4];	e = m[ 5];	f = m[ 6];
    g = m[ 8];	h = m[ 9];	i = m[10];
    j = m[12];	k = m[13];	l = m[14];

    dW = 1.0f / ( a*(e*i - f*h) - ( b*(d*i - f*g) + c*(e*g - d*h) ) );

    m[ 0]= (e*i - f*h) * dW;
    m[ 1]= (c*h - b*i) * dW;
    m[ 2]= (b*f - c*e) * dW;

    m[ 4]= (f*g - d*i) * dW;
    m[ 5]= (a*i - c*g) * dW;
    m[ 6]= (c*d - a*f) * dW;

    m[ 8]= (d*h - e*g) * dW;
    m[ 9]= (b*g - a*h) * dW;
    m[10]= (a*e - b*d) * dW;

    m[12]= ((e*(g*l - i*j) + f*(h*j - g*k) - d*(h*l - i*k)) * dW);
	m[13]= ((a*(h*l - i*k) + b*(i*j - g*l) + c*(g*k - h*j)) * dW);
	m[14]= ((b*(d*l - f*j) + c*(e*j - d*k) - a*(e*l - f*k)) * dW);
}
*/
/*
void CMatrix4::GetEulerAngles( float &xT, float &yT, float &zT )
{
	float angleX, angleY, angleZ;
	angleY = arctan2( m13, FastSqrt(m23*m23+m33*m33) );
	float cosangleY = cosf( angleY );

	if ( absf(cosangleY) > EPSILON ) {
		angleZ = arctan2(-m12/cosangleY, m11/cosangleY);
		angleX = arctan2(-m23/cosangleY, m33/cosangleY);
	} else {
		if ( absf(PIhalf-angleY) < EPSILON )	{
			angleX = arctan2(m21 , m22);
			angleY = PIhalf;
			angleZ = 0.0f;
		} else {
			angleX = arctan2(-m21, m22);
			angleY = -PIhalf;
			angleZ = 0.0f;
		}
	}
	// We set the result:
	float PIUNDER180 = 180.0f / PI;
	xT = (float) ( -angleX*PIUNDER180 );
	yT = (float) ( -angleY*PIUNDER180 );
	zT = (float) ( -angleZ*PIUNDER180 );
}

void CMatrix4::BuildMirrorPlane( const UPlane plane ) {
		const float fX = plane.normal.x;
		const float fY = plane.normal.y;
		const float fZ = plane.normal.z;
		const float fD = plane.dist;
		
		m11 = -(2.0f * fX * fX);
		m21 = -(2.0f * fX * fY);
		m31 = -(2.0f * fX * fZ);
		m41 = 0.0f;

		m12 = -(2.0f * fY * fX);
		m22 = -(2.0f * fY * fY);
		m32 = -(2.0f * fY * fZ);
		m42 = 0.0f;

		m13 = -(2.0f * fZ * fX);
		m23 = -(2.0f * fZ * fY);
		m33 = -(2.0f * fZ * fZ);
		m43 = 0.0f;

		m14 = -(2.0f * fD * fX);
		m24 = -(2.0f * fD * fY);
		m34 = -(2.0f * fD * fZ);
		m44 = 1.0f;
}
*/
/*
	void rotP(vector p, float x, float y, float z)
	{
		matrix trans;
	}

	void rotInv(float x, float y, float z)
	{
		float cx, cy, cz, sx, sy, sz;

		cx = (float)cos(x);
		sx = (float)sin(x);
		cy = (float)cos(y);
		sy = (float)sin(y);
		cz = (float)cos(z);
		sz = (float)sin(z);

		matrix mat;

		mat.m[0] = cy * cz;
		mat.m[4] = cy * sz;
		mat.m[8] = -sy;
		
		mat.m[1] = (sx * sy * cz) - (cx * sz);
		mat.m[5] = (sx * sy * sz) + (cx * cz);
		mat.m[9] = sx * cy;
		
		mat.m[2] = (cx * sy * cz) + (sx * sz);
		mat.m[6] = (cx * sy * sz) - (sx * cz);
		mat.m[10] = cx * cy;

		*this = mat * *this;
	}

	void rot(float x, float y, float z)
	{
		float cx, cy, cz, sx, sy, sz;

		cx = (float)cos(x);
		sx = (float)sin(x);
		cy = (float)cos(y);
		sy = (float)sin(y);
		cz = (float)cos(z);
		sz = (float)sin(z);

		matrix mat;

		mat.m[0] = cy * cz;
		mat.m[1] = cy * sz;
		mat.m[2] = -sy;
		
		mat.m[4] = (sx * sy * cz) - (cx * sz);
		mat.m[5] = (sx * sy * sz) + (cx * cz);
		mat.m[6] = sx * cy;
		
		mat.m[8] = (cx * sy * cz) + (sx * sz);
		mat.m[9] = (cx * sy * sz) - (sx * cz);
		mat.m[10] = cx * cy;

		*this = mat * *this;
	}
};
*/
#endif

⌨️ 快捷键说明

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