x


How to calculate angles and apply to rotate an object.

I have an object that is a circle. I want to be able to rotate the circle around it's center point which will always stay the same (currently I have it at 0,0,0).

I can get two other points in space, basically a start point (x1,y1) and then an end point (x2,y2) based off of where the mouse is clicked and then where the mouse is dragged to.

From this I can get the distance from the the center to the start and end point and from the stop to the end point to get a triangle. The problem from there is I'm not sure how I can calculate the angles.

If I am thinking this through correctly I need to get the angles of the start point and end point and then use those to derive the angle of the center point. Then somehow set the rotation of the object to the angle of the center point.

I have a little diagram below. I'm very dusty on my trig and still learning the Unity language so any help would be much appreciated!

Here is the code I have so far, I'm stuck at how to get all three angles and then what I should use to apply the angle to a rotation once I find it.

using UnityEngine;

public class SpinWithMouse : MonoBehaviour
{
    public float speed = 5f;

    Transform mTrans;
    Vector3 currentLoc;
    Vector3 startTouch;

    void Start ()
    {
        //Set the transform for the script to the transform of the object the script is attached to
        mTrans = transform;
    }

    void OnPress()
    {
        //Set the x,y,z that is currently clicked or touched
        startTouch = UICamera.currentTouch.pos;

        //Get the distance of x,y,z from the center
        currentLoc = startTouch - transform.localPosition;      
    }

    void OnDrag (Vector2 delta)
    {
        //Set the x,y,z of where the mouse is currently at
        Vector3 dragTouch = UICamera.currentTouch.pos;

        //Get the distance of x,y,z from the center
        Vector3 newLoc = dragTouch - transform.localPosition;

        Debug.Log("Wheel location " + mTrans.localPosition);
        Debug.Log("Clicked location " + currentLoc);
        Debug.Log("Dragged location " + newLoc);
        Debug.Log("Start Touch " + startTouch);
        Debug.Log("Drag Touch " + dragTouch);
    }
}

alt text

rotate.png (11.1 kB)
more ▼

asked Oct 15, 2012 at 06:39 PM

Dakcenturi gravatar image

Dakcenturi
28 19 21 22

Stil at a loss, would really appreciate any guidance even a push in the right direction.

Oct 15, 2012 at 08:09 PM Dakcenturi
Oct 15, 2012 at 08:15 PM Fattie

Read through most of that. Problem is I can't really use Quaternion.LookRotation because the location I would be looking at is a Vector2 not a Quaternion. Unless I'm missing something?

I can't imagine this is too difficult for someone familiar with how this works, but as I'm still learning I'm having a hard time wrapping my head around it.

Oct 16, 2012 at 01:56 AM Dakcenturi

TBC ... all you want to know is how to calculate the angle shown between the two lines

AB and AC

is that correct?

spark has given you the answer! just use the unity function "Angle"

Unity has amazingly helpful functions. often if you simply search on the WORD involved (eg "angle") you'll find it !

so it's Vector2.angle( B-A, C-A );

you shoudl TICK his answer if it helps to keep the board tidy, cheers!

Oct 16, 2012 at 05:51 AM Fattie

So I played with the LookRotation a little bit more and I almost have it working. There is one problem, it turns the whole object to face the mouse rather than just turning it around the z-axis toward the mouse.

I tried limiting the x and y as per the example in unitygems, but then it just doesn't rotate at all.

Here is where I am at, if the x,y rotation can be stopped somehow and only the z rotation this would work perfectly.

using UnityEngine;

public class SpinWithMouse : MonoBehaviour
{
    public Transform target;
    public float speed = 1f;

    Transform mTrans;
    Vector3 currentLoc;
	Vector3 startTouch;
    public float angle = 0f;

    void Start ()
    {
        //Set the transform for the script to the transform of the object the script is attached to
       	mTrans = transform;
    }

    void OnPress()
    {
       	//Set the x,y,z that is currently clicked or touched
		currentLoc = UICamera.currentTouch.pos;
		
		startTouch = currentLoc - mTrans.localPosition;
    }

    void OnDrag (Vector2 delta)
    {
        //Set the x,y,z of where the mouse is currently at
       	Vector3 newLoc = UICamera.currentTouch.pos;
		
		Vector3 currentTouch = newLoc - mTrans.localPosition;

        //Get the difference between the start angle and the stop angle
       	//Quaternion targetRotation = Quaternion.LookRotation(newLoc - currentLoc);

        //Set the rotation of the object based on where the click occured and where the mouse is dragged i
        mtrans.localRotation = Quaternion.LookRotation(newLoc - currentLoc);

       	Debug.Log("Position " + UICamera.currentTouch.pos);
       	Debug.Log("Wheel location " + mTrans.localRotation);
    }
}
Oct 16, 2012 at 09:02 AM Dakcenturi
show all comments (comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

this is a 2d rotation?

then you want to rotate around the y axis angle degrees

angle can be found using the angle function

angle = vector2.angle(from angle(or first click pos), to angle(second click)

rotate(vector3.up, angle)

if good mark as answered if you need more help comment.

more ▼

answered Oct 16, 2012 at 02:12 AM

sparkzbarca gravatar image

sparkzbarca
4.7k 98 558 126

(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:

x3614
x1411
x461
x459
x2

asked: Oct 15, 2012 at 06:39 PM

Seen: 2368 times

Last Updated: Oct 16, 2012 at 04:08 PM