- Home /
Moving forward in world space with rotation.
Hi, I have been trying to make a RTS like camera and so far I have been stuck with a problem. I have managed to get the camera to rotate, zoom in and out and pan left and right but when I try to pan forward I get a problem because it works fine if I dont get rotate the camera but if I do it does not take the rotation into account. I know it is something to do with world space and local space and have researched these topics but I am still stuck because if I move forward in local space it does include rotation but does not scrol along the Z axis instead goes forward into the ground because I have the camera on a angle but if I use world space it does not include rotation. My script so far is down below.Finally I have tried using transform.TransformDirection but wasn't sure how to properly used it. I also have a diagram to help illustrate the problem : 
 using UnityEngine;
 using System.Collections;
 
 public class cameraControls : MonoBehaviour {
 
     public float scrollSpeed, cameraSpeed;
     public float pixelEdge = 10f;
     private float mouseX,mouseY;
     private bool isZooming, isRotating, isTranslation;
     private bool controlsOn;
 
     public Vector3 movement = new Vector3(0,0,0);
 
     // Use this for initialization
     void Start () {
         controlsOn = false;
     }
     
     // Update is called once per frame
     void Update () {
         if(Input.GetKeyDown(KeyCode.C)){
             controlsOn = !controlsOn;
         }
     
     }
 
     void HandleMouseRotation(){
         float easeFactor = 10f;
         if(Input.GetMouseButton(1) && Input.GetKey(KeyCode.LeftControl)){
             if(Input.mousePosition.x != mouseX){
                 float cameraRotationY = (Input.mousePosition.x - mouseX) * easeFactor * Time.deltaTime;
                 this.transform.Rotate(0,cameraRotationY,0,Space.World);
             }
         }
 
     }
 
     void Zoom(){
         //Zoom
         if(Input.GetAxis("Mouse ScrollWheel") > 0){
             //transform.Translate(Vector3.forward * Time.deltaTime * scrollSpeed);
             Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView,Camera.main.fieldOfView - scrollSpeed,Time.deltaTime);
         }
         if(Input.GetAxis("Mouse ScrollWheel") < 0){
             //transform.Translate(Vector3.forward * Time.deltaTime * scrollSpeed);
             Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView,Camera.main.fieldOfView + scrollSpeed,Time.deltaTime);
         }
     }
 
     void cameraTranslation(){
         //Translate    
         if(Input.mousePosition.x > Screen.width - pixelEdge){
             transform.Translate(Vector3.right * Time.deltaTime * cameraSpeed,Space.Self);
         }
         
         if(Input.mousePosition.x < 0 + pixelEdge){
             transform.Translate(Vector3.left * Time.deltaTime * cameraSpeed,Space.Self);
         }
         
         if(Input.mousePosition.y > Screen.height - pixelEdge){
             transform.Translate(Vector3.forward * Time.deltaTime * cameraSpeed,Space.World);
 
 
         }
         
         if(Input.mousePosition.y < 0 + pixelEdge){
             transform.Translate(-Vector3.forward * Time.deltaTime * cameraSpeed,Space.World);            
         }
 
     }
 
     void LateUpdate(){
         if(controlsOn == true){
             HandleMouseRotation();
             Zoom();
             cameraTranslation();
         }
         mouseX = Input.mousePosition.x;
         mouseY = Input.mousePosition.y;
 
     }
 }
 
Answer by BigRoy · Jan 04, 2014 at 09:50 PM
Try this:
 Vector direction = transform.forward;
 direction.y = 0;
 direction.Normalize();
 transform.Translate(direction * Time.deltaTime * cameraSpeed, Space.World);
Note that this will not work properly if the camera is aiming (perfectly) straight down or up as that would result in a zero vector.
You could also do it with Quaternion.LookRotation using the scene up (Y-axis) as forward direction and the camera forward as it's up-axis. This way it's never at an angle and only rotating around the Y-axis.
 Quaternion quat = Quaternion.LookRotation(Vector3.up, transform.forward);
Though that quaternion rotation makes the Z-axis point scene up and then tries to aim the Y-axis to the camera's forward (so without an angle). Not that useful you would think, though this means that if we apply this rotation to a Vector3.up it will result in the camera's forward without the angle.
So in theory (at least in my head) using the quaternion from before we can do:
 Vector3 direction = Vector3.up * quat;
 transform.Translate(direction * Time.deltaTime * cameraSpeed, Space.World);
Out of the top of my head so sorry for any errors. Hope this helps. :)
If this worked make sure to accept the answer, that way others who got here by googling will know whether this is an actual solution. :)
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                