public static Matrix4by4 operator *(Matrix4by4 matrix1, Matrix4by4 matrix2)
    {
        //overriden operator for multiplying a matrix by another matrix
        Matrix4by4 matrixReturn = new Matrix4by4(new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0));

        matrixReturn.values[0, 0] = matrix1.values[0, 0] * matrix2.values[0, 0] + matrix1.values[0, 1] * matrix2.values[1, 0] + matrix1.values[0, 2] * matrix2.values[2, 0] + matrix1.values[0, 3] * matrix2.values[3, 0];
        matrixReturn.values[0, 1] = matrix1.values[0, 0] * matrix2.values[0, 1] + matrix1.values[0, 1] * matrix2.values[1, 1] + matrix1.values[0, 2] * matrix2.values[2, 1] + matrix1.values[0, 3] * matrix2.values[3, 1];
        matrixReturn.values[0, 2] = matrix1.values[0, 0] * matrix2.values[0, 2] + matrix1.values[0, 1] * matrix2.values[1, 2] + matrix1.values[0, 2] * matrix2.values[2, 2] + matrix1.values[0, 3] * matrix2.values[3, 2];
        matrixReturn.values[0, 3] = matrix1.values[0, 0] * matrix2.values[0, 3] + matrix1.values[0, 1] * matrix2.values[1, 3] + matrix1.values[0, 2] * matrix2.values[2, 3] + matrix1.values[0, 3] * matrix2.values[3, 3];

        matrixReturn.values[1, 0] = matrix1.values[1, 0] * matrix2.values[0, 0] + matrix1.values[1, 1] * matrix2.values[1, 0] + matrix1.values[1, 2] * matrix2.values[2, 0] + matrix1.values[1, 3] * matrix2.values[3, 0];
        matrixReturn.values[1, 1] = matrix1.values[1, 0] * matrix2.values[0, 1] + matrix1.values[1, 1] * matrix2.values[1, 1] + matrix1.values[1, 2] * matrix2.values[2, 1] + matrix1.values[1, 3] * matrix2.values[3, 1];
        matrixReturn.values[1, 2] = matrix1.values[1, 0] * matrix2.values[0, 2] + matrix1.values[1, 1] * matrix2.values[1, 2] + matrix1.values[1, 2] * matrix2.values[2, 2] + matrix1.values[1, 3] * matrix2.values[3, 2];
        matrixReturn.values[1, 3] = matrix1.values[1, 0] * matrix2.values[0, 3] + matrix1.values[1, 1] * matrix2.values[1, 3] + matrix1.values[1, 2] * matrix2.values[2, 3] + matrix1.values[1, 3] * matrix2.values[3, 3];

        matrixReturn.values[2, 0] = matrix1.values[2, 0] * matrix2.values[0, 0] + matrix1.values[2, 1] * matrix2.values[1, 0] + matrix1.values[2, 2] * matrix2.values[2, 0] + matrix1.values[2, 3] * matrix2.values[3, 0];
        matrixReturn.values[2, 1] = matrix1.values[2, 0] * matrix2.values[0, 1] + matrix1.values[2, 1] * matrix2.values[1, 1] + matrix1.values[2, 2] * matrix2.values[2, 1] + matrix1.values[2, 3] * matrix2.values[3, 1];
        matrixReturn.values[2, 2] = matrix1.values[2, 0] * matrix2.values[0, 2] + matrix1.values[2, 1] * matrix2.values[1, 2] + matrix1.values[2, 2] * matrix2.values[2, 2] + matrix1.values[2, 3] * matrix2.values[3, 2];
        matrixReturn.values[2, 3] = matrix1.values[2, 0] * matrix2.values[0, 3] + matrix1.values[2, 1] * matrix2.values[1, 3] + matrix1.values[2, 2] * matrix2.values[2, 3] + matrix1.values[2, 3] * matrix2.values[3, 3];

        matrixReturn.values[3, 0] = matrix1.values[1, 0] * matrix2.values[0, 0] + matrix1.values[3, 1] * matrix2.values[1, 0] + matrix1.values[3, 2] * matrix2.values[2, 0] + matrix1.values[3, 3] * matrix2.values[3, 0];
        matrixReturn.values[3, 1] = matrix1.values[1, 0] * matrix2.values[0, 1] + matrix1.values[3, 1] * matrix2.values[1, 1] + matrix1.values[3, 2] * matrix2.values[2, 1] + matrix1.values[3, 3] * matrix2.values[3, 1];
        matrixReturn.values[3, 2] = matrix1.values[1, 0] * matrix2.values[0, 2] + matrix1.values[3, 1] * matrix2.values[1, 2] + matrix1.values[3, 2] * matrix2.values[2, 2] + matrix1.values[3, 3] * matrix2.values[3, 2];
        matrixReturn.values[3, 3] = matrix1.values[1, 0] * matrix2.values[0, 3] + matrix1.values[3, 1] * matrix2.values[1, 3] + matrix1.values[3, 2] * matrix2.values[2, 3] + matrix1.values[3, 3] * matrix2.values[3, 3];

        return(matrixReturn);
    }
