public static matrix4 operator *(matrix4 first, matrix4 other) { matrix4 mat = new matrix4(true); mat.setByProduct(ref first, ref other); return(mat); }
void setByProduct(ref matrix4 other_a, ref matrix4 other_b) { float[] m1 = other_a.M; float[] m2 = other_b.M; float[] tmp = new float[16]; tmp[0] = m1[0] * m2[0] + m1[1] * m2[4] + m1[2] * m2[8] + m1[3] * m2[12]; tmp[1] = m1[0] * m2[1] + m1[1] * m2[5] + m1[2] * m2[9] + m1[3] * m2[13]; tmp[2] = m1[0] * m2[2] + m1[1] * m2[6] + m1[2] * m2[10] + m1[3] * m2[14]; tmp[3] = m1[0] * m2[3] + m1[1] * m2[7] + m1[2] * m2[11] + m1[3] * m2[15]; tmp[4] = m1[4] * m2[0] + m1[5] * m2[4] + m1[6] * m2[8] + m1[7] * m2[12]; tmp[5] = m1[4] * m2[1] + m1[5] * m2[5] + m1[6] * m2[9] + m1[7] * m2[13]; tmp[6] = m1[4] * m2[2] + m1[5] * m2[6] + m1[6] * m2[10] + m1[7] * m2[14]; tmp[7] = m1[4] * m2[3] + m1[5] * m2[7] + m1[6] * m2[11] + m1[7] * m2[15]; tmp[8] = m1[8] * m2[0] + m1[9] * m2[4] + m1[10] * m2[8] + m1[11] * m2[12]; tmp[9] = m1[8] * m2[1] + m1[9] * m2[5] + m1[10] * m2[9] + m1[11] * m2[13]; tmp[10] = m1[8] * m2[2] + m1[9] * m2[6] + m1[10] * m2[10] + m1[11] * m2[14]; tmp[11] = m1[8] * m2[3] + m1[9] * m2[7] + m1[10] * m2[11] + m1[11] * m2[15]; tmp[12] = m1[12] * m2[0] + m1[13] * m2[4] + m1[14] * m2[8] + m1[15] * m2[12]; tmp[13] = m1[12] * m2[1] + m1[13] * m2[5] + m1[14] * m2[9] + m1[15] * m2[13]; tmp[14] = m1[12] * m2[2] + m1[13] * m2[6] + m1[14] * m2[10] + m1[15] * m2[14]; tmp[15] = m1[12] * m2[3] + m1[13] * m2[7] + m1[14] * m2[11] + m1[15] * m2[15]; for (int i = 0; i < 16; ++i) { M[i] = tmp[i]; } }
vector3df getRotationRadians() { matrix4 mat = this; vector3df scale = getScale(); vector3df invScale = new vector3df(1.0f / scale.X, 1.0f / scale.Y, 1.0f / scale.Z); float Y = -NewMath.FASin(mat[2] * invScale.X); float C = NewMath.FCos(Y); float rotx, roty, X, Z; if (Math.Abs(C) > 0.0005f) { float invC = 1.0f / C; rotx = mat[10] * invC * invScale.Z; roty = mat[6] * invC * invScale.Y; X = NewMath.FATan2(roty, rotx); rotx = mat[0] * invC * invScale.X; roty = mat[1] * invC * invScale.X; Z = NewMath.FATan2(roty, rotx); } else { X = 0; rotx = mat[5] * invScale.Y; roty = -mat[4] * invScale.Y; Z = NewMath.FATan2(roty, rotx); } // fix values that get below zero // before it would set (!) values to 360 // that were above 360: if (X < 0.0) { X += 2 * NewMath.PI; } if (Y < 0.0) { Y += 2 * NewMath.PI; } if (Z < 0.0) { Z += 2 * NewMath.PI; } return(new vector3df(X, Y, Z)); }
void setScale(vector3df scale) { if (isIdentity()) { M[0] = scale.X; M[5] = scale.Y; M[10] = scale.Z; } matrix4 mat = new matrix4(true); mat[0] = scale.X; mat[5] = scale.Y; mat[10] = scale.Z; matrix4 self = this; setByProduct(ref self, ref mat); }
public void GetRelativeTransformation(out matrix4 mat) { SceneNode_getRelativeTransformation(pointer, out mat); }
public void SetRelativeTransformation(ref matrix4 mat) { SceneNode_setRelativeTransformation(pointer, ref mat); }
public static extern void SceneNode_getRelativeTransformation( IntPtr node, out matrix4 mat);