Sign in to follow this  

rotating in local object space

This topic is 2634 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I need to rotate in the local object space along x or y axis. I have an arbitrary axis and an angle. The Matrix struct has a RotationQuaternion method but it rotates along the axis and I want to rotate along x or y axis depending on user input.

In short, I think I want to implement Yaw,Pitch,Roll in object space instead of world space.

The Rotation methods in the Matrix stuct also rotate in world space. Presently I have this, it rotates fine along z axis.


view = Matrix.RotationQuaternion(Quaternion.RotationAxis(axis, MathHelper.ToRadians(cameraRotation))) * LookAtMatrix;



So i have an axis vector and I would like to rotate it either in X or Y axis depending on user input.

[Edited by - fkhan on September 28, 2010 9:22:30 PM]

Share this post


Link to post
Share on other sites
Quote:
Original post by fkhan
The Rotation methods in the Matrix stuct also rotate in world space. Presently I have this, it rotates fine along z axis.
The rotation methods don't rotate in world space, or in local space; they simply build rotation matrices, which you can use as you please.

You can effect local-space rotations using a yaw-pitch-roll matrix by performing your matrix multiplications in the appropriate order. Just create a YPR matrix with the current x and y rotation delta values as input (you can skip z), and then multiply this with your orientation matrix either on the right or on the left, depending on what convention you're using. (Also, don't forget to orthogonalize/normalize occasionally, or you'll be likely to run into problems with accumulated numerical error.)

Share this post


Link to post
Share on other sites
The rotations are still off the axis of the model. I am also scaling my world matrix when loading models.


public void UpdateCamera()
{
Matrix m_lookat = Matrix.LookAtRH(cameraPosition, cameraTarget, up_axis);

Vector3 axis = (sceneBoundingBox.Maximum + sceneBoundingBox.Minimum) / 2f;


Matrix m_translation = Matrix.Translation(axis);
Matrix m_ypr = Matrix.RotationYawPitchRoll(cameraArc, cameraRotation, 0);

Matrix m_transformation = m_ypr * m_translation;

view = world;
view.Invert();

view *= m_transformation * m_lookat;

proj = Matrix.PerspectiveFovRH(MathHelper.ToRadians(FOV), 1.0f, 1.0f, 1000.0f);
}


Share this post


Link to post
Share on other sites
I can't really tell what's going on in your code (at least not without digging into it further), but it looks somewhat suspect to me. It looks like you're using the term 'axis' to refer to a point, and it also looks like you're incorporating an inverse view transform into the combined transform twice. Also, it's not clear from your code how the various transforms you're constructing are actually being used.

Maybe what you're doing makes sense and I'm just not getting it, but otherwise, I think I'd recommend backing up a bit and doing something simpler, such as getting an object with a camera attached simply to move around the scene successfully (if you haven't already done that).

If that's not helpful, perhaps you could post some more of your code and/or describe your problem in more detail.

Share this post


Link to post
Share on other sites

Well I was able to rotate in object space by. But now If the model is not placed near the origin, it simply does not show up. The cameraTarget is the center of boundingbox of all models in scene. My world matrix is scaled such that it fits the viewing frustum. Still the models do not show in the view.
If i reset the model transformation matrices m values(41,42,43) to zero then it shows up just fine.

Here's a snippet from updateCamera()


Matrix rotationX = Matrix.RotationX((MathHelper.ToRadians(cameraArc)));
Matrix rotationY = Matrix.RotationY((MathHelper.ToRadians(cameraRotation)));
Matrix rotation = rotationX * rotationY;

Matrix translation = Matrix.Translation(cameraTarget);
Matrix transformation = rotation * translation;

transformation = Matrix.Invert(transformation);

Matrix m_lookat = Matrix.LookAtRH(cameraPosition, cameraTarget, up_axis);
view = transformation* m_lookat;
proj = Matrix.PerspectiveFovRH(MathHelper.ToRadians(FOV), 1.0f, nearclip, farclip);


Share this post


Link to post
Share on other sites

This topic is 2634 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this