Example #2
0
    // Update is called once per frame
    void Update()
    {
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        Vector3   ParentForward       = EulerMaths.ForwardDirection(Parent.Transform.RotationEuler) * Distance;

        Matrix4by4 T = new Matrix4by4(new Vector3(1, 0, 0),
                                      new Vector3(0, 1, 0),
                                      new Vector3(0, 0, 1),
                                      new Vector3(ParentForward.x, ParentForward.y, ParentForward.z));
        Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * scale,
                                      new Vector3(0, 1, 0) * scale,
                                      new Vector3(0, 0, 1) * scale, new Vector3(0, 0, 0));

        M2 = Parent.Transform.ReturnFinishedMatrix() * T * S;
        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = M2 * ModelSpaceVertices[i];
        }

        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
        public static Matrix4by4 operator *(Matrix4by4 lhs, Matrix4by4 rhs)
        {
            Matrix4by4 rv = Identity;

            //vector.w = 1.0f; //Forcing the W component to 1 for translation Matrix.
            //As Unity is converting a Vector4 to a Vector3 implicitly, the W component is set to 0 by default.
            //With a translation component, the W component must be 1.

            rv.values[0, 0] = lhs.values[0, 0] * rhs.values[0, 0] + lhs.values[0, 1] * rhs.values[1, 0] + lhs.values[0, 2] * rhs.values[2, 0] + lhs.values[0, 3] * rhs.values[3, 0];
            rv.values[1, 0] = lhs.values[1, 0] * rhs.values[0, 0] + lhs.values[1, 1] * rhs.values[1, 0] + lhs.values[1, 2] * rhs.values[2, 0] + lhs.values[1, 3] * rhs.values[3, 0];
            rv.values[2, 0] = lhs.values[2, 0] * rhs.values[0, 0] + lhs.values[2, 1] * rhs.values[1, 0] + lhs.values[2, 2] * rhs.values[2, 0] + lhs.values[2, 3] * rhs.values[3, 0];
            rv.values[3, 0] = lhs.values[3, 0] * rhs.values[0, 0] + lhs.values[3, 1] * rhs.values[1, 0] + lhs.values[3, 2] * rhs.values[2, 0] + lhs.values[3, 3] * rhs.values[3, 0];

            rv.values[0, 1] = lhs.values[0, 0] * rhs.values[0, 1] + lhs.values[0, 1] * rhs.values[1, 1] + lhs.values[0, 2] * rhs.values[2, 1] + lhs.values[0, 3] * rhs.values[3, 1];
            rv.values[1, 1] = lhs.values[1, 0] * rhs.values[0, 1] + lhs.values[1, 1] * rhs.values[1, 1] + lhs.values[1, 2] * rhs.values[2, 1] + lhs.values[1, 3] * rhs.values[3, 1];
            rv.values[2, 1] = lhs.values[2, 0] * rhs.values[0, 1] + lhs.values[2, 1] * rhs.values[1, 1] + lhs.values[2, 2] * rhs.values[2, 1] + lhs.values[2, 3] * rhs.values[3, 1];
            rv.values[3, 1] = lhs.values[3, 0] * rhs.values[0, 1] + lhs.values[3, 1] * rhs.values[1, 1] + lhs.values[3, 2] * rhs.values[2, 1] + lhs.values[3, 3] * rhs.values[3, 1];

            rv.values[0, 2] = lhs.values[0, 0] * rhs.values[0, 2] + lhs.values[0, 1] * rhs.values[1, 2] + lhs.values[0, 2] * rhs.values[2, 2] + lhs.values[0, 3] * rhs.values[3, 2];
            rv.values[1, 2] = lhs.values[1, 0] * rhs.values[0, 2] + lhs.values[1, 1] * rhs.values[1, 2] + lhs.values[1, 2] * rhs.values[2, 2] + lhs.values[1, 3] * rhs.values[3, 2];
            rv.values[2, 2] = lhs.values[2, 0] * rhs.values[0, 2] + lhs.values[2, 1] * rhs.values[1, 2] + lhs.values[2, 2] * rhs.values[2, 2] + lhs.values[2, 3] * rhs.values[3, 2];
            rv.values[3, 2] = lhs.values[3, 0] * rhs.values[0, 2] + lhs.values[3, 1] * rhs.values[1, 2] + lhs.values[3, 2] * rhs.values[2, 2] + lhs.values[3, 3] * rhs.values[3, 2];

            rv.values[0, 3] = lhs.values[0, 0] * rhs.values[0, 3] + lhs.values[0, 1] * rhs.values[1, 3] + lhs.values[0, 2] * rhs.values[2, 3] + lhs.values[0, 3] * rhs.values[3, 3];
            rv.values[1, 3] = lhs.values[1, 0] * rhs.values[0, 3] + lhs.values[1, 1] * rhs.values[1, 3] + lhs.values[1, 2] * rhs.values[2, 3] + lhs.values[1, 3] * rhs.values[3, 3];
            rv.values[2, 3] = lhs.values[2, 0] * rhs.values[0, 3] + lhs.values[2, 1] * rhs.values[1, 3] + lhs.values[2, 2] * rhs.values[2, 3] + lhs.values[2, 3] * rhs.values[3, 3];
            rv.values[3, 3] = lhs.values[3, 0] * rhs.values[0, 3] + lhs.values[3, 1] * rhs.values[1, 3] + lhs.values[3, 2] * rhs.values[2, 3] + lhs.values[3, 3] * rhs.values[3, 3];

            return(rv);
        }
