- Home /
RTS Camera: Rotate Around Point but then Pan Directions Flip
So Im trying to make an RTS Camera. Ive figured this out before but cant seem to now. Its a regular rts type camera but as the title says when I rotate the panning is mixed up. The panning uses an empty gameobject's forward to tell forward, back, left and right. Since I rotated about it, the game objects forward vector relative to the camera doesnt properly translate.
Heres what I have so far using UnityEngine; using System.Collections;
public class CameraRTS : MonoBehaviour {
public Transform cameraJoint;
private Vector2 pos; //mouse
public float panSensitvity = 0.25f; //sensitivity 0 to 1
public float verticalSpeed = 1;
public float cameraRotateSpeed = 80f;
public float cameraDistance = 30f;
//zoom stuff
float ZoomAmount = 0;
float MaxToClamp = 3;
float ROTSpeed = 5;
//attach this to camera, parent it to a gameObject
// Use this for initialization
void Start () {
//transform.position = (0,1,-3.5);
transform.localPosition = new Vector3 (0f, 1f, -3.5f);
transform.localRotation = Quaternion.Euler(45f,0f,0f);
}
// Update is called once per frame
void Update () {
//get mouse 2d pos on screen
pos = Camera.main.ScreenToViewportPoint(Input.mousePosition);
//scroll and zoom
ZoomAmount += Input.GetAxis("Mouse ScrollWheel");
ZoomAmount = Mathf.Clamp(ZoomAmount, -MaxToClamp, MaxToClamp);
var translate = Mathf.Min(Mathf.Abs(Input.GetAxis("Mouse ScrollWheel")), MaxToClamp - Mathf.Abs(ZoomAmount));
transform.Translate(0,0,translate * ROTSpeed * Mathf.Sign(Input.GetAxis("Mouse ScrollWheel")));
//rotation
if (Input.GetKey (KeyCode.Mouse2)) {
//need to lock cursor and make invisible
if (pos.x >= 0.9f)
{
//rotate left
transform.RotateAround(cameraJoint.position, Vector3.up, cameraRotateSpeed * Time.deltaTime);
}
if (pos.x <= 0.1f){
//rotate right
transform.RotateAround(cameraJoint.position, Vector3.down, cameraRotateSpeed * Time.deltaTime);
}
//pos.x;
} else {
mouseborder ();
}
}
void mouseborder(){
//mouse is in the far right of the screen
if (pos.x >= 0.9f)
{
cameraJoint.transform.Translate(Vector3.right * panSensitvity);
}
//mouse is in the far left of the screen
else if (pos.x <= 0.1f)
{
//move left
cameraJoint.transform.Translate(Vector3.left * panSensitvity);
}
//mouse is in the middle of the screen in the horizontal axis
else
{
//dont move in the horizontal axis
}
//mouse is in the far top of the screen
if (pos.y >= 0.9f)
{
cameraJoint.transform.Translate(Vector3.forward * pos.y * panSensitvity);
}
//mouse is in the far bottom of the screen
else if (pos.y <= 0.1f)
{
cameraJoint.transform.Translate(Vector3.back * panSensitvity);
}
//mouse is in the middle of the screen in the vertical axis
else
{
//dont move in the vertical axis
}
}
}
Answer by adriandevera · Jun 24, 2015 at 08:25 PM
Eh stupid question. The solution is below. Each for the four camera directions accordingly using transform.forward and transform.right.
if (pos.y >= 0.9f)
{ //move forward
directionNew = transform.forward;
directionNew.y = 0;
directionNew.Normalize();
transform.Translate(directionNew * panSensitvity * 50 * Time.deltaTime, Space.World);
}
Your answer
Follow this Question
Related Questions
Pan RTS camera controller without changing elevation/zoom 0 Answers
Error about Camera panning. 0 Answers
RTS Camera Zoom w/ Rotation 0 Answers
Camera rotates on wrong axis 2 Answers
Limiting Camera Movement 1 Answer