- Home /
Return object to position
I am attempting to slowly rotate an object back to 0,0,0 and when I click on the button that is controlling the function Unity freezes. Any input on this would be appreciated.
if(iFocusB){
while(camObj.transform.rotation != Quaternion.identity){
var xR = 0;
var yR = 0;
var zR = 0;
if(camObj.transform.rotation.x != 0) xR = 5; else xR = 0;
if(camObj.transform.rotation.y != 0) yR = 5; else yR = 0;
if(camObj.transform.rotation.z != 0) zR = 5; else zR = 0;
camObj.transform.Rotate(Vector3(xR,yR,zR)*Time.deltaTime*speed);
}
//camObj.transform.position = Vector3.zero;
//camObj.transform.rotation = Quaternion.identity;
}
Regards,
Frank
Frank added his code in an answer, I pasted it on pastebin. He also uploaded the .js. (Berenger)
Here is the complete code. I have a few buttons and don't have them doing anything until I can figure out how to properly rotate the object in the scene. Basically I have an object parented to an empty object and am using code to rotate it around to certain sides.
Here is the current code and I uploaded the file since it doesn't look so nice in this area. I'm new to Unity scripting so I want to go ahead and apologize if I am really doing something in a bad way.
Regards,
Frank
Answer by irrationalistic · Jun 29, 2012 at 06:06 PM
This should really be in a coroutine with yields or in the object's Update() function. While statements execute until they are completed and don't care about frame-rate.
Additionally, it's unlikely that the rotation will ever be Quaternion.identity, because float precision combined with quaternion operations means you'll hit 1.0000001, which isn't 1.0, and then skip over 1.0 and hit 0.9999999 on the other side. There are some angle-comparison functions in Qauternion/Vector3 that can be used to test "if rotation is within 1 degree of identity" that will eventually exit the while.
Sorry, I am new to Unity and dont really understand your answer.
Answer by Piflik · Jun 29, 2012 at 06:13 PM
Not sure if that helps, but I highly doubt you will ever reach Quaternion.identity this way. There are two problems: Gimbal Lock and accuracy. The former is not solvable with a fixed rotation order, the latter could be fixed by rounding...
Anyway, why don't you simply use Quaternion.Slerp?
transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.identity, Time.time * speed);
I actually stumbled upon the article for the Slerp method and tried to implement it with this code.
if(iFocusB){ focusTrigger = true; }
if(focusTrigger == true){ camObj.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.identity, Time.deltaTime*smooth);; if(camObj.transform.rotation == Quaternion.identity) focusTrigger = false; }
However focusTrigger is never set back to false even though the if statement triggers. I tested by adding a Debug.Log to the if statement.
Also the object snaps back to Quaternion.identity rather than smoothly transitioning. Any ideas why this may be?
Not sure what you do wrong, but when I use the exact same script you posted, it works.
Post the complete script, preferably formated correctly.
Posted the script and it was added to the top of this page.
Answer by franktrog · Jul 02, 2012 at 10:45 PM
Well I figured out my issue. In the first part of the Slerp I was forgetting to identify which object to use for the "from" transform.rotation point. Here is the final code.
if(iFocusB){
camTrigger = 1; }
if(iFocusRB){ camTrigger = 2; }
if(iFocusTB){ camTrigger = 3; }
if(Input.GetMouseButton(0)){ camObj.transform.Rotate(Vector3(Input.GetAxis("Mouse Y"), 0, Input.GetAxis("Mouse X")) Time.deltaTime speed); }
if(camTrigger == 1){//Triggers when iFocusB is pushed camObj.transform.rotation = Quaternion.Slerp(camObj.transform.rotation, Quaternion.Euler(92,-50,0), Time.deltaTime*smooth);; if(camObj.transform.rotation == Quaternion.Euler(92,-50,0)) camTrigger = 0; }else if(camTrigger == 2){//Triggers when iFocusRB is pushed camObj.transform.rotation = Quaternion.Slerp(camObj.transform.rotation, Quaternion.Euler(90,90,0), Time.deltaTime*smooth);; if(camObj.transform.rotation == Quaternion.Euler(90,90,0)) camTrigger = 0; }else if(camTrigger == 3){//Triggers when iFocusTB is pushed camObj.transform.rotation = Quaternion.Slerp(camObj.transform.rotation, Quaternion.Euler(20,15,92), Time.deltaTime*smooth);; if(camObj.transform.rotation == Quaternion.Euler(20,15,92)) camTrigger = 0; }
Thanks for the help everyone!