Esempio n. 1
0
    void RotateTheArm()
    {
        //test code
        Quaternion InheritedRotation = new Quaternion(0, 0, 0, 1);


        for (int i = 0; i < ArmsList.Length; i++)
        {
            ArmInfo ArmData = ArmsList[i];

            //set socket positions
            if (i == 0)
            {
                ArmData.SocketPosition = BaseObject.transform.position;
            }
            else
            {
                ArmData.SocketPosition = ArmsList[i - 1].ArmEnd.transform.position;
            }

            //rotate the arm
            Quaternion TestRotator = Quaternion.Euler(-1f, 4f, 6f);
            InheritedRotation *= TestRotator;
            Debug.Log("InheritedRotation of " + ArmData.Arm.name + ": " + InheritedRotation.ToString());

            ArmData.Arm.transform.rotation *= InheritedRotation;

            //move the arm
            ArmData.Arm.transform.position =
                ArmData.Arm.transform.position -
                ArmData.ArmBase.transform.position +
                ArmData.SocketPosition;
        }
    }
Esempio n. 2
0
    //Try 2
    void PointTowards(ArmInfo CurrentArmInfo, GameObject NextBase, GameObject PreviousObject) //A new refined method for PointAt, which uses Euler angles instead to limit degrees of motion
    {
        //Debug lines
        Debug.DrawRay(CurrentArmInfo.Arm.transform.position, CurrentArmInfo.Arm.transform.forward, Color.red, 1);
        //Debug.DrawRay(NextBase.transform.position, NextBase.transform.forward, Color.blue, 1);

        // Get the aim position for next frame
        Vector3 target = CurrentArmInfo.ArmEnd.transform.position;

        target += (NextBase.transform.position - target) / 2;

        Vector3 PlaneNormal = Vector3.Cross(CurrentArmInfo.Arm.transform.forward, NextBase.transform.forward).normalized;

        Debug.DrawRay(CurrentArmInfo.ArmEnd.transform.position, PlaneNormal, Color.green, 1);

        float angle = Vector3.Angle(CurrentArmInfo.Arm.transform.forward, PreviousObject.transform.forward);

        Quaternion quaternion = Quaternion.FromToRotation(CurrentArmInfo.Arm.transform.forward, PreviousObject.transform.forward);

        //Vector3 angleaxis = Quaternion.AngleAxis(angle, PlaneNormal) * CurrentArmInfo.Arm.transform.position;
        Vector3 QuaternionAngle = quaternion * CurrentArmInfo.Arm.transform.forward;
        float   EulerAngle      = Quaternion.Angle(quaternion, Quaternion.Inverse(CurrentArmInfo.Arm.transform.rotation));

        Debug.Log(string.Format("{0}: {1}. {2}", CurrentArmInfo.Arm.name, angle, EulerAngle));

        //Debug.DrawLine(CurrentArmInfo.Arm.transform.position, QuaternionAngle, Color.black, 1);
        Debug.DrawRay(CurrentArmInfo.Arm.transform.position, QuaternionAngle, Color.black, 1);

        Vector3 newtarget = Quaternion.AngleAxis(0, PlaneNormal) * CurrentArmInfo.Arm.transform.forward;

        //Debug.Log(angleaxis.ToString() + ".... and " + target.ToString());
        Debug.DrawLine(target, newtarget, Color.white, 1);

        if (angle > 90)
        {
            Debug.Log("Arm " + CurrentArmInfo.Arm.name + " is over 90");
            //CurrentArmInfo.Arm.transform.LookAt(newtarget);
        }
        else
        {
            CurrentArmInfo.Arm.transform.LookAt(target);
        }


        //Move to next position
        CurrentArmInfo.Arm.transform.position -=
            CurrentArmInfo.ArmEnd.transform.position -
            NextBase.transform.position;
    }
Esempio n. 3
0
    void ForwardRotateArm()
    {
        for (int i = 0; i < ArmsList.Length; i++)
        {
            //ArmData value used to shorten code
            ArmInfo ArmData = ArmsList[i];

            //set socket positions
            if (i == 0)
            {
                ArmData.SocketPosition = BaseObject.transform.position;
            }
            else
            {
                ArmData.SocketPosition = ArmsList[i - 1].ArmEnd.transform.position;
            }

            //move back to sockets without rotation
            ArmData.Arm.transform.position =
                ArmData.Arm.transform.position -
                ArmData.ArmBase.transform.position +
                ArmData.SocketPosition;
        }
    }
