|
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. 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
(comments are locked)
|
|
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.
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)
|
|
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? 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)
|
|
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){ 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!
(comments are locked)
|