Example #4
0
    public static Matrix4by4 operator *(Matrix4by4 vector1, Matrix4by4 vector2)
    {
        Matrix4by4 vecResult = new Matrix4by4();

        vecResult.values[0, 0] = vector1.values[0, 0] * vector2.values[0, 0] + vector1.values[0, 1] * vector2.values[1, 0] + vector1.values[0, 2] * vector2.values[2, 0] + vector1.values[0, 3] * vector2.values[3, 0];
        vecResult.values[0, 1] = vector1.values[0, 0] * vector2.values[0, 1] + vector1.values[0, 1] * vector2.values[1, 1] + vector1.values[0, 2] * vector2.values[2, 1] + vector1.values[0, 3] * vector2.values[3, 1];
        vecResult.values[0, 2] = vector1.values[0, 0] * vector2.values[0, 2] + vector1.values[0, 1] * vector2.values[1, 2] + vector1.values[0, 2] * vector2.values[2, 2] + vector1.values[0, 3] * vector2.values[3, 2];
        vecResult.values[0, 3] = vector1.values[0, 0] * vector2.values[0, 3] + vector1.values[0, 1] * vector2.values[1, 3] + vector1.values[0, 2] * vector2.values[2, 3] + vector1.values[0, 3] * vector2.values[3, 3];

        vecResult.values[1, 0] = vector1.values[1, 0] * vector2.values[0, 0] + vector1.values[1, 1] * vector2.values[1, 0] + vector1.values[1, 2] * vector2.values[2, 0] + vector1.values[1, 3] * vector2.values[3, 0];
        vecResult.values[1, 1] = vector1.values[1, 0] * vector2.values[0, 1] + vector1.values[1, 1] * vector2.values[1, 1] + vector1.values[1, 2] * vector2.values[2, 1] + vector1.values[1, 3] * vector2.values[3, 1];
        vecResult.values[1, 2] = vector1.values[1, 0] * vector2.values[0, 2] + vector1.values[1, 1] * vector2.values[1, 2] + vector1.values[1, 2] * vector2.values[2, 2] + vector1.values[1, 3] * vector2.values[3, 2];
        vecResult.values[1, 3] = vector1.values[1, 0] * vector2.values[0, 3] + vector1.values[1, 1] * vector2.values[1, 3] + vector1.values[1, 2] * vector2.values[2, 3] + vector1.values[1, 3] * vector2.values[3, 3];

        vecResult.values[2, 0] = vector1.values[2, 0] * vector2.values[0, 0] + vector1.values[2, 1] * vector2.values[1, 0] + vector1.values[2, 2] * vector2.values[2, 0] + vector1.values[2, 3] * vector2.values[3, 0];
        vecResult.values[2, 1] = vector1.values[2, 0] * vector2.values[0, 1] + vector1.values[2, 1] * vector2.values[1, 1] + vector1.values[2, 2] * vector2.values[2, 1] + vector1.values[2, 3] * vector2.values[3, 1];
        vecResult.values[2, 2] = vector1.values[2, 0] * vector2.values[0, 2] + vector1.values[2, 1] * vector2.values[1, 2] + vector1.values[2, 2] * vector2.values[2, 2] + vector1.values[2, 3] * vector2.values[3, 2];
        vecResult.values[2, 3] = vector1.values[2, 0] * vector2.values[0, 3] + vector1.values[2, 1] * vector2.values[1, 3] + vector1.values[2, 2] * vector2.values[2, 3] + vector1.values[2, 3] * vector2.values[3, 3];

        vecResult.values[3, 0] = vector1.values[3, 0] * vector2.values[0, 0] + vector1.values[3, 1] * vector2.values[1, 0] + vector1.values[3, 2] * vector2.values[2, 0] + vector1.values[3, 3] * vector2.values[3, 0];
        vecResult.values[3, 1] = vector1.values[3, 0] * vector2.values[0, 1] + vector1.values[3, 1] * vector2.values[1, 1] + vector1.values[3, 2] * vector2.values[2, 1] + vector1.values[3, 3] * vector2.values[3, 1];
        vecResult.values[3, 2] = vector1.values[3, 0] * vector2.values[0, 2] + vector1.values[3, 1] * vector2.values[1, 2] + vector1.values[3, 2] * vector2.values[2, 2] + vector1.values[3, 3] * vector2.values[3, 2];
        vecResult.values[3, 3] = vector1.values[3, 0] * vector2.values[0, 3] + vector1.values[3, 1] * vector2.values[1, 3] + vector1.values[3, 2] * vector2.values[2, 3] + vector1.values[3, 3] * vector2.values[3, 3];

        return(vecResult);
    }
Example #5
0
    public static Matrix4by4 operator *(Matrix4by4 matrix1,Matrix4by4 matrix2)
    {
        Matrix4by4 matrixReturn = new Matrix4by4(new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0));
        matrixReturn.values[0, 0] = matrix1.values[0, 0] * matrix2.values[0, 0] + matrix1.values[0, 1] * matrix2.values[1, 0] + matrix1.values[0, 2] * matrix2.values[2, 0] + matrix1.values[0, 3] * matrix2.values[3, 0];
        matrixReturn.values[0, 1] = matrix1.values[0, 0] * matrix2.values[0, 1] + matrix1.values[0, 1] * matrix2.values[1, 1] + matrix1.values[0, 2] * matrix2.values[2, 1] + matrix1.values[0, 3] * matrix2.values[3, 1];
        matrixReturn.values[0, 2] = matrix1.values[0, 0] * matrix2.values[0, 2] + matrix1.values[0, 1] * matrix2.values[1, 2] + matrix1.values[0, 2] * matrix2.values[2, 2] + matrix1.values[0, 3] * matrix2.values[3, 2];
        matrixReturn.values[0, 3] = matrix1.values[0, 0] * matrix2.values[0, 3] + matrix1.values[0, 1] * matrix2.values[1, 3] + matrix1.values[0, 2] * matrix2.values[2, 3] + matrix1.values[0, 3] * matrix2.values[3, 3];

        matrixReturn.values[1, 0] = matrix1.values[1, 0] * matrix2.values[0, 0] + matrix1.values[1, 1] * matrix2.values[1, 0] + matrix1.values[1, 2] * matrix2.values[2, 0] + matrix1.values[1, 3] * matrix2.values[3, 0];
        matrixReturn.values[1, 1] = matrix1.values[1, 0] * matrix2.values[0, 1] + matrix1.values[1, 1] * matrix2.values[1, 1] + matrix1.values[1, 2] * matrix2.values[2, 1] + matrix1.values[1, 3] * matrix2.values[3, 1];
        matrixReturn.values[1, 2] = matrix1.values[1, 0] * matrix2.values[0, 2] + matrix1.values[1, 1] * matrix2.values[1, 2] + matrix1.values[1, 2] * matrix2.values[2, 2] + matrix1.values[1, 3] * matrix2.values[3, 2];
        matrixReturn.values[1, 3] = matrix1.values[1, 0] * matrix2.values[0, 3] + matrix1.values[1, 1] * matrix2.values[1, 3] + matrix1.values[1, 2] * matrix2.values[2, 3] + matrix1.values[1, 3] * matrix2.values[3, 3];

        matrixReturn.values[2, 0] = matrix1.values[2, 0] * matrix2.values[0, 0] + matrix1.values[2, 1] * matrix2.values[1, 0] + matrix1.values[2, 2] * matrix2.values[2, 0] + matrix1.values[2, 3] * matrix2.values[3, 0];
        matrixReturn.values[2, 1] = matrix1.values[2, 0] * matrix2.values[0, 1] + matrix1.values[2, 1] * matrix2.values[1, 1] + matrix1.values[2, 2] * matrix2.values[2, 1] + matrix1.values[2, 3] * matrix2.values[3, 1];
        matrixReturn.values[2, 2] = matrix1.values[2, 0] * matrix2.values[0, 2] + matrix1.values[2, 1] * matrix2.values[1, 2] + matrix1.values[2, 2] * matrix2.values[2, 2] + matrix1.values[2, 3] * matrix2.values[3, 2];
        matrixReturn.values[2, 3] = matrix1.values[2, 0] * matrix2.values[0, 3] + matrix1.values[2, 1] * matrix2.values[1, 3] + matrix1.values[2, 2] * matrix2.values[2, 3] + matrix1.values[2, 3] * matrix2.values[3, 3];

        matrixReturn.values[3, 0] = matrix1.values[1, 0] * matrix2.values[0, 0] + matrix1.values[3, 1] * matrix2.values[1, 0] + matrix1.values[3, 2] * matrix2.values[2, 0] + matrix1.values[3, 3] * matrix2.values[3, 0];
        matrixReturn.values[3, 1] = matrix1.values[1, 0] * matrix2.values[0, 1] + matrix1.values[3, 1] * matrix2.values[1, 1] + matrix1.values[3, 2] * matrix2.values[2, 1] + matrix1.values[3, 3] * matrix2.values[3, 1];
        matrixReturn.values[3, 2] = matrix1.values[1, 0] * matrix2.values[0, 2] + matrix1.values[3, 1] * matrix2.values[1, 2] + matrix1.values[3, 2] * matrix2.values[2, 2] + matrix1.values[3, 3] * matrix2.values[3, 2];
        matrixReturn.values[3, 3] = matrix1.values[1, 0] * matrix2.values[0, 3] + matrix1.values[3, 1] * matrix2.values[1, 3] + matrix1.values[3, 2] * matrix2.values[2, 3] + matrix1.values[3, 3] * matrix2.values[3, 3];

        return matrixReturn;
    }
        public Matrix4by4 GetRow(Vector4 row0, Vector4 row1, Vector4 row2, Vector4 row3)
        {
            Matrix4by4 rv = Identity;

            row0.x = rv.values[0, 0];
            row0.y = rv.values[1, 0];
            row0.z = rv.values[2, 0];
            row0.w = rv.values[3, 0];

            row1.x = rv.values[0, 1];
            row1.y = rv.values[1, 1];
            row1.z = rv.values[2, 1];
            row1.w = rv.values[3, 1];

            row2.x = rv.values[0, 2];
            row2.y = rv.values[1, 2];
            row2.z = rv.values[2, 2];
            row2.w = rv.values[3, 2];

            row3.x = rv.values[0, 3];
            row3.y = rv.values[1, 3];
            row3.z = rv.values[2, 3];
            row3.w = rv.values[3, 3];
            return(rv);
        }
