Is there a way to obtain the matrix which rotates a plane to a new orientation, given its new normal vector
The following image depicts what is described
Is there a way to obtain the matrix which rotates a plane to a new orientation, given its new normal vector
The following image depicts what is described
Given the old normal
N
and the new normalN'
you can obtain the rotation by:Where
cross(x, y)
is the cross product of the vectorsx
andy
dot(x, y)
is the dot product of the vectorsx
andy
|x|
is the length of the vectorx
This will rotate the old normal onto the new one by the shortest way possible.
Notes
RotationAngle
will be in radians (if arccos returns radians as it does in most implementations)arccos
is the inverse of the cosine function. It is necessary becausedot(N, N') = |N| * |N'| * cos(RotationAngle)
whereRotationAngle
is the angle between the vectors.RotationAxis
is not normalized(|N| * |N'|)
becomes unnecessary (in fact ifN
is normalized you can leave out|N|
of the product and ifN'
is normalized then leave out|N'|
)N' = -N
(as there are infinite many shortest ways)How does it work?
The first observation is that the two normals will always define (at least) one plane in which both are lying. The smallest angle that parts them will be measured inside this plane too.
So the
RotationAxis
vector will be the normal of the plane that encloses bothN
andN'
and theRotationAngle
is the smallest angle between the two mentioned earlier.So by rotating around
RotationAxis
by theRotationAngle
the old normalN
is rotated inside the plane, on the shortest path towardsN'
.