This example shows how to do rotations and scaling in 3D using Symbolic Math Toolbox™ and matrices.

Define the parametric surface `x(u,v)`

, `y(u,v)`

, `z(u,v)`

as follows.

syms u v x = cos(u)*sin(v); y = sin(u)*sin(v); z = cos(v)*sin(v);

Plot the surface using `fsurf`

.

```
fsurf(x,y,z)
axis equal
```

Create 3-by-3 matrices `Rx`

, `Ry`

, and `Rz`

representing plane rotations by an angle `t`

about the `x`

-, `y`

-, and `z`

-axis, respectively.

```
syms t
Rx = [1 0 0; 0 cos(t) -sin(t); 0 sin(t) cos(t)]
Ry = [cos(t) 0 sin(t); 0 1 0; -sin(t) 0 cos(t)]
Rz = [cos(t) -sin(t) 0; sin(t) cos(t) 0; 0 0 1]
```

Rx = [ 1, 0, 0] [ 0, cos(t), -sin(t)] [ 0, sin(t), cos(t)] Ry = [ cos(t), 0, sin(t)] [ 0, 1, 0] [ -sin(t), 0, cos(t)] Rz = [ cos(t), -sin(t), 0] [ sin(t), cos(t), 0] [ 0, 0, 1]

First, rotate the surface about the `x`

-axis by 45 degrees counterclockwise.

xyzRx = Rx*[x;y;z]; Rx45 = subs(xyzRx, t, pi/4); fsurf(Rx45(1), Rx45(2), Rx45(3)) title('Rotating by \pi/4 about x, counterclockwise') axis equal

Rotate about the `z`

-axis by 90 degrees clockwise.

xyzRz = Rz*Rx45; Rx45Rz90 = subs(xyzRz, t, -pi/2); fsurf(Rx45Rz90(1), Rx45Rz90(2), Rx45Rz90(3)) title('Rotating by \pi/2 about z, clockwise') axis equal

Rotate about the `y`

-axis by 45 degrees clockwise.

xyzRy = Ry*Rx45Rz90; Rx45Rz90Ry45 = subs(xyzRy, t, -pi/4); fsurf(Rx45Rz90Ry45(1), Rx45Rz90Ry45(2), Rx45Rz90Ry45(3)) title('Rotating by \pi/4 about y, clockwise') axis equal

Scale the surface by the factor 3 along the `z`

-axis. You can multiply the expression for `z`

by 3, `z = 3*z`

. The more general approach is to create a scaling matrix, and then multiply the scaling matrix by the vector of coordinates.

S = [1 0 0; 0 1 0; 0 0 3]; xyzScaled = S*[x; y; z] fsurf(xyzScaled(1), xyzScaled(2), xyzScaled(3)) title('Scaling by 3 along z') axis equal

xyzScaled = cos(u)*sin(v) sin(u)*sin(v) 3*cos(v)*sin(v)

Rotate the scaled surface about the `x`

-, `y`

-, and `z`

-axis by 45 degrees clockwise, in order `z`

, then `y`

, then `x`

. The rotation matrix for this transformation is as follows.

R = Rx*Ry*Rz

R = [ cos(t)^2, -cos(t)*sin(t), sin(t)] [ cos(t)*sin(t)^2 + cos(t)*sin(t), cos(t)^2 - sin(t)^3, -cos(t)*sin(t)] [ sin(t)^2 - cos(t)^2*sin(t), cos(t)*sin(t)^2 + cos(t)*sin(t), cos(t)^2]

Use the rotation matrix to find the new coordinates.

xyzScaledRotated = R*xyzScaled; xyzSR45 = subs(xyzScaledRotated, t, -pi/4);

Plot the surface.

fsurf(xyzSR45(1), xyzSR45(2), xyzSR45(3)) title('Rotating by \pi/4 about x, y, and z, clockwise') axis equal

`R`

Rotation matrices are orthogonal matrices. Thus, the transpose of `R`

is also its inverse, and the determinant of `R`

is 1.

simplify(R.'*R) simplify(det(R))

ans = [ 1, 0, 0] [ 0, 1, 0] [ 0, 0, 1] ans = 1

Was this topic helpful?