Example #7
0
        public static Matrix4by4 operator *(Matrix4by4 lhs, Matrix4by4 rhs)
        {
            Matrix4by4 tempMatrix = new Matrix4by4(new Vector4(1, 0, 0, 0), new Vector4(0, 1, 0, 0), new Vector4(0, 0, 1, 0), new Vector4(0, 0, 0, 1));

            tempMatrix.values[0, 0] = ((rhs.values[0, 0] * lhs.values[0, 0]) + (rhs.values[1, 0] * lhs.values[0, 1]) + (rhs.values[2, 0] * lhs.values[0, 2]) + (rhs.values[3, 0] * lhs.values[0, 3]));
            tempMatrix.values[0, 1] = ((rhs.values[0, 1] * lhs.values[0, 0]) + (rhs.values[1, 1] * lhs.values[0, 1]) + (rhs.values[2, 1] * lhs.values[0, 2]) + (rhs.values[3, 1] * lhs.values[0, 3]));
            tempMatrix.values[0, 2] = ((rhs.values[0, 2] * lhs.values[0, 0]) + (rhs.values[1, 2] * lhs.values[0, 1]) + (rhs.values[2, 2] * lhs.values[0, 2]) + (rhs.values[3, 2] * lhs.values[0, 3]));
            tempMatrix.values[0, 3] = ((rhs.values[0, 3] * lhs.values[0, 0]) + (rhs.values[1, 3] * lhs.values[0, 1]) + (rhs.values[2, 3] * lhs.values[0, 2]) + (rhs.values[3, 3] * lhs.values[0, 3]));

            tempMatrix.values[1, 0] = ((rhs.values[0, 0] * lhs.values[1, 0]) + (rhs.values[1, 0] * lhs.values[1, 1]) + (rhs.values[2, 0] * lhs.values[1, 2]) + (rhs.values[3, 0] * lhs.values[1, 3]));
            tempMatrix.values[1, 1] = ((rhs.values[0, 1] * lhs.values[1, 0]) + (rhs.values[1, 1] * lhs.values[1, 1]) + (rhs.values[2, 1] * lhs.values[1, 2]) + (rhs.values[3, 1] * lhs.values[1, 3]));
            tempMatrix.values[1, 2] = ((rhs.values[0, 2] * lhs.values[1, 0]) + (rhs.values[1, 2] * lhs.values[1, 1]) + (rhs.values[2, 2] * lhs.values[1, 2]) + (rhs.values[3, 2] * lhs.values[1, 3]));
            tempMatrix.values[1, 3] = ((rhs.values[0, 3] * lhs.values[1, 0]) + (rhs.values[1, 3] * lhs.values[1, 1]) + (rhs.values[2, 3] * lhs.values[1, 2]) + (rhs.values[3, 3] * lhs.values[1, 3]));

            tempMatrix.values[2, 0] = ((rhs.values[0, 0] * lhs.values[2, 0]) + (rhs.values[1, 0] * lhs.values[2, 1]) + (rhs.values[2, 0] * lhs.values[2, 2]) + (rhs.values[3, 0] * lhs.values[2, 3]));
            tempMatrix.values[2, 1] = ((rhs.values[0, 1] * lhs.values[2, 0]) + (rhs.values[1, 1] * lhs.values[2, 1]) + (rhs.values[2, 1] * lhs.values[2, 2]) + (rhs.values[3, 1] * lhs.values[2, 3]));
            tempMatrix.values[2, 2] = ((rhs.values[0, 2] * lhs.values[2, 0]) + (rhs.values[1, 2] * lhs.values[2, 1]) + (rhs.values[2, 2] * lhs.values[2, 2]) + (rhs.values[3, 2] * lhs.values[2, 3]));
            tempMatrix.values[2, 3] = ((rhs.values[0, 3] * lhs.values[2, 0]) + (rhs.values[1, 3] * lhs.values[2, 1]) + (rhs.values[2, 3] * lhs.values[2, 2]) + (rhs.values[3, 3] * lhs.values[2, 3]));

            tempMatrix.values[3, 0] = ((rhs.values[0, 0] * lhs.values[3, 0]) + (rhs.values[1, 0] * lhs.values[3, 1]) + (rhs.values[2, 0] * lhs.values[3, 2]) + (rhs.values[3, 0] * lhs.values[3, 3]));
            tempMatrix.values[3, 1] = ((rhs.values[0, 1] * lhs.values[3, 0]) + (rhs.values[1, 1] * lhs.values[3, 1]) + (rhs.values[2, 1] * lhs.values[3, 2]) + (rhs.values[3, 1] * lhs.values[3, 3]));
            tempMatrix.values[3, 2] = ((rhs.values[0, 2] * lhs.values[3, 0]) + (rhs.values[1, 2] * lhs.values[3, 1]) + (rhs.values[2, 2] * lhs.values[3, 2]) + (rhs.values[3, 2] * lhs.values[3, 3]));
            tempMatrix.values[3, 3] = ((rhs.values[0, 3] * lhs.values[3, 0]) + (rhs.values[1, 3] * lhs.values[3, 1]) + (rhs.values[2, 3] * lhs.values[3, 2]) + (rhs.values[3, 3] * lhs.values[3, 3]));
            return(tempMatrix);
        }
