Difference between the two quaternions

后端 未结 5 893
栀梦
栀梦 2020-12-28 16:59

Solved


I\'m making a 3D portal system in my engine (like Portal game). Each of the portals has its own orientation saved in a quaternion. To render the virtu

5条回答
  •  我在风中等你
    2020-12-28 17:56

    Quaternions work the following way: the local frame of reference is represented as the imaginary quaternion directions i,j,k. For instance, for an observer standing in the portal door 1 and looking in the direction of the arrow, direction i may represent the direction of the arrow, j is up and k=ij points to the right of the observer. In global coordinates represented by the quaternion q1, the axes in 3D coordinates are

    q1*(i,j,k)*q1^-1=q1*(i,j,k)*q1',
    

    where q' is the conjugate, and for unit quaternions, the conjugate is the inverse.

    Now the task is to find a unit quaternion q so that directions q*(i,j,k)*q' in local frame 1 expressed in global coordinates coincide with the rotated directions of frame 2 in global coordinates. From the sketch that means forwards becomes backwards and left becomes right, that is

    q1*q*(i,j,k)*q'*q1'=q2*(-i,j,-k)*q2'
                       =q2*j*(i,j,k)*j'*q2'
    

    which is readily achieved by equating

    q1*q=q2*j or q=q1'*q2*j.
    

    But details may be different, mainly that another axis may represent the direction "up" instead of j.


    If the global system of the sketch is from the bottom, so that global-i points forward in the vertical direction, global-j up and global-k to the right, then local1-(i,j,k) is global-(-i,j,-k), giving

    q1=j. 
    

    local2-(i,j,k) is global-(-k,j,i) which can be realized by

    q2=sqrt(0.5)*(1+j), 
    

    since

    (1+j)*i*(1-j)=i*(1-j)^2=-2*i*j=-2*k and 
    (1+j)*k*(1-j)=(1+j)^2*k= 2*j*k= 2*i
    

    Comparing this to the actual values in your implementation will indicate how the assignment of axes and quaternion directions has to be changed.

提交回复
热议问题