- Home /

# Move relative to objects rotation (C#)

How would you make an object move based on the objects rotation, I have this:

```
if(engineReady){
float tempPitch = pitch / 1.66666f;
tempPitch = (tempPitch - 30.0f) / 100.0f;
pitchDegrees = tempPitch;
heliSpeed = Mathf.Abs((tempPitch * 100.0f));
heli.transform.rotation = new Quaternion(pitchDegrees, heli.transform.rotation.y, heli.transform.rotation.z, heli.transform.rotation.w);
if(curHeight < 0.01){ heliSpeed = 0.0f; pitch = 50; }
if(pitch > 50){
heli.transform.position += Vector3.forward * (heliSpeed * Time.deltaTime);
} else {
heli.transform.position -= Vector3.forward * (heliSpeed * Time.deltaTime);
}
}
// ===== Yaw ======= //
if(Input.GetKey(KeyCode.Z)){
if(engineReady){
heli.transform.rotation = new Quaternion(heli.transform.rotation.x, heli.transform.rotation.y + 0.05f, heli.transform.rotation.z, heli.transform.rotation.w);
}
}
if(Input.GetKey(KeyCode.C)){
if(engineReady){
heli.transform.rotation = new Quaternion(heli.transform.rotation.x, heli.transform.rotation.y - 0.05f, heli.transform.rotation.z, heli.transform.rotation.w);
}
}
```

But .forward always follows the global Z axis.

**Answer** by clunk47
·
Oct 10, 2013 at 01:24 AM

Just filling in the OP with more info: `transform.right`

, `transform.forward`

and `transform.up`

are your object's local standard basis vectors (they are also `unit`

vectors, meaning they have a length of 1) (Btw if you're not familiar with standard basis vectors, they're actually the `i`

along the x and `j`

the y in a 2d coord Cartesian system). Those vectors will always rotate along with your object. Think of `transform.forward`

as a vector pointing out of your chest (or your mouth, if you wanna stick to the head), `transform.up`

out of your head and `transform.right`

out of your right ear :D

`Vector3.up`

, `Vector3.forward`

and `Vector3.right`

however work independently of your object - they're global to the world. Imagine standing in a room's corner such that at first both your local and the room's global axis are aligned, if you rotate, your local axis will rotate with you, but the room's won't :D

Just to add, if you want to use back, you would use -tranform.forward, left will be -transform.right, down will be -transform.up. You can get the same results with TransformDirection.

```
transform.TransformDirection(Vector3.forward);
transform.TransformDirection(Vector3.back);
//and so on...
```

Correct. It's also interesting to mention that the docs actually got it wrong. (which is typical)

Transforms direction from local space to world space.

It's actually the opposite, `TransformDirection`

transforms a Vector from global to local space. (They actually gave a correct example with `cameraRelativeRight`

, so they kinda said something but did otherwise) I just tested it out, create an empty scene, with a cube and move it with:

```
void Update()
{
void Update()
{
float h = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
float v = Input.GetAxis("Vertical") * speed * Time.deltaTime;
// _transform.localPosition += _transform.right * h;
// _transform.localPosition += _transform.forward * v;
Vector3 RIGHT = _transform.TransformDirection(Vector3.right);
Vector3 FORWARD = _transform.TransformDirection(Vector3.forward);
_transform.localPosition += RIGHT * h;
_transform.localPosition += FORWARD * v;
}
}
```

`RIGHT`

and `FORWARD`

**are exactly the same as** `transform.right`

and `transform.forward`

. Both will move the cube relative to its local axis.

And since that doc is blown, same is true for the opposite.

### Your answer

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.