📄 matrix3d.as
字号:
{ 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 + -