Greetings All
Thanks to James and Chas for helping me get this far btw Chas the language I wrote it in is in matlab. I tried to respond to your post but wasn't able to do it..I guess the gremlins are acting up on my computer. Also since I'm only able to post one link I'll post a link with to the text file which will have the animation link in it. Here's a link to the code as a text file / animation / other links in case the format gets messed up --> http://db.tt/4eYMMz7
I have the output of my quaternions in the format
[w x y z]. My first vector point is [1x 0y 0z]
and the arbitrary point I want to rotate about is
[0.5x 0y 0z]. The thing is when I plot the quaternion
values for the x and y values they don't rotate about
the origin [0x 0y 0z] or the arbitrary axis origin of
[0.5x 0y 0z] can someone tell me
what I'm doing wrong? I checked my axis-angle to
quaternion conversion by checking it with the
spincalcvi.m file located on matlab's file exchange. his
format was in [x y z w] and mine is in [w x y z]
see above link
I used the Multiplication formula for two quaternions from this site see above link and I tested it using this online quaternion calculator and it matches up see above link When I step through theta I don't get the circular rotations.
Ps: Yes I do want to plot points in 3D eventually but I'm trying to understand/get the 2D portion to work first. By first getting a point to rotate around the origin [0x 0y 0z] and a point to rotate around an arbitrary axis origin of [0.5x 0y 0z]
See code below Here's a link to animation/video of plot showing values as theta changes -->see above link
Here's a link to the code as a text file in case the format gets messed up --> see above link
%Quaterion rotation - around orgin and arbitrary axis
%quaterions using Format [w xi yj zk] or [w x y z]
for ii=1:10:720
p1=[1,0,0] %[x y z] %point to rotate
%q=zeros(1,4);
theta=0+ii;
%normalize -p1- angle axis to pointing vector prior to quaternion construction
p1norm=p1(1:3)./norm(p1(1:3)) %norm is x^2+y^2+z^2
%Create Quaternion from p1norm
qp1 = [cosd(theta/2) sind(theta/2)*p1norm] % format [w, xi, yj, zk]
%normalize quaternion qp1
qp1mag=sqrt(qp1(1,1)^2+qp1(1,2)^2+qp1(1,3)^2+qp1(1,4)^2)
qp1norm=qp1(1:4)./qp1mag
%Arbitrary axis section------------------------
rp2=[.5 0 0] %[x y z]
%normalize -p2- angle axis to pointing vector prior to quaternion construction
rp2norm=rp2(1:3)./norm(rp2(1:3))
%Create Quaternion from p2norm
qrp2 = [cosd(theta/2) sind(theta/2)*rp2norm] % format [w, xi, yj, zk]
%normalize quaternion qrp2
qrp2mag=sqrt(qrp2(1,1)^2+qrp2(1,2)^2+qrp2(1,3)^2+qrp2(1,4)^2)
qrp2norm=qrp2(1:4)./qrp2mag
%Conjugate of qp2norm
qrp2normconj=qrp2norm.*[1 -1 -1 -1] % [w x y z] format
%1st Multiplication (qrp2norm*qp1norm) full formula q*P*q' or qrp2norm*qp1norm*qrp2normconj
q1w=qrp2norm(1,1);q1x=qrp2norm(1,2);q1y=qrp2norm(1,3);q1z=qrp2norm(1,4); %rotated vector
p1w=qp1norm(1,1);p1x=qp1norm(1,2);p1y=qp1norm(1,3);p1z=qp1norm(1,4); %part being rotataed
qqw=(q1w*p1w - q1x*p1x - q1y*p1y - q1z*p1z)
qqx=(q1w*p1x + q1x*p1w + q1y*p1z - q1z*p1y)
qqy=(q1w*p1y - q1x*p1z + q1y*p1w + q1z*p1x)
qqz=(q1w*p1z + q1x*p1y - q1y*p1x + q1z*p1w)
qm1=[qqw qqx qqy qqz]
%2nd Multiplication (qm1*qrp2normconj) full formula q*P*q' or qrp2norm*qp1norm*qrp2normconj
q1w=qm1(1,1);q1x=qm1(1,2);q1y=qm1(1,3);q1z=qm1(1,4); %rotated vector
p1w=qrp2normconj(1,1);p1x=qrp2normconj(1,2);p1y=qrp2normconj(1,3);p1z=qrp2normconj(1,4); %part being rotataed
qqw=(q1w*p1w - q1x*p1x - q1y*p1y - q1z*p1z)
qqx=(q1w*p1x + q1x*p1w + q1y*p1z - q1z*p1y)
qqy=(q1w*p1y - q1x*p1z + q1y*p1w + q1z*p1x)
qqz=(q1w*p1z + q1x*p1y - q1y*p1x + q1z*p1w)
qm2=[qqw qqx qqy qqz]
%plotting section
plot(0,0,'b',qp1norm(1,2),qp1norm(1,3),'-ro',qm2(1,2),qm2(1,3),'-bx')
grid on
hold on
legend('not used','ROT around origin','ROT around arbitrary axis');
title( { 'Quaternion Plot problems', ...
['theta = ', num2str(theta),' degrees'], ...
['Rot around orgin [w x y z] = ', num2str(qp1norm)], ...
['Rot around arbitrary axis [w x y z] = ',num2str(qm2) ] } )
axis([-1.5 1.5 -1.5 1.5 -1.5 1.5])
view([26 64]);
xlabel('x axis');ylabel('y axis');zlabel('z axis');
pause(.5)
M(ii)=getframe;
end
But I'm at a lost as to why I don't get a circular rotation