- Home /
Script for camera movement using Arcball,Scripting Camera Movements with Arcball
I wrote the following script, but I have a problem that the camera moves upward the moment I drag the mouse. How can I make it so that the camera does not move instantly when I drag the mouse?
using System.Collections; using System.Collections.Generic; using UnityEngine;
[RequireComponent(typeof(Camera))] public class ArcballScript : MonoBehaviour { // Is true when the user wants to rotate the camera bool ballEnabled = false;
float rotationSpeed = 1f;
float radius = 5f;
// The mouse cursor's position during the last frame
Vector3 last = new Vector3();
// The target that the camera looks at
Vector3 target = new Vector3(0, 0, 0);
// The spherical coordinates
Vector3 sc = new Vector3();
void Start()
{
this.transform.position = new Vector3(radius, 0.0f, 0.0f);
this.transform.LookAt(target);
sc = getSphericalCoordinates(this.transform.position);
}
Vector3 getSphericalCoordinates(Vector3 cartesian)
{
float r = Mathf.Sqrt(
Mathf.Pow(cartesian.x, 2) +
Mathf.Pow(cartesian.y, 2) +
Mathf.Pow(cartesian.z, 2)
);
float phi = Mathf.Atan2(cartesian.z / cartesian.x, cartesian.x);
float theta = Mathf.Acos(cartesian.y / r);
if (cartesian.x < 0)
phi += Mathf.PI;
return new Vector3(r, phi, theta);
}
Vector3 getCartesianCoordinates(Vector3 spherical)
{
Vector3 ret = new Vector3();
ret.x = spherical.x * Mathf.Cos(spherical.z) * Mathf.Cos(spherical.y);
ret.y = spherical.x * Mathf.Sin(spherical.z);
ret.z = spherical.x * Mathf.Cos(spherical.z) * Mathf.Sin(spherical.y);
return ret;
}
// Update is called once per frame
void Update()
{
// Whenever the left mouse button is pressed, the
// mouse cursor's position is stored for the arc-
// ball camera as a reference.
if (Input.GetMouseButtonDown(0))
{
// last is a global vec3 variable
last = Input.mousePosition;
// This is another global variable
ballEnabled = true;
}
// When the user releases the left mouse button,
// all we have to do is to reset the flag.
if (Input.GetMouseButtonUp(0))
ballEnabled = false;
if (ballEnabled)
{
// Get the deltas that describe how much the mouse cursor got moved between frames
float dx = (last.x - Input.mousePosition.x) * rotationSpeed;
float dy = (last.y - Input.mousePosition.y) * rotationSpeed;
// Only update the camera's position if the mouse got moved in either direction
if (dx != 0f || dy != 0f)
{
// Rotate the camera left and right
sc.y += dx * Time.deltaTime;
// Rotate the camera up and down
// Prevent the camera from turning upside down (1.5f = approx. Pi / 2)
sc.z = Mathf.Clamp(sc.z + dy * Time.deltaTime, -1.5f, 1.5f);
// Calculate the cartesian coordinates for unity
transform.position = getCartesianCoordinates(sc) + target;
// Make the camera look at the target
transform.LookAt(target);
}
// Update the last mouse position
last = Input.mousePosition;
}
}
}, I wrote the following script, but I have a problem that the camera moves upward the moment I drag the mouse. How can I make it so that the camera does not move instantly when I drag the mouse?
using System.Collections; using System.Collections.Generic; using UnityEngine;
[RequireComponent (typeof (Camera))] public class ArcballScript : MonoBehaviour { // Is true when the user wants to rotate the camera bool ballEnabled = false;
float rotationSpeed = 1f;
float radius = 5f;
// The mouse cursor's position during the last frame
Vector3 last = new Vector3();
// The target that the camera looks at
Vector3 target = new Vector3 (0, 0, 0);
// The spherical coordinates
Vector3 sc = new Vector3 ();
void Start ()
{
this.transform.position = new Vector3 (radius, 0.0f, 0.0f);
this.transform.LookAt (target);
sc = getSphericalCoordinates (this.transform.position);
}
Vector3 getSphericalCoordinates(Vector3 cartesian)
{
float r = Mathf.Sqrt(
Mathf.Pow(cartesian.x, 2) +
Mathf.Pow(cartesian.y, 2) +
Mathf.Pow(cartesian.z, 2)
);
float phi = Mathf.Atan2(cartesian.z / cartesian.x, cartesian.x);
float theta = Mathf.Acos(cartesian.y / r);
if (cartesian.x < 0)
phi += Mathf.PI;
return new Vector3 (r, phi, theta);
}
Vector3 getCartesianCoordinates(Vector3 spherical)
{
Vector3 ret = new Vector3 ();
ret.x = spherical.x * Mathf.Cos (spherical.z) * Mathf.Cos (spherical.y);
ret.y = spherical.x * Mathf.Sin (spherical.z);
ret.z = spherical.x * Mathf.Cos (spherical.z) * Mathf.Sin (spherical.y);
return ret;
}
// Update is called once per frame
void Update ()
{
// Whenever the left mouse button is pressed, the
// mouse cursor's position is stored for the arc-
// ball camera as a reference.
if (Input.GetMouseButtonDown(0))
{
// last is a global vec3 variable
last = Input.mousePosition;
// This is another global variable
ballEnabled = true;
}
// When the user releases the left mouse button,
// all we have to do is to reset the flag.
if (Input.GetMouseButtonUp (0))
ballEnabled = false;
if (ballEnabled)
{
// Get the deltas that describe how much the mouse cursor got moved between frames
float dx = (last.x - Input.mousePosition.x) * rotationSpeed;
float dy = (last.y - Input.mousePosition.y) * rotationSpeed;
// Only update the camera's position if the mouse got moved in either direction
if (dx != 0f || dy != 0f)
{
// Rotate the camera left and right
sc.y += dx * Time.deltaTime;
// Rotate the camera up and down
// Prevent the camera from turning upside down (1.5f = approx. Pi / 2)
sc.z = Mathf.Clamp (sc.z + dy * Time.deltaTime, -1.5f, 1.5f);
// Calculate the cartesian coordinates for unity
transform.position = getCartesianCoordinates (sc) + target;
// Make the camera look at the target
transform.LookAt (target);
}
// Update the last mouse position
last = Input.mousePosition;
}
}
}
Your answer
Follow this Question
Related Questions
Why the movement of the camera in the Z axis is so fast? 0 Answers
Mouse Look Help 2 Answers
Use input.mouseposition to rotate camera 1 Answer
Move mechanical arm with mouse 0 Answers
Camera Rotates Incorrectly 2 Answers