Rotate 3D Shape so Specific Face is Normal to Given Vector

2 views (last 30 days)
I have a 3D shape made up of faces and vertices. I've been struggling to create code that will respond dynamically to rotate the shape so that the red face is 1. Normal to a given input vector; 2. The red face points in the direction of the vector.
For example, if the above photo is the starting state and I am given an input vector of [-1, 0, 0], I expect an output like this where the red face is: 1. Orthogonal to the vector; 2. The red face is closer to -x than the blue body.
My issue is that I can't figure out how to rotate the red square so that it is normal to the vector while also rotating the blue body to properly maintain the original shape. Enclosed is a copy of the shape, if you'd like to use that as a starting point. Any input is greatly appreciated!
  2 Comments
Estel
Estel on 6 Dec 2023
Rotate works for obvious vectors like [1,0,0] or [0,1,0], but not when given something like [0.707, -0.5, 1]. Or at least I haven't been able to figure out how to incorporate "rotate" + the front face being normal to the vector.

Sign in to comment.

Accepted Answer

Matt J
Matt J on 6 Dec 2023
Edited: Matt J on 6 Dec 2023
You can use this to compute the alpha and direction arguments needed for rotate.
function [alpha,direction]=vecrot(vstart,vend)
%Find rotation parameters that rotate one vector into coincidence with another about their
%common perpendicular axis.
%
% [alpha,direction]=vecrot(vstart,vend)
%
%IN:
%
% vstart: Initial normal vector
% vend: Final normal vector
%
%OUT:
%
% alpha: the rotation angle in degrees
% direction: the rotation axis
vstart=vstart(:)/norm(vstart);
vend=vend(:)/norm(vend);
direction=cross(vstart,vend);
b=vend.'*vstart;
alpha = atan2d(sqrt(1-b^2),b);
end
  4 Comments
Estel
Estel on 7 Dec 2023
Thank you! I have questions about the AxelRot:
I know I'd be using the form [XYZnew, R, t] = AxelRot(XYZold, deg, u, x0)
where XYZold = shape.vertices
u = cross(norm_original, norm_desired)
x0 = [0,0,0] %default
but I don't understand the deg value -- is it the same as the Alpha from the vecrot from above?
Matt J
Matt J on 7 Dec 2023
Edited: Matt J on 7 Dec 2023
You would do,
[alpha,direction]=vecrot(norm_original, norm_desired);
shape.vertices = AxelRot(shape.vertices.', alpha, direction, [0,0,0]).' ;

Sign in to comment.

More Answers (0)

Categories

Find more on Interactions, Camera Views, and Lighting in Help Center and File Exchange

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!