예제 #1
0
        public static matrix4 operator *(matrix4 first, matrix4 other)
        {
            matrix4 mat = new matrix4(true);

            mat.setByProduct(ref first, ref other);
            return(mat);
        }
예제 #2
0
        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];
            }
        }
예제 #3
0
        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));
        }
예제 #4
0
        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);
        }
예제 #5
0
 public void GetRelativeTransformation(out matrix4 mat)
 {
     SceneNode_getRelativeTransformation(pointer, out mat);
 }
예제 #6
0
 public void SetRelativeTransformation(ref matrix4 mat)
 {
     SceneNode_setRelativeTransformation(pointer, ref mat);
 }
예제 #7
0
 public static extern void SceneNode_getRelativeTransformation(
     IntPtr node,
     out matrix4 mat);