I am trying to rotate a 3D object (StrokeCube) to align its Y axis with a line segment defined by two points (two Spheres). Is there an easy way to do this using say CreateLookAtRH, or similar? The Help and https://docwiki.embarcadero.com/ does not describe this and similar methods and I cannot find any example code. Having searched and read for a few days/nights, I've gone down the scary path of rotation matrices etc.
This is the process I have so far:
Create Vector1 as the AbsoluteUp (TVector3D) of the StrokeCube.
Create Vector2 that runs from Sphere1 to Sphere2 (subtracting them), also TVector3D.
Normalise the two vectors.
Create RotationAxis by calculating their cross product (RotationAxis perpendicular to both).
Normalise RotationAxis.
Calculate Angle between Vector1 and Vector2 as arccos of their dot product divided by (Vector1Length*Vector2Length).
R := mat.CreateRotation() with the normalised RotationAxis and the Angle.
Getting the X Y Z rotations for the StrokeCube out of R does not give correct results. I've tried many variants, e.g. https://learnopencv.com/rotation-matrix-to-euler-angles/ and https://uk.mathworks.com/matlabcentral/answers/493771-euler-3d-rotation-between-two-vectors.
My questions:
Is there an easy way to align a 3D object (StrokeCube) to a line defined by two points?
If not, then is my processing correct so far?
What matches the X Y Z rotations of an FMX 3D object? One of the Euler sequences, Quaternions, or something else? How do I extract the necessary rotations from the rotation matrix?
Thanks for your help.
Update: I've tried these but they don't rotate the Segment (StrokeCube):
Segment.AbsoluteMatrix.CreateRotation(Vector3DP1P2n, Angle);
Segment.AbsoluteMatrix.CreateLookAtRH(TPoint3D.Create(M1.Position.X,M1.Position.Y,M1.Position.Z), TPoint3D.Create(M2.Position.X,M2.Position.Y,M2.Position.Z), TPoint3D.Create(0,0,0));
Segment.LocalMatrix.CreateRotation(Vector3DP1P2n, Angle);
Segment.LocalMatrix.CreateLookAtRH(TPoint3D.Create(M1.Position.X, M1.Position.Y, M1.Position.Z), TPoint3D.Create(M2.Position.X,M2.Position.Y,M2.Position.Z), TPoint3D.Create(0,0,0));