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; } }
//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; }
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; } }
private Dictionary <byte, byte> GetPumpIDAddress(ArmInfo armInfo) { Dictionary <byte, byte> pumpIDAddress = armInfo.PumpsInfo.ToDictionary(x => x.ID, x => x.Address); return(pumpIDAddress); }
//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; }