[vtkusers] Bug in vtkQuaternion
Mengda Wu
wumengda at gmail.com
Fri Dec 6 00:51:56 EST 2013
BTW, I think the slerp function in vtkQuaternion also has issues:
What if I would like to interpolate an identity quaternion (no rotation)
with an slightly non-identity (a slight rotation). Then axis0=(0,0,0) and
e.g. axis1=(1,0,0), will the result be wrong?
On Thu, Dec 5, 2013 at 5:30 PM, David Gobbi <david.gobbi at gmail.com> wrote:
> The unit quaternion is qw,qx,qy,qz = (1,0,0,0). But (qx,qy,qz) is not
> the "axis". The axis is what you get when you divide (qx,qy,qz) by
> sin(theta/2).
>
> An identity quaternion is (1, 0, 0, 0), but it is wrong to say that
> for the identity quaternion the axis is (0,0,0). The axis of an
> identity quaternion could be anything, because the axis of an identity
> quaternion is (0,0,0) / sin(0/2), hence "undefined".
>
>
>
> On Thu, Dec 5, 2013 at 3:05 PM, Mengda Wu <wumengda at gmail.com> wrote:
> > OK. I am a little confused.
> > For an identity quaternion. The code is now
> > template<typename T> void vtkQuaternion<T>::ToIdentity()
> >
> > {
> > this->Set(1.0, 0.0 ,0.0, 0.0);
> > }
> >
> > which means the axis is (0,0,0). Isn't (0,0,0) a good way to represent
> > undefined axis?
> > So how to represent an identity matrix (no rotation) with a quaternion?
> > Should it be (1, 0, 0, 0) or (0, 0, 0, 0)?
> >
> >
> >
> >
> > On Thu, Dec 5, 2013 at 4:30 PM, David Gobbi <david.gobbi at gmail.com>
> wrote:
> >>
> >> You say that for the identity quaternion the axis is (0,0,0) but that
> >> is not really true. For the identity quaternion, the axis is
> >> undefined.
> >>
> >> If you call SetRotationAngleAndAxis(1,0,0,0), then you are passing
> >> invalid parameters to the method. To get the identity quaternion, you
> >> need to set the angle to zero, not to one.
> >>
> >> I agree that the code should have an extra check, but it should be the
> >> opposite of what you have in your sample code. It should give the
> >> identity quaternion if the angle is zero:
> >>
> >> else if ( angle == 0.0 )
> >> {
> >> this->Set(1.0, 0.0, 0.0, 0.0);
> >> }
> >> else
> >> {
> >> this->Set(0.0, 0.0, 0.0, 0.0);
> >> }
> >>
> >> David
> >>
> >> On Thu, Dec 5, 2013 at 2:14 PM, Mengda Wu <wumengda at gmail.com> wrote:
> >> > Thanks a lot for your reply.
> >> >
> >> > But for the identity quaternion (1, 0, 0, 0), the axis is indeed
> >> > (0,0,0).
> >> > This is related to GetRotationAngleAndAxis, that function will give a
> >> > nozero
> >> > angle and axis (0,0,0) for the identity quaternion.
> >> > Then if I plug this result to SetRotationAngleAndAxis, I will get a
> >> > quaternion (0,0,0,0), which does not make sense.
> >> > Then if I use ToMatrix3x3 on the quaternion (0,0,0,0), which will be
> >> > wrong.
> >> >
> >> > So I suggest to change
> >> >
> >> > template<typename T> void
> >> > vtkQuaternion<T>::SetRotationAngleAndAxis (const T& angle,
> >> > const T& x,
> >> > const T& y,
> >> > const T& z)
> >> > {
> >> > T axisNorm = x*x + y*y + z*z;
> >> > if (axisNorm != 0.0)
> >> > {
> >> > T w = cos(angle / 2.0);
> >> > this->SetW(w);
> >> >
> >> > T f = sin( angle / 2.0);
> >> > this->SetX((x / axisNorm) * f);
> >> > this->SetY((y / axisNorm) * f);
> >> > this->SetZ((z / axisNorm) * f);
> >> > }
> >> > else if ( angle != 0.0 )
> >> > {
> >> > this->Set(1.0, 0.0, 0.0, 0.0);
> >> > }
> >> > else
> >> > {
> >> > this->Set(0.0, 0.0, 0.0, 0.0);
> >> > }
> >> > }
> >> >
> >> > How is that?
> >> >
> >> > Mengda
> >> >
> >> >
> >> > On Thu, Dec 5, 2013 at 4:04 PM, David Gobbi <david.gobbi at gmail.com>
> >> > wrote:
> >> >>
> >> >> Hi Mengda,
> >> >>
> >> >> The SetRotationAngleAndAxis(angle, x, y, z) method does not
> >> >> directly set the quaternion elements, for that you would use the
> >> >> method Set(w, x, y, z).
> >> >>
> >> >> For SetRotationAngleAndAxis, it does not make sense to specify
> >> >> xyz=(0,0,0) with a nonzero angle because (0,0,0) is not a valid axis.
> >> >>
> >> >> David
> >> >>
> >> >> On Thu, Dec 5, 2013 at 1:53 PM, Mengda Wu <wumengda at gmail.com>
> wrote:
> >> >> > Hi all,
> >> >> >
> >> >> > I think there is a bug in
> >> >> > vtkQuaternion<T>::SetRotationAngleAndAxis.
> >> >> > What
> >> >> > if I want to
> >> >> > set angle=1.0 and xyz=(0, 0, 0)? I need an identity matrix from
> this
> >> >> > quaternion. Should it call this->Set(1.0, 0.0, 0.0, 0.0) instead of
> >> >> > this->Set(0.0, 0.0, 0.0, 0.0) in this case?
> >> >> >
> >> >> > Thanks,
> >> >> > Mengda
> >> >> >
> >> >> >
> >> >> >
> >> >> > The code is pasted here:
> >> >> >
> >> >> > template<typename T> void
> >> >> > vtkQuaternion<T>::SetRotationAngleAndAxis (const T& angle,
> >> >> > const T& x,
> >> >> > const T& y,
> >> >> > const T& z)
> >> >> > {
> >> >> > T axisNorm = x*x + y*y + z*z;
> >> >> > if (axisNorm != 0.0)
> >> >> > {
> >> >> > T w = cos(angle / 2.0);
> >> >> > this->SetW(w);
> >> >> >
> >> >> > T f = sin( angle / 2.0);
> >> >> > this->SetX((x / axisNorm) * f);
> >> >> > this->SetY((y / axisNorm) * f);
> >> >> > this->SetZ((z / axisNorm) * f);
> >> >> > }
> >> >> > else
> >> >> > {
> >> >> > this->Set(0.0, 0.0, 0.0, 0.0);
> >> >> > }
> >> >> > }
> >> >
> >> >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20131206/64da4505/attachment.htm>
More information about the vtkusers
mailing list