## How to find the transformation matrix for a plat knowing the old and new coordinates of 3 points on it ?

on 14 Jun 2019
Latest activity Commented on by Matt J

on 5 Nov 2019

### Matt J (view profile)

Hi All
How do I define the transformation matrix of a plate that moves in space , knowing the old and new coordinates of 3 points on the plate ? (assume a circular plate and reference coordinate system in the center of the plate )

on 14 Jun 2019
Any ideas ?

on 14 Jun 2019

Matt J

### Matt J (view profile)

on 21 Oct 2019
As mentioned in the help doc, the code only does extrinsic rotations and the order of the rotations is specified by the second input argument:
>> help rot2taitbryan
Calculates extrinsic Tait-Bryan angles from rotation matrix
ang = rot2taitbryan(R,order)
* `R`: Rotation matrix (3x3)
* `order`: Order of angles to return; any of:
{'XYZ','XZY','YXZ','YZX','ZYX','ZXY'} %case insensitive
* `ANG`: Angles (degrees) in specified order
NOTE: order of application of these rotations is right-to-left, both as
indicated by `order` and `ANG'. So, as an example,
>> R=Rz(30)*Ry(20)*Rx(60)
R =
0.8138 0.0065 0.5811
0.4698 0.5811 -0.6645
-0.3420 0.8138 0.4698
>> rot2taitbryan(R,'zyx')
ans =
30.0000 20.0000 60.0000

on 5 Nov 2019
Dear Matt : thank you for the above answer : but what if I don't know the order of rotation ?? this command asks for the order actually
second question : Does Absor.m give me the rotation matrix ? how can I get it ?
Matt J

### Matt J (view profile)

on 5 Nov 2019
but what if I don't know the order of rotation
The order is something you choose not something you determine. All 6 decompositions are equivalent - it just depends on your preference.
Does Absor.m give me the rotation matrix
Yes, it is in the regParams.R output.

### Jan (view profile)

on 27 Jun 2019

You can define the motion by a translation of the center of the 3 points and a rotation of the local coordinate system.
PointsA = [x1, y1, z1; ...
x2, y2, z2; ...
x3, y3, z3];
PointsB = ...
Translation = mean(PointsB, 1) - mean(PointsA, 1);
% For the local coordinate systems find an orthonormal tripod:
v1 = PointsA(1, :) - PointsA(2, :);
n1 = v1 ./ norm(v1);
v2 = PointsA(2, :) - PointsA(3, :);
n2 = v2 ./ norm(v2);
c2 = cross(n1, n2);
n12 = c2 ./ norm(c2);
CoorA = [n1, n12, cross(n1, n12)];
% The same for B...
Rotation = CoorA * CoorB'
Anotehr approach would be the "Helical Axis": Any motion can be defined by an axis and some rotation around it and translation along it. See http://www.kwon3d.com/theory/jkinem/helical.html

Show 1 older comment
Matt J

### Matt J (view profile)

on 27 Jun 2019
so you are saying that using absor and rcParams.R is not a good idea ?
Jan's approach will be sub-optimal if you have non-neglible measurement errors in A and B. Also, if you decide to use more than 3 points (for data redundancy), absor will better accommodate that case.
Jan

### Jan (view profile)

on 28 Jun 2019
@farzad: Of course I did not say that "using adsor is not a good idea". Especially if you have more than 3 points on a rigid body, an optimization appraoch is the correct approach.