Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    [OLD]QML/Qt (C++) Rotation using quaternion

    General and Desktop
    1
    1
    1025
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Maciej Smith last edited by

      Hello
      I've got a quaternion and I need to apply it in QML/Qt. What I have tried so far:

      for the reference: @quaternion = {0.826351,-0.405726,-0.353097,0.166890}@

      and I get Yaw, Pitch, Roll with (java):

         @ public static double getPitch(Quat4d q)
      

      {
      return Math.atan2(2*(q.yq.z + q.wq.x), q.wq.w - q.xq.x -q.yq.y +q.zq.z);
      }

      public static double getYaw(Quat4d q)
      {
      return Math.asin(-2*(q.xq.z - q.wq.y));
      }

      public static double getRoll(Quat4d q)
      {
      return Math.atan2(2*(q.xq.y + q.wq.z), q.wq.w +q.xq.x - q.yq.y - q.zq.z);
      }@

      So I try QML:

      @Item {
      id: rectangle1
      width: 300
      height: 300
      scale: 1
      anchors.centerIn:parent;

          property double angleX: -61.87454134010583
          property double angleY: -26.624468050434572
          property double angleZ: 38.97955600504172
          property int originX: width/2
          property int originY: height/2
      
          }
          transform: Rotation {
              origin.x: rectangle1.originX;
              origin.y: rectangle1.originY;
              axis { x: 0; y: 0; z: -1 }
              angle: rectangle1.angleZ }
      
          Item {
                id: rectangle2
                width: 300
                height: 300
                scale: 1
                anchors.centerIn:parent;
      
                transform: Rotation {
                    origin.x: rectangle1.originX;
                    origin.y: rectangle1.originY;
                    axis { x: 0; y: -1; z: 0 }
                    angle: rectangle1.angleY }
      
                Rectangle {
                      id: rectangle3
                      width: 300
                      height: 300
                      color: "#ffffff"
                      scale: 1
                      opacity: 0.70
                      anchors.centerIn:parent;
      
                      focus: true
      
                      transform: Rotation {
                          origin.x: rectangle1.originX;
                          origin.y: rectangle1.originY;
                          axis { x: -1; y: 0; z: 0 }
                          angle: rectangle1.angleX }
                }
          }
      }@
      

      I used 2 Items and 1 Rectangle to get the rotation right on the canvases, but the sata doesn't seem to fit.
      So I thought maybe I just don't know jack about Quaternions and I'm getting the wrong data out of it, so I have tried Qt and here I am right now - I found the beginNativePainting() in QPainter, but I don't fully understand it, and the example in the documentation doesn't even work.

      So I have a transformation matrix that is 4x4 from OpenGL and I try:

      @void Dialog::paintEvent(QPaintEvent *e)
      {
      QPainter painter(this);
      painter.fillRect(50,50,100,100,Qt::red);
      painter.beginNativePainting();

      double modelview_matrix[16]= {-0.874483, 1.527267, -2.199979, -0.760204, -0.576585, -0.299399, 0.000000, -0.078945, -0.375442, 0.923478, 0.000000, 0.644870, -0.725668, -0.239894, 0.000000, -0.095929};
      
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      glLoadMatrixd(modelview_matrix);
      
      glColor3f(1,0.4,0.4);
      glPushMatrix();
      glPopMatrix();
      
      painter.endNativePainting();
      

      }@

      And I tried using the quaternion itself (which is very desired, small data etc.)

      @void Dialog::paintEvent(QPaintEvent *e)
      {
      QPainter painter(this);
      painter.fillRect(50,50,100,100,Qt::red);
      painter.beginNativePainting();

      QMatrix4x4 mat;
      mat.setToIdentity();
      const QQuaternion *q = new QQuaternion(0.826351,-0.405726,-0.353097,0.166890);
      mat.rotate(q->normalized());
      
      painter.endNativePainting();
      

      }@

      So I guess my question would be how does the QPainter::beginNativePainting() work, how do I make it work, because as I said even the example from http://harmattan-dev.nokia.com/docs/library/html/qt4/qpainter.html#beginNativePainting doesn't seem to work, and in my case nothing happens in both examples. Do I have to draw something inside the begin - end native painting and it takes an effect on that or should it work with the
      @painter.fillRect(50,50,100,100,Qt::red);@

      declared earlier?

      Another question I have is about the QMatrix4x4, I don't fully understand how it Identifies itself with setToIdentity, what does it identify itself with in my example even? Does it identify itself with the QPainter object?

      1 Reply Last reply Reply Quote 0
      • First post
        Last post