How to rotate entire 3d data with x,y,z values along a particular axis (say x axis)?

I need to rotate my 3d dataset defined by x,y,z coordinate along x axis at a specified angle (say 45 degree). This kinds of rotations are often needed when processing scanner and LIDAR data. MATLAB can do exactly what I want to do, but in graphic objects only i.e. using rotate(h,direction,alpha). However, this doesn't change the source data. I need to get the new rotated data, how can I retrieve the new rotated x,y,z data? Or, could you please suggest how to calculate in MATLAB?
Thank you,

 Accepted Answer

Let X,Y,Z be arrays of the rotated points in the dataset. For rotation along the x-axis:
X = x;
Y = y*cos(p)-z*sin(p);
Z = y*sin(p)+z*cos(p);
For rotation p radians in the direction from the y-axis toward the z-axis, that is, in accordance with the "right-hand rule" about the positive x-axis.

2 Comments

Thanks, exactly what I was looking for. It would be great, if you can provide similar formula for rotating around y and z axis as well.
Here are the transformations for all three axes.
Around X-axis:
X = x;
Y = y*cos(theta) - z*sin(theta);
Z = y*sin(theta) + z*cos(theta);
Around Y-axis:
X = x*cos(theta) + z*sin(theta);
Y = y;
Z = z*cos(theta) - x*sin(theta);
Around Z-axis:
X = x*cos(theta) - y*sin(theta);
Y = x*sin(theta) + y*cos(theta);
Z = z;

Sign in to comment.

More Answers (1)

7 Comments

It would be great, if you can provide similar formula for rotating around y and z axis as well.
XYZ=[X(:),Y(:),Z(:)].';
XYZnew = AxelRot(XYZ, angle, [0 1 0]); %rotation in y
XYZnew = AxelRot(XYZ, angle, [0 0 1]); %rotation in z
Hi Matt, thank you very much for this, but I get the following error when I run this,
XYZ=[VarName1(:),VarName2(:),VarName3(:)];
XYZnew = AxelRot(XYZ, angle, [1 0 0]); %rotation in x.
I didn't transpose as you had done, because VarName1, VarName2, and VarName3 are already column vectors (of size N*1) in my case.
error:
Error using -
Matrix dimensions must agree.
Error in AxelRot (line 85)
AxisShift=x0-(x0.'*u).*u;
What could be the error?
XYZ is expected to be 3xN. Without the transpose, it will be Nx3.
Hi Matt, apparently, that is not the issue. I transposed the matrix but still get the same error:
XYZ=[VarName1,VarName2,VarName3].'; XYZnew = AxelRot(XYZ, angle, [1 0 0]); %rotation in x.
Error using - Matrix dimensions must agree.
Error in AxelRot (line 85) AxisShift=x0-(x0.'*u).*u;
If you attach your VarName1,2,3 data in a .mat file, I'll take a look at it.
Sorry, never mind. The syntax needs to be
XYZnew = AxelRot(XYZ, angle, [1 0 0],[]);

Sign in to comment.

Tags

Asked:

on 30 Mar 2014

Edited:

on 26 Sep 2017

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!