Example #8
0
 public Matrix4by4 ScaleInverse()
 {
     Matrix4by4 rv = Identity;
     rv.values[0, 0] = 1.0f / values[0, 0]; //Invert the scale in 1/A
     rv.values[1, 1] = 1.0f / values[1, 1]; //1/B
     rv.values[2, 2] = 1.0f/  values[2, 2]; //1/C
     return rv;
 }
Example #9
0
 public Matrix4by4 InverseTrans(Matrix4by4 m)
  {
      Matrix4by4 mn = Matrix4by4.Identity; 
      mn.values = m.values;
      mn.values[0, 3] = -m.values[0, 3];
      mn.values[1, 3] = -m.values[1, 3];
      mn.values[2, 3] = -m.values[2, 3];
      return mn;
  }
Example #10
0
    //function to return a scale matrix;
    Matrix4by4 scale(float sca)
    {
        Matrix4by4 sMat = Identity();

        sMat.values[0, 0] *= sca;
        sMat.values[1, 1] *= sca;
        sMat.values[2, 2] *= sca;
        return(sMat);
    }
Example #11
0
    // Use this for initialization
    void Start()
    {
        MeshFilter MF = GetComponent <MeshFilter>();

        ModelSpaceVertices = MF.mesh.vertices;
        Matrix4by4 M2 = new Matrix4by4(new Vector3(1, 0, 0),
                                       new Vector3(0, 1, 0),
                                       new Vector3(0, 0, 1), new Vector3(0, 0, 0));
    }
Example #12
0
    //function to return a translation matrix;
    Matrix4by4 translate(Vector3 trans)
    {
        Matrix4by4 tMat = Identity();

        tMat.values[0, 3] = trans.x;
        tMat.values[1, 3] = trans.y;
        tMat.values[2, 3] = trans.z;
        return(tMat);
    }
        public Matrix4by4 TranslationInverse()
        {
            Matrix4by4 rv = Identity;

            rv.values[0, 3] = -values[0, 3];
            rv.values[1, 3] = -values[1, 3];
            rv.values[2, 3] = -values[2, 3];

            return(rv);
        }
Example #14
0
    //function to return a pitch rotation matrix;
    Matrix4by4 pitchRot(float ang)
    {
        Matrix4by4 mat =
            new Matrix4by4(new Vector3(1, 0, 0),
                           new Vector3(0, Mathf.Cos(y), Mathf.Sin(y)),
                           new Vector3(0, -Mathf.Sin(y), Mathf.Cos(y)),
                           Vector3.zero);

        return(mat);
    }
        public Matrix4by4 ScaleInverse()
        {
            Matrix4by4 rv = Identity;

            rv.values[0, 0] = 1.0f / values[0, 0];
            rv.values[1, 1] = 1.0f / values[1, 1];
            rv.values[2, 2] = 1.0f / values[2, 2];

            return(rv);
        }
Example #16
0
    //function to return a yaw rotation matrix;
    Matrix4by4 yawRot(float ang)
    {
        Matrix4by4 mat =
            new Matrix4by4(new Vector3(Mathf.Cos(g), 0, -Mathf.Sin(g)),
                           new Vector3(0, 1, 0),
                           new Vector3(Mathf.Sin(g), 0, Mathf.Cos(g)),
                           Vector3.zero);

        return(mat);
    }
    public Matrix4by4 InverseTrans(Matrix4by4 m)
    {
        Matrix4by4 rv = Matrix4by4.Identity; //=// new Matrix4by4(Vector4.zero, Vector4.zero, Vector4.zero, Vector4.zero);

        rv.values       = m.values;
        rv.values[0, 3] = -m.values[0, 3];
        rv.values[1, 3] = -m.values[1, 3];
        rv.values[2, 3] = -m.values[2, 3];
        return(rv);
    }
Example #18
0
    // Use this for initialization
    void Start()
    {
        MeshFilter MF = GetComponent <MeshFilter>();

        ModelSpaceVertices = MF.mesh.vertices;                                                                          //Collect the model vertices

        yaw   = new Matrix4by4(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, 0)); //Setup Identity Matrices
        roll  = new Matrix4by4(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, 0));
        pitch = new Matrix4by4(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, 0));

        M = new Matrix4by4(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1), new Vector3(0, 0, 0));
    }
