상속: Vector3
예제 #1
0
        public Euler Copy(Euler euler)
        {
            this._x     = euler._x;
            this._y     = euler._y;
            this._z     = euler._z;
            this._order = euler._order;

            this.OnChangeCallback();

            return(this);
        }
예제 #2
0
        public Vector3 ApplyEuler(Euler euler)
        {
            var quaternion = new Quaternion();

            return(this.ApplyQuaternion(quaternion.SetFromEuler(euler)));
        }
예제 #3
0
        public Quaternion SetFromEuler(Euler euler, bool update = false)
        {
            double x = euler._x, y = euler._y, z = euler._z;
            string order = euler._order;

            // http://www.mathworks.com/matlabcentral/fileexchange/
            //  20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
            //	content/SpinCalc.m

            var c1 = _Math.Cos(x / 2);
            var c2 = _Math.Cos(y / 2);
            var c3 = _Math.Cos(z / 2);

            var s1 = _Math.Sin(x / 2);
            var s2 = _Math.Sin(y / 2);
            var s3 = _Math.Sin(z / 2);

            if (order == "XYZ")
            {
                this._x = s1 * c2 * c3 + c1 * s2 * s3;
                this._y = c1 * s2 * c3 - s1 * c2 * s3;
                this._z = c1 * c2 * s3 + s1 * s2 * c3;
                this._w = c1 * c2 * c3 - s1 * s2 * s3;
            }
            else if (order == "YXZ")
            {
                this._x = s1 * c2 * c3 + c1 * s2 * s3;
                this._y = c1 * s2 * c3 - s1 * c2 * s3;
                this._z = c1 * c2 * s3 - s1 * s2 * c3;
                this._w = c1 * c2 * c3 + s1 * s2 * s3;
            }
            else if (order == "ZXY")
            {
                this._x = s1 * c2 * c3 - c1 * s2 * s3;
                this._y = c1 * s2 * c3 + s1 * c2 * s3;
                this._z = c1 * c2 * s3 + s1 * s2 * c3;
                this._w = c1 * c2 * c3 - s1 * s2 * s3;
            }
            else if (order == "ZYX")
            {
                this._x = s1 * c2 * c3 - c1 * s2 * s3;
                this._y = c1 * s2 * c3 + s1 * c2 * s3;
                this._z = c1 * c2 * s3 - s1 * s2 * c3;
                this._w = c1 * c2 * c3 + s1 * s2 * s3;
            }
            else if (order == "YZX")
            {
                this._x = s1 * c2 * c3 + c1 * s2 * s3;
                this._y = c1 * s2 * c3 + s1 * c2 * s3;
                this._z = c1 * c2 * s3 - s1 * s2 * c3;
                this._w = c1 * c2 * c3 - s1 * s2 * s3;
            }
            else if (order == "XZY")
            {
                this._x = s1 * c2 * c3 - c1 * s2 * s3;
                this._y = c1 * s2 * c3 - s1 * c2 * s3;
                this._z = c1 * c2 * s3 + s1 * s2 * c3;
                this._w = c1 * c2 * c3 + s1 * s2 * s3;
            }

            if (update != false)
            {
                this.OnChangeCallback();
            }

            return(this);
        }
예제 #4
0
 public bool Equals(Euler euler)
 {
     return(euler._x == this._x && euler._y == this._y && euler._z == this._z && euler._order == this._order);
 }
예제 #5
0
        public Matrix4 MakeRotationFromEuler(Euler euler)
        {
            var te = this.elements;

            double x = euler._x, y = euler._y, z = euler._z;
            double a = _Math.Cos(x), b = _Math.Sin(x);
            double c = _Math.Cos(y), d = _Math.Sin(y);
            double e = _Math.Cos(z), f = _Math.Sin(z);

            if (euler._order == "XYZ")
            {
                double ae = a * e, af = a * f, be = b * e, bf = b * f;

                te[0] = c * e;
                te[4] = -c * f;
                te[8] = d;

                te[1] = af + be * d;
                te[5] = ae - bf * d;
                te[9] = -b * c;

                te[2]  = bf - ae * d;
                te[6]  = be + af * d;
                te[10] = a * c;
            }
            else if (euler._order == "YXZ")
            {
                double ce = c * e, cf = c * f, de = d * e, df = d * f;

                te[0] = ce + df * b;
                te[4] = de * b - cf;
                te[8] = a * d;

                te[1] = a * f;
                te[5] = a * e;
                te[9] = -b;

                te[2]  = cf * b - de;
                te[6]  = df + ce * b;
                te[10] = a * c;
            }
            else if (euler._order == "ZXY")
            {
                double ce = c * e, cf = c * f, de = d * e, df = d * f;

                te[0] = ce - df * b;
                te[4] = -a * f;
                te[8] = de + cf * b;

                te[1] = cf + de * b;
                te[5] = a * e;
                te[9] = df - ce * b;

                te[2]  = -a * d;
                te[6]  = b;
                te[10] = a * c;
            }
            else if (euler._order == "ZYX")
            {
                double ae = a * e, af = a * f, be = b * e, bf = b * f;

                te[0] = c * e;
                te[4] = be * d - af;
                te[8] = ae * d + bf;

                te[1] = c * f;
                te[5] = bf * d + ae;
                te[9] = af * d - be;

                te[2]  = -d;
                te[6]  = b * c;
                te[10] = a * c;
            }
            else if (euler._order == "YZX")
            {
                double ac = a * c, ad = a * d, bc = b * c, bd = b * d;

                te[0] = c * e;
                te[4] = bd - ac * f;
                te[8] = bc * f + ad;

                te[1] = f;
                te[5] = a * e;
                te[9] = -b * e;

                te[2]  = -d * e;
                te[6]  = ad * f + bc;
                te[10] = ac - bd * f;
            }
            else if (euler._order == "XZY")
            {
                double ac = a * c, ad = a * d, bc = b * c, bd = b * d;

                te[0] = c * e;
                te[4] = -f;
                te[8] = d * e;

                te[1] = ac * f + bd;
                te[5] = a * e;
                te[9] = ad * f - bc;

                te[2]  = bc * f - ad;
                te[6]  = b * e;
                te[10] = bd * f + ac;
            }

            // bottom row
            te[3]  = 0;
            te[7]  = 0;
            te[11] = 0;

            // last column
            te[12] = 0;
            te[13] = 0;
            te[14] = 0;
            te[15] = 1;

            return(this);
        }