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

📄 matrix3d.as

📁 一个2D基于verlet的Flash物理引擎。它用AS3编写而成。Fisix的目标是应用到游戏等计算量很大的实时应用中。尽管flash比c/c++要慢,很棒的物理引擎
💻 AS
📖 第 1 页 / 共 2 页
字号:
	{		this.n11 = m.n11;	this.n12 = m.n12;		this.n13 = m.n13;	this.n14 = m.n14;		this.n21 = m.n21;	this.n22 = m.n22;		this.n23 = m.n23;	this.n24 = m.n24;		this.n31 = m.n31;	this.n32 = m.n32;		this.n33 = m.n33;	this.n34 = m.n34;		return this;	}	public function copy3x3( m:Matrix3D ):Matrix3D	{		this.n11 = m.n11;   this.n12 = m.n12;   this.n13 = m.n13;		this.n21 = m.n21;   this.n22 = m.n22;   this.n23 = m.n23;		this.n31 = m.n31;   this.n32 = m.n32;   this.n33 = m.n33;		return this;	}	public static function clone( m:Matrix3D ):Matrix3D	{		return new Matrix3D		(			[				m.n11, m.n12, m.n13, m.n14,				m.n21, m.n22, m.n23, m.n24,				m.n31, m.n32, m.n33, m.n34			]		);	}	// _________________________________________________________________________________ VECTOR	public static function multiplyVector( m:Matrix3D, v:Number3D ):void	{		var vx:Number = v.x;		var vy:Number = v.y;		var vz:Number = v.z;		v.x = vx * m.n11 + vy * m.n12 + vz * m.n13 + m.n14;		v.y = vx * m.n21 + vy * m.n22 + vz * m.n23 + m.n24;		v.z = vx * m.n31 + vy * m.n32 + vz * m.n33 + m.n34;	}	public static function multiplyVector3x3( m:Matrix3D, v:Number3D ):void	{		var vx:Number = v.x;		var vy:Number = v.y;		var vz:Number = v.z;		v.x = vx * m.n11 + vy * m.n12 + vz * m.n13;		v.y = vx * m.n21 + vy * m.n22 + vz * m.n23;		v.z = vx * m.n31 + vy * m.n32 + vz * m.n33;	}	public static function rotateAxis( m:Matrix3D, v:Number3D ):void	{		var vx:Number = v.x;		var vy:Number = v.y;		var vz:Number = v.z;		v.x = vx * m.n11 + vy * m.n12 + vz * m.n13;		v.y = vx * m.n21 + vy * m.n22 + vz * m.n23;		v.z = vx * m.n31 + vy * m.n32 + vz * m.n33;		v.normalize();	}/*	public static function projectVector( m:Matrix3D, v:Number3D ):void	{		var c:Number = 1 / ( v.x * m.n41 + v.y * m.n42 + v.z * m.n43 + 1 );		multiplyVector( m, v );		v.x = v.x * c;		v.y = v.y * c;		v.z = 0;	}*/	// _________________________________________________________________________________ EULER/*	public static function matrix2eulerOLD( m:Matrix3D ):Number3D	{		var angle:Number3D = new Number3D();		var d :Number = -Math.asin( Math.max( -1, Math.min( 1, m.n13 ) ) ); // Calculate Y-axis angle		var c :Number =  Math.cos( d );		angle.y = d * toDEGREES;		var trX:Number, trY:Number;		if( Math.abs( c ) > 0.005 )  // Gimball lock?		{			trX =  m.n33 / c;  // No, so get X-axis angle			trY = -m.n23 / c;			angle.x = Math.atan2( trY, trX ) * toDEGREES;			trX =  m.n11 / c;  // Get Z-axis angle			trY = -m.n12 / c;			angle.z = Math.atan2( trY, trX ) * toDEGREES;		}		else  // Gimball lock has occurred		{			angle.x = 0;  // Set X-axis angle to zero			trX = m.n22;  // And calculate Z-axis angle			trY = m.n21;			angle.z = Math.atan2( trY, trX ) * toDEGREES;		}		// TODO: Clamp all angles to range		return angle;	}*/	public static function matrix2euler( t:Matrix3D ):Number3D	{		var rot:Number3D = new Number3D();		// Normalize the local x, y and z axes to remove scaling.		var i:Number3D = new Number3D( t.n11, t.n21, t.n31 );		var j:Number3D = new Number3D( t.n12, t.n22, t.n32 );		var k:Number3D = new Number3D( t.n13, t.n23, t.n33 );		i.normalize();		j.normalize();		k.normalize();		var m:Matrix3D = new Matrix3D(		[			i.x, j.x, k.x, 0,			i.y, j.y, k.y, 0,			i.z, j.z, k.z, 0		] );	    // Extract the first angle, rot.x		rot.x = Math.atan2( m.n23, m.n33 ); // rot.x = Math<T>::atan2 (M[1][2], M[2][2]);			// Remove the rot.x rotation from M, so that the remaining		// rotation, N, is only around two axes, and gimbal lock		// cannot occur.		var rx:Matrix3D = Matrix3D.rotationX( -rot.x );		var n:Matrix3D = Matrix3D.multiply( rx, m );		// Extract the other two angles, rot.y and rot.z, from N.		var cy:Number = Math.sqrt( n.n11 * n.n11 + n.n21 * n.n21); // T cy = Math<T>::sqrt (N[0][0]*N[0][0] + N[0][1]*N[0][1]);		rot.y = Math.atan2( -n.n31, cy ); // rot.y = Math<T>::atan2 (-N[0][2], cy);		rot.z = Math.atan2( -n.n12, n.n11 ); //rot.z = Math<T>::atan2 (-N[1][0], N[1][1]);		// Fix angles		if( rot.x == Math.PI )		{			if( rot.y > 0 )				rot.y -= Math.PI;			else				rot.y += Math.PI;			rot.x = 0;			rot.z += Math.PI;		}		// Convert to degrees if needed		rot.x *= toDEGREES;		rot.y *= toDEGREES;		rot.z *= toDEGREES;		return rot;	}		public static function euler2matrix( deg:Number3D ):Matrix3D	{		var m:Matrix3D = IDENTITY;		var ax:Number = deg.x * toRADIANS;		var ay:Number = deg.y * toRADIANS;		var az:Number = deg.z * toRADIANS;		var a:Number = Math.cos( ax );		var b:Number = Math.sin( ax );		var c:Number = Math.cos( ay );		var d:Number = Math.sin( ay );		var e:Number = Math.cos( az );		var f:Number = Math.sin( az );		var ad:Number = a * d;		var bd:Number = b * d;		m.n11 =  c  * e;		m.n12 = -c  * f;		m.n13 =  d;		m.n21 =  bd * e + a * f;		m.n22 = -bd * f + a * e;		m.n23 = -b  * c;		m.n31 = -ad * e + b * f;		m.n32 =  ad * f + b * e;		m.n33 =  a  * c;		return m;	}	// _________________________________________________________________________________ ROTATION	public static function rotationX( rad:Number ):Matrix3D	{		var m :Matrix3D = IDENTITY;		var c :Number   = Math.cos( rad );		var s :Number   = Math.sin( rad );		m.n22 =  c;		m.n23 = -s;		m.n32 =  s;		m.n33 =  c;		return m;	}	public static function rotationY( rad:Number ):Matrix3D	{		var m :Matrix3D = IDENTITY;		var c :Number   = Math.cos( rad );		var s :Number   = Math.sin( rad );		m.n11 =  c;		m.n13 = -s;		m.n31 =  s;		m.n33 =  c;		return m;	}	public static function rotationZ( rad:Number ):Matrix3D	{		var m :Matrix3D = IDENTITY;		var c :Number   = Math.cos( rad );		var s :Number   = Math.sin( rad );		m.n11 =  c;		m.n12 = -s;		m.n21 =  s;		m.n22 =  c;		return m;	}	public static function rotationMatrix( x:Number, y:Number, z:Number, rad:Number ):Matrix3D	{		var m:Matrix3D = IDENTITY;				var nCos:Number	= Math.cos( rad );		var nSin:Number	= Math.sin( rad );		var scos:Number	= 1 - nCos;		var sxy	:Number = x * y * scos;		var syz	:Number = y * z * scos;		var sxz	:Number = x * z * scos;		var sz	:Number = nSin * z;		var sy	:Number = nSin * y;		var sx	:Number = nSin * x;		m.n11 =  nCos + x * x * scos;		m.n12 = -sz   + sxy;		m.n13 =  sy   + sxz;		m.n21 =  sz   + sxy;		m.n22 =  nCos + y * y * scos;		m.n23 = -sx   + syz;		m.n31 = -sy   + sxz;		m.n32 =  sx   + syz;		m.n33 =  nCos + z * z * scos;		return m;	}	public static function rotationMatrixWithReference( axis:Number3D, rad:Number, ref:Number3D ):Matrix3D	{		var m:Matrix3D = Matrix3D.translationMatrix( ref.x, -ref.y, ref.z );		m.calculateMultiply( m, Matrix3D.rotationMatrix( axis.x, axis.y, axis.z, rad ) );		m.calculateMultiply( m, Matrix3D.translationMatrix ( -ref.x, ref.y, -ref.z ) );		return m;	}	// _________________________________________________________________________________ TRANSFORM	public static function translationMatrix( x:Number, y:Number, z:Number ):Matrix3D	{		var m:Matrix3D = IDENTITY;		m.n14 = x;		m.n24 = y;		m.n34 = z;		return m;	}	public static function scaleMatrix( x:Number, y:Number, z:Number ):Matrix3D	{		var m:Matrix3D = IDENTITY;		m.n11 = x;		m.n22 = y;		m.n33 = z;		return m;	}	// _________________________________________________________________________________ QUATERNIONS	public static function magnitudeQuaternion( q:Object ):Number    {		return( Math.sqrt( q.w * q.w + q.x * q.x + q.y * q.y + q.z * q.z ) );    }	public static function normalizeQuaternion( q:Object ):Object	{		var mag:Number = magnitudeQuaternion( q );		q.x /= mag;		q.y /= mag;		q.z /= mag;		q.w /= mag;		return q;	}	public static function axis2quaternion( x:Number, y:Number, z:Number, angle:Number ):Object	{		var sin:Number = Math.sin( angle / 2 );		var cos:Number = Math.cos( angle / 2 );		var q:Object = new Object();		q.x = x * sin;		q.y = y * sin;		q.z = z * sin;		q.w = cos;		return normalizeQuaternion( q );	}	public static function euler2quaternion( ax:Number, ay:Number, az:Number ):Object    {		var fSinPitch       :Number = Math.sin( ax * 0.5 );		var fCosPitch       :Number = Math.cos( ax * 0.5 );		var fSinYaw         :Number = Math.sin( ay * 0.5 );		var fCosYaw         :Number = Math.cos( ay * 0.5 );		var fSinRoll        :Number = Math.sin( az * 0.5 );		var fCosRoll        :Number = Math.cos( az * 0.5 );		var fCosPitchCosYaw :Number = fCosPitch * fCosYaw;		var fSinPitchSinYaw :Number = fSinPitch * fSinYaw;		var q:Object = new Object();		q.x = fSinRoll * fCosPitchCosYaw     - fCosRoll * fSinPitchSinYaw;		q.y = fCosRoll * fSinPitch * fCosYaw + fSinRoll * fCosPitch * fSinYaw;		q.z = fCosRoll * fCosPitch * fSinYaw - fSinRoll * fSinPitch * fCosYaw;		q.w = fCosRoll * fCosPitchCosYaw     + fSinRoll * fSinPitchSinYaw;		return q;    }	public static function quaternion2matrix( x:Number, y:Number, z:Number, w:Number ):Matrix3D	{		var xx:Number = x * x;		var xy:Number = x * y;		var xz:Number = x * z;		var xw:Number = x * w;		var yy:Number = y * y;		var yz:Number = y * z;		var yw:Number = y * w;		var zz:Number = z * z;		var zw:Number = z * w;		var m:Matrix3D = IDENTITY;		m.n11 = 1 - 2 * ( yy + zz );		m.n12 =     2 * ( xy - zw );		m.n13 =     2 * ( xz + yw );		m.n21 =     2 * ( xy + zw );		m.n22 = 1 - 2 * ( xx + zz );		m.n23 =     2 * ( yz - xw );		m.n31 =     2 * ( xz - yw );		m.n32 =     2 * ( yz + xw );		m.n33 = 1 - 2 * ( xx + yy );		return m;	}	public static function multiplyQuaternion( a:Object, b:Object ):Object    {		var ax:Number = a.x;  var ay:Number = a.y;  var az:Number = a.z;  var aw:Number = a.w;		var bx:Number = b.x;  var by:Number = b.y;  var bz:Number = b.z;  var bw:Number = b.w;		var q:Object = new Object();		q.x = aw*bx + ax*bw + ay*bz - az*by;		q.y = aw*by + ay*bw + az*bx - ax*bz;		q.z = aw*bz + az*bw + ax*by - ay*bx;		q.w = aw*bw - ax*bx - ay*by - az*bz;		return q;    }	// _________________________________________________________________________________ TRIG	static private var toDEGREES :Number = 180/Math.PI;	static private var toRADIANS :Number = Math.PI/180;		static private var _sin:Function = Math.sin;	static private var _cos:Function = Math.cos;}}

⌨️ 快捷键说明

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