x


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

more ▼

asked Jun 29 '12 at 05:37 PM

franktrog gravatar image

franktrog
1 5 6 7

(comments are locked)
10|3000 characters needed characters left

3 answers: sort voted first

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.

more ▼

answered Jun 29 '12 at 06:06 PM

irrationalistic gravatar image

irrationalistic
104 1 3 6

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.

Jun 29 '12 at 06:13 PM Loius

Sorry, I am new to Unity and dont really understand your answer.

Jun 29 '12 at 06:17 PM franktrog
(comments are locked)
10|3000 characters needed characters left

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);
more ▼

answered Jun 29 '12 at 06:13 PM

Piflik gravatar image

Piflik
5.4k 15 26 44

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?

Jun 29 '12 at 06:40 PM franktrog

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.

Jun 29 '12 at 06:50 PM Piflik

Posted the script and it was added to the top of this page.

Jul 01 '12 at 01:16 PM franktrog
(comments are locked)
10|3000 characters needed characters left

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!

more ▼

answered Jul 02 '12 at 10:45 PM

franktrog gravatar image

franktrog
1 5 6 7

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2171
x1095
x886

asked: Jun 29 '12 at 05:37 PM

Seen: 413 times

Last Updated: Jul 02 '12 at 10:45 PM