Esempio n. 4
0
        private Dictionary <byte, byte> GetPumpIDAddress(ArmInfo armInfo)
        {
            Dictionary <byte, byte> pumpIDAddress = armInfo.PumpsInfo.ToDictionary(x => x.ID, x => x.Address);

            return(pumpIDAddress);
        }
Esempio n. 5
0
    //The one that works
    void PointAtNew(ArmInfo CurrentArmInfo, GameObject NextBase, GameObject NextArm, GameObject PreviousObject) //RETRY
    {
        // Get the aim position for next frame
        Vector3 target = CurrentArmInfo.ArmEnd.transform.position;

        target += (NextBase.transform.position - target) / 2;

        //float angle = Vector3.Angle(CurrentArmInfo.Arm.transform.forward, PreviousObject.transform.forward);
        //angle = Mathf.Clamp(angle, 0, 90);

        float angle2 = Vector3.Angle(NextArm.transform.forward, CurrentArmInfo.Arm.transform.forward);

        angle2 = Mathf.Clamp(angle2, 0, 90);

        Debug.DrawRay(CurrentArmInfo.Arm.transform.position, CurrentArmInfo.Arm.transform.forward, Color.black, 1);


        Debug.Log(string.Format("Angles of {0} is {1}", CurrentArmInfo.Arm.name, angle2));

        Vector3 PlaneNormal = Vector3.Cross(CurrentArmInfo.Arm.transform.forward, NextArm.transform.forward).normalized;

        Debug.DrawRay(CurrentArmInfo.ArmBase.transform.position, PlaneNormal, Color.green, 1);

        //Vector3 NewDirection = Quaternion.AngleAxis(angle, PlaneNormal) * CurrentArmInfo.Arm.transform.forward;
        Vector3 NewDirection2 = Quaternion.AngleAxis(angle2, PlaneNormal) * CurrentArmInfo.Arm.transform.forward;

        //Debug.DrawRay(CurrentArmInfo.Arm.transform.position, NewDirection, Color.blue, 1);
        Debug.DrawRay(CurrentArmInfo.Arm.transform.position, NewDirection2, Color.white, 1);
        Debug.DrawLine(CurrentArmInfo.Arm.transform.position, target, Color.cyan, 1);

        if (angle2 > 90)
        {
            Debug.Log("Arm " + CurrentArmInfo.Arm.name + " is over 90");
        }


        //setup coordinate system
        Vector3 YVector = CurrentArmInfo.Arm.transform.forward;
        Vector3 ZVector = PlaneNormal;
        Vector3 XVector = Vector3.Cross(YVector, ZVector);

        Vector3 lookPos = target;

        CurrentArmInfo.Arm.transform.LookAt(target);

        if (CurrentArmInfo.Arm.GetComponent <ArmRestrictions>().rotateX == false)
        {
            CurrentArmInfo.Arm.transform.localEulerAngles = new Vector3(
                PreviousObject.transform.eulerAngles.x,
                CurrentArmInfo.Arm.transform.eulerAngles.y,
                CurrentArmInfo.Arm.transform.eulerAngles.z);
        }
        if (CurrentArmInfo.Arm.GetComponent <ArmRestrictions>().rotateY == false)
        {
            CurrentArmInfo.Arm.transform.localEulerAngles = new Vector3(
                CurrentArmInfo.Arm.transform.eulerAngles.x,
                PreviousObject.transform.eulerAngles.y,
                CurrentArmInfo.Arm.transform.eulerAngles.z);
        }
        if (CurrentArmInfo.Arm.GetComponent <ArmRestrictions>().rotateZ == false)
        {
            CurrentArmInfo.Arm.transform.localEulerAngles = new Vector3(
                CurrentArmInfo.Arm.transform.eulerAngles.x,
                CurrentArmInfo.Arm.transform.eulerAngles.y,
                PreviousObject.transform.eulerAngles.z);
        }

        var rotationxyz = Quaternion.LookRotation(lookPos);

        //CurrentArmInfo.Arm.transform.rotation = rotationxyz;

        //var delta = target - CurrentArmInfo.Arm.transform.position;
        //var angle = Mathf.Atan2(delta.y, delta.x) * Mathf.Rad2Deg;
        //var rotation = Quaternion.Euler(0, angle, 0);



        //Move to next position
        CurrentArmInfo.Arm.transform.position -=
            CurrentArmInfo.ArmEnd.transform.position -
            NextBase.transform.position;
    }