Example #19
0
    //function for applying the transformations to the object model
    public void transformModel()
    {
        applyMouseInputs();
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        //set quaternions to rotate by
        Quat q1 = new Quat(pitchAng - lastpitchAng, new Vector3(1, 0, 0));
        Quat q2 = new Quat(yawAng - lastyawAng, new Vector3(0, 1, 0));
        Quat q3 = new Quat(rollAng - lastrollAng, new Vector3(0, 0, 1));

        //rotate orientation quaternion by pitch yaw and roll quaternion representations;
        q = ((q * q2) * q1) * q3;
        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            //rotate each vertex by the orientation from model space;
            Quat    K        = new Quat(ModelSpaceVertices[i]);
            Quat    newK     = q * K * q.Inverse();
            Vector3 newP     = newK.GetAxis();
            Vector3 quatVert = newP;

            //scale each vertex by the scale multiplier;
            Matrix4by4 sMatrix = scale(scaleMul);
            Vector3    scaVert = sMatrix * quatVert;

            //translate the object so it will be a set distance ahead of the player;
            Matrix4by4 tMat     = translate(new Vector3(0, 0, distanceAhead));
            Vector4    ratVert  = new Vector4(scaVert.x, scaVert.y, scaVert.z, 1);
            Vector4    scatVert = tMat * ratVert;

            //rotate the object around the origin(camera), so it is always in front of the camera;
            Matrix4by4 yawMatrix   = yawRot(g);
            Matrix4by4 pitchMatrix = pitchRot(y);
            Matrix4by4 pyMatrix    = yawMatrix * pitchMatrix;
            Vector3    scarotVert  = pyMatrix * scatVert;

            //translate the object so it is correctly positioned in the world;
            Matrix4by4 tMatrix   = translate(new Vector3(pos.x, 0, pos.z));
            Vector4    tVert     = new Vector4(scarotVert.x, scarotVert.y, scarotVert.z, 1);
            Vector4    finalVert = tMatrix * tVert;
            TransformedVertices[i] = finalVert;
        }
        //set mesh to the transformed vertices
        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateBounds();
        MF.mesh.RecalculateNormals();

        //sets angles so it doesn't accumulate and increase speed over time;
        lastpitchAng = pitchAng;
        lastyawAng   = yawAng;
        lastrollAng  = rollAng;
    }
Example #20
0
 void Start()
 {
     camMat           = Identity();
     q                = new Quat(1, new Vector3(0, 0, 0));
     Cursor.visible   = false;
     Cursor.lockState = CursorLockMode.Locked;
     if (!isFake)
     {
         MeshFilter MF = GetComponent <MeshFilter>();
         ModelSpaceVertices = MF.mesh.vertices;
     }
     placed = false;
 }
Example #21
0
    void Update()
    {
        MF = GetComponent <MeshFilter>();
        ModelSpaceVertices = MF.mesh.vertices;

        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];



        Matrix4by4 rollMatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(angle.z), Mathf.Sin(angle.z), 0),
            new Vector3(-Mathf.Sin(angle.z), Mathf.Cos(angle.z), 0),
            new Vector3(0, 0, 1),
            Vector3.zero);

        Matrix4by4 pitchMatrix = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(angle.x), Mathf.Sin(angle.x)),
            new Vector3(0, -Mathf.Sin(angle.x), Mathf.Cos(angle.x)),
            Vector3.zero);

        Matrix4by4 yawMatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(angle.y), 0, -Mathf.Sin(angle.y)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(angle.y), 0, Mathf.Cos(angle.y)),
            Vector3.zero);

        Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * scale.x, new Vector3(0, 1, 0) * scale.y, new Vector3(0, 0, 1) * scale.z, Vector3.zero);

        Matrix4by4 R = yawMatrix * (pitchMatrix * rollMatrix);

        Matrix4by4 T = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, 1, 0),
            new Vector3(0, 0, 1),
            new Vector3(position.x, position.y, position.y));

        Matrix4by4 M = T * (R * S);

        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = M * ModelSpaceVertices[i];
        }


        MF = GetComponent <MeshFilter>();
        MF.mesh.vertices = TransformedVertices;

        MF.mesh.RecalculateNormals();
    }
Example #22
0
    //function to rotate the camera based on user input;
    public void setCam()
    {
        if (!Input.GetMouseButton(0) && !Input.GetMouseButton(1))
        {
            g += Input.GetAxis("Mouse X") / 100 * lookSpeed;
            if (g > Mathf.PI * 2)
            {
                g = 0 + (g - Mathf.PI * 2);
            }
            if (g < 0)
            {
                g = (2 * Mathf.PI) - g;
            }

            float t = y;
            y -= Input.GetAxis("Mouse Y") / 100 * lookSpeed;
            if (y > Mathf.PI * 2)
            {
                y = 0 + (y - Mathf.PI * 2);
            }
            if (y < 0)
            {
                y = (2 * Mathf.PI) - y;
            }
            if (y >= 1.3f && y <= 5.5f)
            {
                y = t;
            }

            Quat yawQ   = new Quat(g, new Vector3(0, 1, 0));
            Quat pitchQ = new Quat(y, new Vector3(1, 0, 0));
            Quat pyQ    = yawQ * pitchQ;
            camMat = Identity();
            //converts quaternion to matrix to get new basis vectors for forward and right directions(for movement)
            Matrix4by4 mat1 = new Matrix4by4(new Vector4(pyQ.w, -pyQ.z, pyQ.y, -pyQ.x),
                                             new Vector4(pyQ.z, pyQ.w, -pyQ.x, -pyQ.y),
                                             new Vector4(-pyQ.y, pyQ.x, pyQ.w, pyQ.z),
                                             new Vector4(-pyQ.x, -pyQ.y, -pyQ.z, pyQ.w));

            Matrix4by4 mat2 = new Matrix4by4(new Vector4(pyQ.w, -pyQ.z, pyQ.y, pyQ.x),
                                             new Vector4(pyQ.z, pyQ.w, -pyQ.x, pyQ.y),
                                             new Vector4(-pyQ.y, pyQ.x, pyQ.w, -pyQ.z),
                                             new Vector4(pyQ.x, pyQ.y, pyQ.z, pyQ.w));
            camMat = (camMat * mat1) * mat2;
            cam.transform.rotation = new Quaternion(pyQ.x, pyQ.y, pyQ.z, pyQ.w);
        }
    }
Example #23
0
    void Start()
    {
        //stores information about current mesh
        MeshFilter MF = GetComponent <MeshFilter>();

        //gets a copy of all vertices
        ModelSpaceVertices = MF.mesh.vertices;
        Vector3[]  TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * Scale, new Vector3(0, 1, 0) * Scale, new Vector3(0, 0, 1) * Scale, Vector3.zero);

        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = S * ModelSpaceVertices[i];
        }

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
Example #24
0
    // Update is called once per frame
    void Update()
    {
        if (DoNotTransform == false)                                                            //The Sun requires this for its functions, but actually rotates with quaternions, this is a simple check
        {
            Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];             //Get Model Vertices
            roll = new Matrix4by4
                       (new Vector3(Mathf.Cos(RotationEuler.x), Mathf.Sin(RotationEuler.x), 0), //Plug in the rotation values set in the editor
                       new Vector3(-Mathf.Sin(RotationEuler.x), Mathf.Cos(RotationEuler.x), 0),
                       new Vector3(0, 0, 1),
                       Vector3.zero);
            pitch = new Matrix4by4(
                new Vector3(1, 0, 0),
                new Vector3(0, Mathf.Cos(RotationEuler.z), Mathf.Sin(RotationEuler.z)),
                new Vector3(0, -Mathf.Sin(RotationEuler.z), Mathf.Cos(RotationEuler.z)),
                Vector3.zero);
            yaw = new Matrix4by4(
                new Vector3(Mathf.Cos(RotationEuler.y), 0, -Mathf.Sin(RotationEuler.y)),
                new Vector3(0, 1, 0),
                new Vector3(Mathf.Sin(RotationEuler.y), 0, Mathf.Cos(RotationEuler.y)),
                Vector3.zero);



            Matrix4by4 R = yaw * (pitch * roll);                                                                                                         //Create one rotation matrix
            Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * Scale.x, new Vector3(0, 1, 0) * Scale.y, new Vector3(0, 0, 1) * Scale.z, Vector3.zero); //Create a scale matrix with the editor scale

            Matrix4by4 T = new Matrix4by4(new Vector3(1, 0, 0), new Vector3(0, 1, 0),                                                                    //Create a translation Matrix with the custom translation values
                                          new Vector3(0, 0, 1),
                                          new Vector3(Position.x, Position.y, Position.z));
            M = T * R * S; //Multiply the matrixes in TRS order (No brackets are needed as it multiplys with TRS correctly like this)


            for (int i = 0; i < TransformedVertices.Length; i++) //Run through the list and multiply vertices by M
            {
                TransformedVertices[i] = M * ModelSpaceVertices[i];
            }
            MeshFilter MF = GetComponent <MeshFilter>();
            MF.mesh.vertices = TransformedVertices; //Send these vertices for rendering in Unity
            MF.mesh.RecalculateNormals();
            MF.mesh.RecalculateBounds();
        }
    }
Example #25
0
    //function for applying transformation to the demo object, rotating around to always face the player to make it easier to work out the correct orientation. functions the same as transformModel();
    public void transformDemo()
    {
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        Quat      q1 = new Quat(pitchAng - lastpitchAng, new Vector3(1, 0, 0));
        Quat      q2 = new Quat(yawAng - lastyawAng, new Vector3(0, 1, 0));
        Quat      q3 = new Quat(rollAng - lastrollAng, new Vector3(0, 0, 1));

        q = ((q * q2) * q1) * q3;
        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            Quat    K    = new Quat(ModelSpaceVertices[i]);
            Quat    newK = q * K * q.Inverse();
            Vector3 newP = newK.GetAxis();

            Vector3 quatVert = newP;

            Matrix4by4 sMatrix = scale(scaleMul);
            Vector3    scaVert = sMatrix * quatVert;

            Matrix4by4 yawMatrix = new Matrix4by4(new Vector3(Mathf.Cos(g), 0, -Mathf.Sin(g)),
                                                  new Vector3(0, 1, 0),
                                                  new Vector3(Mathf.Sin(g), 0, Mathf.Cos(g)),
                                                  Vector3.zero);
            Vector3 scarotVert = yawMatrix * scaVert;

            Matrix4by4 tMatrix   = translate(new Vector3(pos.x, 0, pos.z));
            Vector4    tVert     = new Vector4(scarotVert.x, scarotVert.y, scarotVert.z, 1);
            Vector4    finalVert = tMatrix * tVert;
            TransformedVertices[i] = finalVert;
        }
        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateBounds();
        MF.mesh.RecalculateNormals();

        lastpitchAng = pitchAng;
        lastyawAng   = yawAng;
        lastrollAng  = rollAng;
    }
Example #26
0
    void OrbitPlanet()
    {
        ye += Time.deltaTime * 3;
        Vector3[] orbitVertices = new Vector3[ModelSpaceVertices.Length];
        //create translation matrix
        Matrix4by4 translationMatrix = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, 1, 0),
            new Vector3(0, 0, 1),
            new Vector3(ye * 2, 0, ye));

        //transform each individual vertex
        for (int i = 0; i < orbitVertices.Length; i++)
        {
            orbitVertices[i] = translationMatrix * ModelSpaceVertices[i];
        }
        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = orbitVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
    //Code for Axis Rotation
    void rotate()
    {
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        yawAngle += Time.deltaTime * speed;

        Matrix4by4 rollMatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(0.0f), Mathf.Sin(0.0f), 0),
            new Vector3(-Mathf.Sin(0.0f), Mathf.Cos(0.0f), 0),
            new Vector3(0, 0, 1),
            Vector3.zero);

        Matrix4by4 pitchMatrix = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(yawAngle), Mathf.Sin(yawAngle)),
            new Vector3(0, -Mathf.Sin(yawAngle), Mathf.Cos(yawAngle)),
            Vector3.zero);

        Matrix4by4 yawMatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(0.0f), 0, -Mathf.Sin(0.0f)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(0.0f), 0, Mathf.Cos(0.0f)),
            Vector3.zero);

        Matrix4by4 R = yawMatrix * (pitchMatrix * rollMatrix);

        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = R * ModelSpaceVertices[i];
        }

        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
Example #28
0
    // Update is called once per frame
    void Update()
    {
        OrbitRotationY += Time.deltaTime * speed;
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        yawangle += Time.deltaTime;
        Matrix4by4 rollMatrix = new Matrix4by4
                                    (new Vector3(Mathf.Cos(yawangle), Mathf.Sin(yawangle), 0),
                                    new Vector3(-Mathf.Sin(yawangle), Mathf.Cos(yawangle), 0),
                                    new Vector3(0, 0, 1),
                                    Vector3.zero);
        Matrix4by4 pitchmatrix = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(yawangle), Mathf.Sin(yawangle)),
            new Vector3(0, -Mathf.Sin(yawangle), Mathf.Cos(yawangle)),
            Vector3.zero);
        Matrix4by4 yawmatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(yawangle), 0, -Mathf.Sin(yawangle)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(yawangle), 0, Mathf.Cos(yawangle)),
            Vector3.zero);


        Matrix4by4 OrbitRoll = new Matrix4by4
                                   (new Vector3(Mathf.Cos(OrbitRotationZ), Mathf.Sin(OrbitRotationZ), 0),
                                   new Vector3(-Mathf.Sin(OrbitRotationZ), Mathf.Cos(OrbitRotationZ), 0),
                                   new Vector3(0, 0, 1),
                                   Vector3.zero);
        Matrix4by4 OrbitPitch = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(OrbitRotationX), Mathf.Sin(OrbitRotationX)),
            new Vector3(0, -Mathf.Sin(OrbitRotationX), Mathf.Cos(OrbitRotationX)),
            Vector3.zero);
        Matrix4by4 OrbitYaw = new Matrix4by4(
            new Vector3(Mathf.Cos(OrbitRotationY), 0, -Mathf.Sin(OrbitRotationY)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(OrbitRotationY), 0, Mathf.Cos(OrbitRotationY)),
            Vector3.zero);


        Matrix4by4 RotationOfOrbit = OrbitYaw * (OrbitPitch * OrbitRoll);


        Matrix4by4 R = yawmatrix * (pitchmatrix * rollMatrix);


        Vector3 offset = RotationOfOrbit * orbitdistance;

        actualposition = Transforms.Position + offset;

        Matrix4by4 T = new Matrix4by4(new Vector3(1, 0, 0),
                                      new Vector3(0, 1, 0)
                                      , new Vector3(0, 0, 1),
                                      new Vector3(Transforms.Position.x + offset.x, Transforms.Position.y + offset.y, Transforms.Position.z + offset.z));

        Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * scale, new Vector3(0, 1, 0) * scale, new Vector3(0, 0, 1) * scale, Vector3.zero);
        Matrix4by4 M = T * (R * S);

        //Transforms.Position = actualposition;
        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = M * ModelSpaceVertices[i];
        }


        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
Example #29
0
    //moons orbit around a planet, and as such need to find the position of the planet they orbit before calculating their orbit path
    void OrbitAround()
    {
        GameObject   controller   = GameObject.Find("SpeedController");
        SpeedControl spController = controller.GetComponent <SpeedControl>();

        SpeedScalar      = spController.Speed;
        worldPos         = Planet.transform.position;
        OrbitRotation.y += Time.deltaTime * orbitSpeed * SpeedScalar;
        Vector3[] TransformedVertices = new Vector3[ModelSpaceVertices.Length];
        yawAngle += Time.deltaTime;

        //create the first rotation matrix for individual planet rotation
        Matrix4by4 rollMatrix = new Matrix4by4
                                    (new Vector3(Mathf.Cos(yawAngle), Mathf.Sin(yawAngle), 0),
                                    new Vector3(-Mathf.Sin(yawAngle), Mathf.Cos(yawAngle), 0),
                                    new Vector3(0, 0, 1),
                                    Vector3.zero);
        Matrix4by4 pitchmatrix = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(yawAngle), Mathf.Sin(yawAngle)),
            new Vector3(0, -Mathf.Sin(yawAngle), Mathf.Cos(yawAngle)),
            Vector3.zero);
        Matrix4by4 yawmatrix = new Matrix4by4(
            new Vector3(Mathf.Cos(yawAngle), 0, -Mathf.Sin(yawAngle)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(yawAngle), 0, Mathf.Cos(yawAngle)),
            Vector3.zero);


        //create second rotation matrix for the planet's orbit
        Matrix4by4 OrbitRoll = new Matrix4by4
                                   (new Vector3(Mathf.Cos(OrbitRotation.z), Mathf.Sin(OrbitRotation.z), 0),
                                   new Vector3(-Mathf.Sin(OrbitRotation.z), Mathf.Cos(OrbitRotation.z), 0),
                                   new Vector3(0, 0, 1),
                                   Vector3.zero);
        Matrix4by4 OrbitPitch = new Matrix4by4(
            new Vector3(1, 0, 0),
            new Vector3(0, Mathf.Cos(OrbitRotation.x), Mathf.Sin(OrbitRotation.x)),
            new Vector3(0, -Mathf.Sin(OrbitRotation.x), Mathf.Cos(OrbitRotation.x)),
            Vector3.zero);
        Matrix4by4 OrbitYaw = new Matrix4by4(
            new Vector3(Mathf.Cos(OrbitRotation.y), 0, -Mathf.Sin(OrbitRotation.y)),
            new Vector3(0, 1, 0),
            new Vector3(Mathf.Sin(OrbitRotation.y), 0, Mathf.Cos(OrbitRotation.y)),
            Vector3.zero);


        Matrix4by4 RotationOfOrbit = OrbitYaw * (OrbitPitch * OrbitRoll);


        Matrix4by4 R = yawmatrix * (pitchmatrix * rollMatrix);


        offset = RotationOfOrbit * orbitDistance;

        newPos = worldPos + offset;

        Matrix4by4 T = new Matrix4by4(new Vector3(1, 0, 0),
                                      new Vector3(0, 1, 0)
                                      , new Vector3(0, 0, 1),
                                      new Vector3(newPos.x + offset.x, newPos.y + offset.y, newPos.z + offset.z));

        Matrix4by4 S = new Matrix4by4(new Vector3(1, 0, 0) * Scale, new Vector3(0, 1, 0) * Scale, new Vector3(0, 0, 1) * Scale, Vector3.zero);
        Matrix4by4 M = T * R * S;


        for (int i = 0; i < TransformedVertices.Length; i++)
        {
            TransformedVertices[i] = M * ModelSpaceVertices[i];
        }
        MeshFilter MF = GetComponent <MeshFilter>();

        MF.mesh.vertices = TransformedVertices;
        MF.mesh.RecalculateNormals();
        MF.mesh.RecalculateBounds();
    }
Example #30
0
    //function to return an identity matrix;
    Matrix4by4 Identity()
    {
        Matrix4by4 identity = new Matrix4by4(new Vector4(1, 0, 0, 0), new Vector4(0, 1, 0, 0), new Vector4(0, 0, 1, 0), new Vector4(0, 0, 0, 1));

        return(identity);
    }