📄 wmatrix4math.as
字号:
/**
* WOW-Engine AS3 3D Physics Engine, http://www.wow-engine.com
* Copyright (c) 2007-2008 Seraf ( Jerome Birembaut ) http://seraf.mediabox.fr
*
* Based on APE by Alec Cove , http://www.cove.org/ape/
* & Sandy3D by Thomas Pfeiffer, http://www.flashsandy.org/
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
package fr.seraf.wow.math {
import fr.seraf.wow.core.data.WMatrix4;
import fr.seraf.wow.core.data.WVector;
import fr.seraf.wow.util.WNumberUtil;
import fr.seraf.wow.math.WFastMath;
/**
* Math functions for {@link Matrix4}.
* @author Thomas Pfeiffer - kiroukou
* @since 0.1
* @version 0.2
* @date 12.01.2006
*
**/
public class WMatrix4Math
{
/**
* Compute the multiplication of 2 {@code Matrix4} but as they were 3x3 matrix.
*
* @param {@code m1} a {@code Matrix}.
* @param {@code m2} a {@code Matrix}.
* @return The result of computation : a {@code Matrix4}.
*/
public static function multiply3x3(m1:WMatrix4, m2:WMatrix4) : WMatrix4
{
var dest : WMatrix4 = WMatrix4.createIdentity();
var m111:Number = m1.n11; var m211:Number = m2.n11;
var m121:Number = m1.n21; var m221:Number = m2.n21;
var m131:Number = m1.n31; var m231:Number = m2.n31;
var m112:Number = m1.n12; var m212:Number = m2.n12;
var m122:Number = m1.n22; var m222:Number = m2.n22;
var m132:Number = m1.n32; var m232:Number = m2.n32;
var m113:Number = m1.n13; var m213:Number = m2.n13;
var m123:Number = m1.n23; var m223:Number = m2.n23;
var m133:Number = m1.n33; var m233:Number = m2.n33;
dest.n11 = m111 * m211 + m112 * m221 + m113 * m231;
dest.n12 = m111 * m212 + m112 * m222 + m113 * m232;
dest.n13 = m111 * m213 + m112 * m223 + m113 * m233;
dest.n21 = m121 * m211 + m122 * m221 + m123 * m231;
dest.n22 = m121 * m212 + m122 * m222 + m123 * m232;
dest.n23 = m121 * m213 + m122 * m223 + m123 * m233;
dest.n31 = m131 * m211 + m132 * m221 + m133 * m231;
dest.n32 = m131 * m212 + m132 * m222 + m133 * m232;
dest.n33 = m131 * m213 + m132 * m223 + m133 * m233;
return dest;
}
public static function multiply4x3( m1:WMatrix4, m2:WMatrix4 ):WMatrix4
{
var dest : WMatrix4 = WMatrix4.createIdentity();
var m111:Number = m1.n11; var m211:Number = m2.n11;
var m121:Number = m1.n21; var m221:Number = m2.n21;
var m131:Number = m1.n31; var m231:Number = m2.n31;
var m112:Number = m1.n12; var m212:Number = m2.n12;
var m122:Number = m1.n22; var m222:Number = m2.n22;
var m132:Number = m1.n32; var m232:Number = m2.n32;
var m113:Number = m1.n13; var m213:Number = m2.n13;
var m123:Number = m1.n23; var m223:Number = m2.n23;
var m133:Number = m1.n33; var m233:Number = m2.n33;
var m214:Number = m2.n14;
var m224:Number = m2.n24;
var m234:Number = m2.n34;
dest.n11 = m111 * m211 + m112 * m221 + m113 * m231;
dest.n12 = m111 * m212 + m112 * m222 + m113 * m232;
dest.n13 = m111 * m213 + m112 * m223 + m113 * m233;
dest.n21 = m121 * m211 + m122 * m221 + m123 * m231;
dest.n22 = m121 * m212 + m122 * m222 + m123 * m232;
dest.n23 = m121 * m213 + m122 * m223 + m123 * m233;
dest.n31 = m131 * m211 + m132 * m221 + m133 * m231;
dest.n32 = m131 * m212 + m132 * m222 + m133 * m232;
dest.n33 = m131 * m213 + m132 * m223 + m133 * m233;
dest.n14 = m214 * m111 + m224 * m112 + m234 * m113 + m1.n14;
dest.n24 = m214 * m121 + m224 * m122 + m234 * m123 + m1.n24;
dest.n34 = m214 * m131 + m224 * m132 + m234 * m133 + m1.n34;
return dest;
}
/**
* Compute the multiplication of 2 {@code Matrix4}.
*
* @param {@code m1} a {@code Matrix}.
* @param {@code m2} a {@code Matrix}.
* @return The result of computation : a {@code Matrix4}.
*/
public static function multiply(m1:WMatrix4, m2:WMatrix4) : WMatrix4
{
var dest:WMatrix4 = WMatrix4.createIdentity();
var m111:Number, m211:Number, m121:Number, m221:Number, m131:Number, m231:Number, m141:Number, m241:Number;
var m112:Number, m212:Number, m122:Number, m222:Number, m132:Number, m232:Number, m142:Number, m242:Number;
var m113:Number, m213:Number, m123:Number, m223:Number, m133:Number, m233:Number, m143:Number, m243:Number;
var m114:Number, m214:Number, m124:Number, m224:Number, m134:Number, m234:Number, m144:Number, m244:Number;
dest.n11 = (m111=m1.n11) * (m211=m2.n11) + (m112=m1.n12) * (m221=m2.n21) + (m113=m1.n13) * (m231=m2.n31) + (m114=m1.n14) * (m241=m2.n41);
dest.n12 = m111 * (m212=m2.n12) + m112 * (m222=m2.n22) + m113 * (m232=m2.n32) + m114 * (m242=m2.n42);
dest.n13 = m111 * (m213=m2.n13) + m112 * (m223=m2.n23) + m113 * (m233=m2.n33) + m114 * (m243=m2.n43);
dest.n14 = m111 * (m214=m2.n14) + m112 * (m224=m2.n24) + m113 * (m234=m2.n34) + m114 * (m244=m2.n44);
dest.n21 = (m121=m1.n21) * m211 + (m122=m1.n22) * m221 + (m123=m1.n23) * m231 + (m124=m1.n24) * m241;
dest.n22 = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242;
dest.n23 = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243;
dest.n24 = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244;
dest.n31 = (m131=m1.n31) * m211 + (m132=m1.n32) * m221 + (m133=m1.n33) * m231 + (m134=m1.n34) * m241;
dest.n32 = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242;
dest.n33 = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243;
dest.n34 = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244;
dest.n41 = (m141=m1.n41) * m211 + (m142=m1.n42) * m221 + (m143=m1.n43) * m231 + (m144=m1.n44) * m241;
dest.n42 = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242;
dest.n43 = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243;
dest.n44 = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244;
return dest;
}
/**
* Compute an addition {@code Matrix4}.
*
* @param {@code m1} Matrix to add.
* @param {@code m2} Matrix to add.
* @return The result of computation : a {@code Matrix4}.
*/
public static function addMatrix(m1:WMatrix4, m2:WMatrix4): WMatrix4
{
var dest : WMatrix4 = WMatrix4.createIdentity();
dest.n11 = m1.n11 + m2.n11; dest.n12 = m1.n12 + m2.n12;
dest.n13 = m1.n13 + m2.n13; dest.n14 = m1.n14 + m2.n14;
dest.n21 = m1.n21 + m2.n21; dest.n22 = m1.n22 + m2.n22;
dest.n23 = m1.n23 + m2.n23; dest.n24 = m1.n24 + m2.n24;
dest.n31 = m1.n31 + m2.n31; dest.n32 = m1.n32 + m2.n32;
dest.n33 = m1.n33 + m2.n33; dest.n34 = m1.n34 + m2.n34;
dest.n41 = m1.n41 + m2.n41; dest.n42 = m1.n42 + m2.n42;
dest.n43 = m1.n43 + m2.n43; dest.n44 = m1.n44 + m2.n44;
return dest;
}
/**
* Compute a clonage {@code Matrix4}.
*
* @param {@code m1} Matrix to clone.
* @return The result of clonage : a {@code Matrix4}.
*/
public static function clone(m:WMatrix4):WMatrix4
{
return new WMatrix4( m.n11,m.n12,m.n13,m.n14,
m.n21,m.n22,m.n23,m.n24,
m.n31,m.n32,m.n33,m.n34,
m.n41,m.n42,m.n43,m.n44
);
}
/**
* Compute a multiplication of a vertex and the matrix{@code Matrix4}.
*
* @param {@code m} Matrix4.
* @param {@code v} Vertex
* @return void
*/
public static function vectorMult( m:WMatrix4, v:WVector ): void
{
var vx:Number,vy:Number,vz:Number;
v.x = (vx=v.x) * m.n11 + (vy=v.y) * m.n12 + (vz=v.z) * 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;
}
/**
* Compute a multiplication of a vector and the matrix{@code Matrix4}
* as there were of 3 dimensions.
*
* @param {@code m} Matrix4.
* @param {@code v} Vector
* @return void
*/
public static function vectorMult3x3( m:WMatrix4, v:WVector ): void
{
var vx:Number, vy:Number, vz:Number;
v.x = (vx=v.x) * m.n11 + (vy=v.y) * m.n12 + (vz=v.z) * m.n13;
v.y = vx * m.n21 + vy * m.n22 + vz * m.n23;
v.z = vx * m.n31 + vy * m.n32 + vz * m.n33;
}
/**
* Compute the projection of a vector with a projection matrix.
* The result gives a 2 dimension point represented by the x and y properties of the vector (z is null).
* Be carefull: The passed matrix MUST be a PROJECTION matrix.
* @param mp MAtrix4 The projection matrix which will project the point from a 3D space to a 2D space.
* @param v The vector to project. Properties will be modified!
*/
public static function projectVector( mp:WMatrix4, v:WVector ):void
{
// computations for projection
var c:Number = 1 / ( v.x * mp.n41 + v.y * mp.n42 + v.z * mp.n43 + mp.n44 );
WMatrix4Math.vectorMult( mp, v );
// we give coordinate to screen
v.x = v.x * c;
v.y = v.y * c;
v.z = 0;
}
/**
* Compute a Rotation {@code Matrix4} from the Euler angle in degrees unit.
*
* @param {@code ax} angle of rotation around X axis in degree.
* @param {@code ay} angle of rotation around Y axis in degree.
* @param {@code az} angle of rotation around Z axis in degree.
* @return The result of computation : a {@code Matrix4}.
*/
public static function eulerRotation ( ax:Number, ay:Number, az:Number ) : WMatrix4
{
var m:WMatrix4 = WMatrix4.createIdentity();
ax = WNumberUtil.toRadian(ax) ; ay = WNumberUtil.toRadian(ay); az = WNumberUtil.toRadian(az);
var a:Number = WFastMath.cos( ax );//_aCos[int(ax)] ;
var b:Number = WFastMath.sin( ax );//_aSin[int(ax)] ;
var c:Number = WFastMath.cos( ay );//_aCos[int(ay)] ;
var d:Number = WFastMath.sin( ay );//_aSin[int(ay)] ;
var e:Number = WFastMath.cos( az );//_aCos[int(az)] ;
var f:Number = WFastMath.sin( az );//_aSin[int(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 ;
// unused because loaded as an identity matrix allready.
// m.n14 = m.n24 = m.n34 = m.n41= m.n42 = m.n43 = 0;
// m.n44 = 1;
return m;
}
/**
*
* @param angle Number angle of rotation in degrees
* @return the computed matrix
*/
public static function rotationX ( angle:Number ):WMatrix4
{
var m:WMatrix4 = WMatrix4.createIdentity();
var c:Number = _aCos[int(angle)] ;
var s:Number = _aSin[int(angle)] ;
m.n22 = c;
m.n23 = s;
m.n32 = -s;
m.n33 = c;
return m;
}
/**
*
* @param angle Number angle of rotation in degrees
* @return the computed matrix
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -