📄 matrix3d.as
字号:
package org.papervision3d.core.math{ import org.papervision3d.Papervision3D; /** * The Matrix3D class lets you create and manipulate 4x3 3D transformation matrices. */public class Matrix3D{ /** * X O O O * O O O O * O O O O */ public var n11 :Number; /** * O X O O * O O O O * O O O O */ public var n12 :Number; /** * O O X O * O O O O * O O O O */ public var n13 :Number; /** * O O O X * O O O O * O O O O */ public var n14 :Number; /** * O O O O * X O O O * O O O O */ public var n21 :Number; /** * O O O O * O X O O * O O O O */ public var n22 :Number; /** * O O O O * O O X O * O O O O */ public var n23 :Number; /** * O O O O * O O O X * O O O O */ public var n24 :Number; /** * O O O O * O O O O * X O O O */ public var n31 :Number; /** * O O O O * O O O O * O X O O */ public var n32 :Number; /** * O O O O * O O O O * O O X O */ public var n33 :Number; /** * O O O O * O O O O * O O O X */ public var n34 :Number; /** * O O O O * O O O O * O O O O * X O O O */ public var n41 :Number; /** * O O O O * O O O O * O O O O * O X O O */ public var n42 :Number; /** * O O O O * O O O O * O O O O * O O X O */ public var n43 :Number; /** * O O O O * O O O O * O O O O * O O O X */ public var n44 :Number; // temp objects to save constant instantiation of objects. static private var temp : Matrix3D = Matrix3D.IDENTITY; static private var n3Di : Number3D = Number3D.ZERO; static private var n3Dj : Number3D = Number3D.ZERO; static private var n3Dk : Number3D = Number3D.ZERO; // _________________________________________________________________________________ Matrix3D /** * The Matrix3D constructor lets you create Matrix3D objects. * * @param args The values to populate the matrix with. Identity matrix is returned by default. */ public function Matrix3D( args:Array=null ) { reset(args); //trace("new matrix"); } // sets the properties of the Matrix without creating a new one. public function reset( args:Array = null) : void { if( ! args || args.length < 12 ) { n11 = n22 = n33 = n44 = 1; n12 = n13 = n14 = n21 = n23 = n24 = n31 = n32 = n34 = n41 = n42 = n43 = 0; } else { n11 = args[0]; n12 = args[1]; n13 = args[2]; n14 = args[3]; n21 = args[4]; n22 = args[5]; n23 = args[6]; n24 = args[7]; n31 = args[8]; n32 = args[9]; n33 = args[10]; n34 = args[11]; if( args.length == 16 ) { n41 = args[12]; n42 = args[13]; n43 = args[14]; n44 = args[15]; } else { n41 = n42 = n43 = 0; n44 = 1; } } } // _________________________________________________________________________________ IDENTITY public static function get IDENTITY():Matrix3D { //trace("Matrix.IDENTITY"); return new Matrix3D ( [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] ); } // _________________________________________________________________________________ trace public function toString():String { var s:String = ""; s += int(n11*1000)/1000 + "\t\t" + int(n12*1000)/1000 + "\t\t" + int(n13*1000)/1000 + "\t\t" + int(n14*1000)/1000 +"\n"; s += int(n21*1000)/1000 + "\t\t" + int(n22*1000)/1000 + "\t\t" + int(n23*1000)/1000 + "\t\t" + int(n24*1000)/1000 + "\n"; s += int(n31*1000)/1000 + "\t\t" + int(n32*1000)/1000 + "\t\t" + int(n33*1000)/1000 + "\t\t" + int(n34*1000)/1000 + "\n"; s += int(n41*1000)/1000 + "\t\t" + int(n42*1000)/1000 + "\t\t" + int(n43*1000)/1000 + "\t\t" + int(n44*1000)/1000 + "\n"; return s; } // _________________________________________________________________________________ OPERATIONS public function calculateMultiply( a:Matrix3D, b:Matrix3D ):void { var a11:Number = a.n11; var b11:Number = b.n11; var a21:Number = a.n21; var b21:Number = b.n21; var a31:Number = a.n31; var b31:Number = b.n31; var a12:Number = a.n12; var b12:Number = b.n12; var a22:Number = a.n22; var b22:Number = b.n22; var a32:Number = a.n32; var b32:Number = b.n32; var a13:Number = a.n13; var b13:Number = b.n13; var a23:Number = a.n23; var b23:Number = b.n23; var a33:Number = a.n33; var b33:Number = b.n33; var a14:Number = a.n14; var b14:Number = b.n14; var a24:Number = a.n24; var b24:Number = b.n24; var a34:Number = a.n34; var b34:Number = b.n34; this.n11 = a11 * b11 + a12 * b21 + a13 * b31; this.n12 = a11 * b12 + a12 * b22 + a13 * b32; this.n13 = a11 * b13 + a12 * b23 + a13 * b33; this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14; this.n21 = a21 * b11 + a22 * b21 + a23 * b31; this.n22 = a21 * b12 + a22 * b22 + a23 * b32; this.n23 = a21 * b13 + a22 * b23 + a23 * b33; this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24; this.n31 = a31 * b11 + a32 * b21 + a33 * b31; this.n32 = a31 * b12 + a32 * b22 + a33 * b32; this.n33 = a31 * b13 + a32 * b23 + a33 * b33; this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34; } public static function multiply( a:Matrix3D, b:Matrix3D ):Matrix3D { //trace("matrix.multiply"); var m:Matrix3D = new Matrix3D(); m.calculateMultiply( a, b ); return m; } public function calculateMultiply3x3( a:Matrix3D, b:Matrix3D ):void { var a11:Number = a.n11; var b11:Number = b.n11; var a21:Number = a.n21; var b21:Number = b.n21; var a31:Number = a.n31; var b31:Number = b.n31; var a12:Number = a.n12; var b12:Number = b.n12; var a22:Number = a.n22; var b22:Number = b.n22; var a32:Number = a.n32; var b32:Number = b.n32; var a13:Number = a.n13; var b13:Number = b.n13; var a23:Number = a.n23; var b23:Number = b.n23; var a33:Number = a.n33; var b33:Number = b.n33; this.n11 = a11 * b11 + a12 * b21 + a13 * b31; this.n12 = a11 * b12 + a12 * b22 + a13 * b32; this.n13 = a11 * b13 + a12 * b23 + a13 * b33; this.n21 = a21 * b11 + a22 * b21 + a23 * b31; this.n22 = a21 * b12 + a22 * b22 + a23 * b32; this.n23 = a21 * b13 + a22 * b23 + a23 * b33; this.n31 = a31 * b11 + a32 * b21 + a33 * b31; this.n32 = a31 * b12 + a32 * b22 + a33 * b32; this.n33 = a31 * b13 + a32 * b23 + a33 * b33; } public function calculateMultiply4x4( a:Matrix3D, b:Matrix3D ):void { var a11:Number = a.n11; var b11:Number = b.n11; var a21:Number = a.n21; var b21:Number = b.n21; var a31:Number = a.n31; var b31:Number = b.n31; var a41:Number = a.n41; var b41:Number = b.n41; var a12:Number = a.n12; var b12:Number = b.n12; var a22:Number = a.n22; var b22:Number = b.n22; var a32:Number = a.n32; var b32:Number = b.n32; var a42:Number = a.n42; var b42:Number = b.n42; var a13:Number = a.n13; var b13:Number = b.n13; var a23:Number = a.n23; var b23:Number = b.n23; var a33:Number = a.n33; var b33:Number = b.n33; var a43:Number = a.n43; var b43:Number = b.n43; var a14:Number = a.n14; var b14:Number = b.n14; var a24:Number = a.n24; var b24:Number = b.n24; var a34:Number = a.n34; var b34:Number = b.n34; var a44:Number = a.n44; var b44:Number = b.n44; this.n11 = a11 * b11 + a12 * b21 + a13 * b31; this.n12 = a11 * b12 + a12 * b22 + a13 * b32; this.n13 = a11 * b13 + a12 * b23 + a13 * b33; this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14; this.n21 = a21 * b11 + a22 * b21 + a23 * b31; this.n22 = a21 * b12 + a22 * b22 + a23 * b32; this.n23 = a21 * b13 + a22 * b23 + a23 * b33; this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24; this.n31 = a31 * b11 + a32 * b21 + a33 * b31; this.n32 = a31 * b12 + a32 * b22 + a33 * b32; this.n33 = a31 * b13 + a32 * b23 + a33 * b33; this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34; this.n41 = a41 * b11 + a42 * b21 + a43 * b31; this.n42 = a41 * b12 + a42 * b22 + a43 * b32; this.n43 = a41 * b13 + a42 * b23 + a43 * b33; this.n44 = a41 * b14 + a42 * b24 + a43 * b34 + a44; } public static function multiply3x3( a:Matrix3D, b:Matrix3D ):Matrix3D { //trace("Multiply3x3"); var m:Matrix3D = new Matrix3D(); m.calculateMultiply3x3( a, b ); return m; } public function calculateAdd( a:Matrix3D, b:Matrix3D ):void { this.n11 = a.n11 + b.n11; this.n12 = a.n12 + b.n12; this.n13 = a.n13 + b.n13; this.n14 = a.n14 + b.n14; this.n21 = a.n21 + b.n21; this.n22 = a.n22 + b.n22; this.n23 = a.n23 + b.n23; this.n24 = a.n24 + b.n24; this.n31 = a.n31 + b.n31; this.n32 = a.n32 + b.n32; this.n33 = a.n33 + b.n33; this.n34 = a.n34 + b.n34; } public static function add( a:Matrix3D, b:Matrix3D ):Matrix3D { //trace("matrix.add"); var m:Matrix3D = new Matrix3D(); m.calculateAdd( a, b ); return m; } public function calculateInverse( m:Matrix3D ):void { var d:Number = m.det; if( Math.abs(d) > 0.001 ) { d = 1/d; var m11:Number = m.n11; var m21:Number = m.n21; var m31:Number = m.n31; var m12:Number = m.n12; var m22:Number = m.n22; var m32:Number = m.n32; var m13:Number = m.n13; var m23:Number = m.n23; var m33:Number = m.n33; var m14:Number = m.n14; var m24:Number = m.n24; var m34:Number = m.n34; this.n11 = d * ( m22 * m33 - m32 * m23 ); this.n12 = -d * ( m12 * m33 - m32 * m13 ); this.n13 = d * ( m12 * m23 - m22 * m13 ); this.n14 = -d * ( m12 * (m23*m34 - m33*m24) - m22 * (m13*m34 - m33*m14) + m32 * (m13*m24 - m23*m14) ); this.n21 = -d * ( m21 * m33 - m31 * m23 ); this.n22 = d * ( m11 * m33 - m31 * m13 ); this.n23 = -d* ( m11 * m23 - m21 * m13 ); this.n24 = d * ( m11 * (m23*m34 - m33*m24) - m21 * (m13*m34 - m33*m14) + m31 * (m13*m24 - m23*m14) ); this.n31 = d * ( m21 * m32 - m31 * m22 ); this.n32 = -d* ( m11 * m32 - m31 * m12 ); this.n33 = d * ( m11 * m22 - m21 * m12 ); this.n34 = -d* ( m11 * (m22*m34 - m32*m24) - m21 * (m12*m34 - m32*m14) + m31 * (m12*m24 - m22*m14) ); } } public static function inverse( m:Matrix3D ):Matrix3D { //trace("matrix.inverse"); var inv:Matrix3D = new Matrix3D(); inv.calculateInverse( m ); return inv; } public function invert() : void { temp.copy(this); calculateInverse(temp); } public function get det():Number { return (this.n11 * this.n22 - this.n21 * this.n12) * this.n33 - (this.n11 * this.n32 - this.n31 * this.n12) * this.n23 + (this.n21 * this.n32 - this.n31 * this.n22) * this.n13; } /*public function get trace():Number { return this.n11 + this.n22 + this.n33 + 1; }*/ // _________________________________________________________________________________ COPY public function copy( m:Matrix3D ):Matrix3D { 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 { //trace("matrix3D.clone"); 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 ]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -