Solved: only write to Euler angles! (at least in this case)*
Hi all-
I’ve been struggling in vain for some time now. Going a bit crazy.
Trying to make a simple script to rotate an object based on dragging the mouse on the screen- if the user lets go past the 45deg point, it auto-flips to 180 deg mark, or flips back to original point if not rotates past that point.
Unfortunatly, this isn’t working at all, and the best reason I can see is that Unity is (in an INCREDIBLY annoying fashion) messing with the rotation values in a way I don’t understand. Like the title says, it seems that once I rotate one axis past 90degrees, it starts counting backd down to 0, and the other two axis snap to 180 or -180. AHHGGG.
I’ve spent 6 hours trying to figure this out. ridiculous, right? I am completly stumped. Any ideas how to get a proper reading from from this thing?
I’ll post the entire script I’m using- I’m very much an amateur coder, so please try not to laugh
lol…and if you have additional improvments, feel free to drop those.
thanks a bunch…please help!! ![]()
Code:
//click position, drag, etc variables
var clickStartPos : Vector3;
var dragging : boolean = false;
var offset : float = 0.00;
var rotationStart : float = 0.00;
var divFactor : float = 0.00;
var finalRotation : float = 0.00;
var dragAmount : float = 0.00;
//rotation state variables
var autoFlipping : boolean = false;
var autoReset : boolean = false;
var backFlipToBack : boolean = false;
var fwdFlipToBack : boolean = false;
var backFlipToFront : boolean = false;
var fwdFlipToFront : boolean = false;
//front or back facing states
var facingFront : boolean = true;
var reversed : boolean = false;
//rotation target variables
private var startRotation : Quaternion;
var frontRotationTarget : Transform;
private var frontRotation : Quaternion;
var backRotationTarget : Transform;
private var backRotation : Quaternion;
//rotation timing variables
var animateTime : float = 1.00;
var lerpAmount : float = 0.00;
var timePassed : float = 0.00;
function Start()
{
if(frontRotationTarget)
frontRotation = frontRotationTarget.rotation;
if(backRotationTarget)
backRotation = backRotationTarget.rotation;
startRotation = transform.rotation;
divFactor = Screen.height / 65;
}
function Update()
{
if(!autoFlipping)
{
if(Input.GetMouseButtonDown(0))
{
clickStartPos = Input.mousePosition;
rotationStart = transform.eulerAngles.x;
dragging = true;
}
if(dragging)
{
curserPos = Input.mousePosition;
dragAmount = curserPos.y - clickStartPos.y;
factoredDrag = dragAmount / divFactor;
finalRotation = rotationStart + factoredDrag;
transform.eulerAngles = Vector3(finalRotation,0,0);
if(Input.GetMouseButtonUp(0))
{
//no longer dragging
dragging = false;
//we are about to do some auto-rotation- so reset all timing values, and set starting variables!
startRotation = transform.rotation;
timePassed = 0;
lerpAmount = 0;
//check if the card was rotated fare enough to initiate flip
//if yes, decide which way to flip, and where to
if(facingFront)
{
if(finalRotation >= 45)
{
backFlipToBack = true;
}
if(finalRotation <= -45)
{
fwdFlipToBack = true;
}
}
if(reversed)
{
if(finalRotation >= 45)
{
backFlipToFront = true;
}
if(finalRotation <= -45)
{
fwdFlipToFront = true;
}
}
//if we not about to flip to a new position, set autoReset state, else start the autoFlipping
//NOTE: "autoFlipping" is a generic state, which is active whenever the card is flipping on its own,
//hence, autoFlipping is active when autoReset is also active- it simply lets the game know the card
// is flipping- whether to reset or toward a new position.
if(!backFlipToBack !fwdFlipToBack !backFlipToFront !fwdFlipToFront)
{
autoReset = true;
autoFlipping = true;
}
else
{
autoFlipping = true;
}
}
}
}
if(autoReset)
{
//lerp the rotation back to last angle
if(facingFront)
{
//lerp back to front
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, frontRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = frontRotation;
autoReset = false;
autoFlipping = false;
facingFront = true;
reversed = false;
}
}
if(reversed)
{
//lerp back to reversed
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, backRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = backRotation;
autoReset = false;
autoFlipping = false;
facingFront = false;
reversed = true;
}
}
}
if(backFlipToBack)
{
//perform backwards flip to back side
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, backRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = frontRotation;
autoFlipping = false;
backFlipToBack = false;
facingFront = false;
reversed = true;
}
}
if(fwdFlipToBack)
{
//perform backwards flip to back side
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, backRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = frontRotation;
autoFlipping = false;
fwdFlipToBack = false;
facingFront = false;
reversed = true;
}
}
if(backFlipToFront)
{
//perform backwards flip to back side
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, frontRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = frontRotation;
autoFlipping = false;
backFlipToFront = false;
facingFront = true;
reversed = false;
}
}
if(fwdFlipToFront)
{
//perform backwards flip to back side
timePassed += Time.deltaTime;
lerpAmount = (timePassed/animateTime) ;
transform.rotation = Quaternion.Slerp (startRotation, frontRotation, lerpAmount);
if(lerpAmount >= 1)
{
transform.rotation = frontRotation;
autoFlipping = false;
fwdFlipToFront = false;
facingFront = true;
reversed = false;
}
}
}