Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Qt3d points and lines
Forum Updated to NodeBB v4.3 + New Features

Qt3d points and lines

Scheduled Pinned Locked Moved Unsolved General and Desktop
qt3ddraw lines
18 Posts 9 Posters 11.2k Views 4 Watching
  • 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.
  • K kshegunov
    20 Feb 2017, 23:27

    Look at this thread's example code. It should be enough to get you started.

    G Offline
    G Offline
    guy incognito
    wrote on 21 Feb 2017, 10:40 last edited by guy incognito
    #9

    @kshegunov

    Thanks, the x,y and z axis look exactly like what I want. The only problem is, that QTransform for the QCylincerMesh is pretty unconvenient (as far as I see).

    @chris2401

    Take a look at this code. I used it to get an idea how to create custom meshes. You can adapt it to make it draw lines instead of TetraHedrons pretty easily.

    1 Reply Last reply
    0
    • S Offline
      S Offline
      Steve Brunton
      wrote on 16 Apr 2017, 21:08 last edited by
      #10

      This has been my PITA also. I have just found an example in qt5.6 that was dropped in all further releases but it provides a working set of code that creates a custom entity with your own set of vectors / normals / colors. If you look at this in code.qt.io

      http://code.qt.io/cgit/qt/qt3d.git/tree/examples/qt3d/custom-mesh-cpp?h=5.6

      I wish Qt (KDAB is actually doing the Qt3D stuff) would spend a bit of time and put together some documented examples at the level of what their qGraphicsItem module was. Or at a minimum put some details to the qt function documentation. It is very frustrating to try and figure things out when there is no documentation or good functional examples on the objects we are supposed to use.

      M 1 Reply Last reply 30 Nov 2017, 02:54
      1
      • S Steve Brunton
        16 Apr 2017, 21:08

        This has been my PITA also. I have just found an example in qt5.6 that was dropped in all further releases but it provides a working set of code that creates a custom entity with your own set of vectors / normals / colors. If you look at this in code.qt.io

        http://code.qt.io/cgit/qt/qt3d.git/tree/examples/qt3d/custom-mesh-cpp?h=5.6

        I wish Qt (KDAB is actually doing the Qt3D stuff) would spend a bit of time and put together some documented examples at the level of what their qGraphicsItem module was. Or at a minimum put some details to the qt function documentation. It is very frustrating to try and figure things out when there is no documentation or good functional examples on the objects we are supposed to use.

        M Offline
        M Offline
        MatPaul
        wrote on 30 Nov 2017, 02:54 last edited by
        #11

        @Steve-Brunton
        I am trying to draw a line in qml. I used the custom_mesh_qml for checking how it works in qt 5.9. but I encountered an error in the main.cpp file in the line 'engine.aspectEngine()->setData(data);' like setData not found. Can you help me on this. Thank you.

        J 1 Reply Last reply 30 Nov 2017, 05:31
        0
        • M MatPaul
          30 Nov 2017, 02:54

          @Steve-Brunton
          I am trying to draw a line in qml. I used the custom_mesh_qml for checking how it works in qt 5.9. but I encountered an error in the main.cpp file in the line 'engine.aspectEngine()->setData(data);' like setData not found. Can you help me on this. Thank you.

          J Offline
          J Offline
          jsulm
          Lifetime Qt Champion
          wrote on 30 Nov 2017, 05:31 last edited by
          #12

          @MatPaul Why don't you post the actual error message?
          I guess the compiler tells you that there is no such method: setData.
          I guess aspectEngine() returns https://doc.qt.io/qt-5/qt3dcore-quick-qqmlaspectengine.html and QQmlAspectEngine does not have setData() method.

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          M 1 Reply Last reply 30 Nov 2017, 06:17
          0
          • J jsulm
            30 Nov 2017, 05:31

            @MatPaul Why don't you post the actual error message?
            I guess the compiler tells you that there is no such method: setData.
            I guess aspectEngine() returns https://doc.qt.io/qt-5/qt3dcore-quick-qqmlaspectengine.html and QQmlAspectEngine does not have setData() method.

            M Offline
            M Offline
            MatPaul
            wrote on 30 Nov 2017, 06:17 last edited by
            #13

            @jsulm
            I had used the code from this link
            http://code.qt.io/cgit/qt/qt3d.git/tree/examples/qt3d/custom-mesh-qml?h=5.6

            And run that on qt5.9
            I think the setData() functionality is removed in 5.9. is there a new function which does the similar behaviour

            1 Reply Last reply
            0
            • A Offline
              A Offline
              AlanWasHere
              wrote on 5 Jul 2018, 12:55 last edited by
              #14

              Try this piece of code to draw lines using pipes. It assumes that your camera up vector is the Y axis:
              double w, h, d, l, tx, ty, tz, lxz, anglex, angley;
              w = to.GetX() - from.GetX();
              h = to.GetY() - from.GetY();
              d = to.GetZ() - from.GetZ();
              l = sqrt(ww + hh + dd);
              lxz = sqrt(w
              w + d*d);
              tx = from.GetX() + w/2;
              ty = from.GetY() + h/2;
              tz = from.GetZ() + d/2;
              anglex = acos(h/l)*180/3.14159265;
              angley = acos(d/lxz)180/3.14159265;
              QVector3D QVx(static_cast<float>(1), static_cast<float>(0), static_cast<float>(0));
              QVector3D QVy(static_cast<float>(0), static_cast<float>(1
              ((w<0)?-1:1)), static_cast<float>(0));

              // Cylinder shape data
              Qt3DExtras::QCylinderMesh *cylinder = new Qt3DExtras::QCylinderMesh();
              cylinder->setRadius(.005f);
              
              cylinder->setLength(static_cast<float>(l));
              cylinder->setRings(100);
              cylinder->setSlices(20);
              
              // CylinderMesh Transform
              Qt3DCore::QTransform *cylinderTransform = new Qt3DCore::QTransform();
              cylinderTransform->setScale(1.0f);
              cylinderTransform->setRotation(Qt3DCore::QTransform::fromAxesAndAngles(QVx,static_cast<float>(anglex), QVy, static_cast<float>(angley)));
              cylinderTransform->setTranslation(QVector3D(static_cast<float>(tx), static_cast<float>(ty), static_cast<float>(tz)));
              
              Qt3DExtras::QDiffuseSpecularMaterial *cylinderMaterial = new Qt3DExtras::QDiffuseSpecularMaterial();
              cylinderMaterial->setDiffuse(QColor(QRgb(0xffffff)));
              
              // Cylinder
              m_cylinderEntity = new Qt3DCore::QEntity(m_rootEntity);
              m_cylinderEntity->addComponent(cylinder);
              m_cylinderEntity->addComponent(cylinderMaterial);
              m_cylinderEntity->addComponent(cylinderTransform);
              

              }

              H 1 Reply Last reply 15 Apr 2019, 14:52
              0
              • A AlanWasHere
                5 Jul 2018, 12:55

                Try this piece of code to draw lines using pipes. It assumes that your camera up vector is the Y axis:
                double w, h, d, l, tx, ty, tz, lxz, anglex, angley;
                w = to.GetX() - from.GetX();
                h = to.GetY() - from.GetY();
                d = to.GetZ() - from.GetZ();
                l = sqrt(ww + hh + dd);
                lxz = sqrt(w
                w + d*d);
                tx = from.GetX() + w/2;
                ty = from.GetY() + h/2;
                tz = from.GetZ() + d/2;
                anglex = acos(h/l)*180/3.14159265;
                angley = acos(d/lxz)180/3.14159265;
                QVector3D QVx(static_cast<float>(1), static_cast<float>(0), static_cast<float>(0));
                QVector3D QVy(static_cast<float>(0), static_cast<float>(1
                ((w<0)?-1:1)), static_cast<float>(0));

                // Cylinder shape data
                Qt3DExtras::QCylinderMesh *cylinder = new Qt3DExtras::QCylinderMesh();
                cylinder->setRadius(.005f);
                
                cylinder->setLength(static_cast<float>(l));
                cylinder->setRings(100);
                cylinder->setSlices(20);
                
                // CylinderMesh Transform
                Qt3DCore::QTransform *cylinderTransform = new Qt3DCore::QTransform();
                cylinderTransform->setScale(1.0f);
                cylinderTransform->setRotation(Qt3DCore::QTransform::fromAxesAndAngles(QVx,static_cast<float>(anglex), QVy, static_cast<float>(angley)));
                cylinderTransform->setTranslation(QVector3D(static_cast<float>(tx), static_cast<float>(ty), static_cast<float>(tz)));
                
                Qt3DExtras::QDiffuseSpecularMaterial *cylinderMaterial = new Qt3DExtras::QDiffuseSpecularMaterial();
                cylinderMaterial->setDiffuse(QColor(QRgb(0xffffff)));
                
                // Cylinder
                m_cylinderEntity = new Qt3DCore::QEntity(m_rootEntity);
                m_cylinderEntity->addComponent(cylinder);
                m_cylinderEntity->addComponent(cylinderMaterial);
                m_cylinderEntity->addComponent(cylinderTransform);
                

                }

                H Offline
                H Offline
                halima
                wrote on 15 Apr 2019, 14:52 last edited by
                #15

                @AlanWasHere
                Hello,
                what do you mean by : static_cast<float>(1((w<0)?-1:1)) please?

                J 1 Reply Last reply 16 Apr 2019, 04:42
                0
                • H halima
                  15 Apr 2019, 14:52

                  @AlanWasHere
                  Hello,
                  what do you mean by : static_cast<float>(1((w<0)?-1:1)) please?

                  J Offline
                  J Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on 16 Apr 2019, 04:42 last edited by
                  #16

                  @halima What exactly are you asking?
                  static_cast casts from one type to another:

                  static_cast<T>(W) - this casts from W to T
                  

                  So, in this case it casts from int to float.
                  Or do you want to know what

                  (w<0)?-1:1)
                  

                  means?
                  If so then see https://www.tutorialspoint.com/cplusplus/cpp_conditional_operator.htm

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  H 1 Reply Last reply 30 Apr 2019, 11:50
                  0
                  • J jsulm
                    16 Apr 2019, 04:42

                    @halima What exactly are you asking?
                    static_cast casts from one type to another:

                    static_cast<T>(W) - this casts from W to T
                    

                    So, in this case it casts from int to float.
                    Or do you want to know what

                    (w<0)?-1:1)
                    

                    means?
                    If so then see https://www.tutorialspoint.com/cplusplus/cpp_conditional_operator.htm

                    H Offline
                    H Offline
                    halima
                    wrote on 30 Apr 2019, 11:50 last edited by
                    #17

                    @jsulm ok I got my answer, Thanks :D

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      Alexandr Sudnik
                      wrote on 29 Jun 2021, 14:52 last edited by
                      #18

                      Hi! I wrote resolution like @AlanWasHere, but a little clearer

                      void addLine(QEntity *parentEntity, const QVector3D &srcPos, const QVector3D &targPos)
                      {
                          auto edgeEntity = new QEntity{parentEntity};
                      
                          auto cylinder = new QCylinderMesh{edgeEntity};
                      
                          auto len = srcPos.distanceToPoint(targPos);
                          cylinder->setLength(len);
                          cylinder->setRadius(0.1f);
                      
                          auto transPoint = targPos - srcPos;
                          auto xAngle = atan(sqrt(pow(transPoint.z(), 2) + pow(transPoint.x(), 2)) / transPoint.y()) / M_PI * 180;
                          auto yAngle = (transPoint.x() == 0 && transPoint.z() == 0) ? 0 : atan(transPoint.x() / transPoint.z()) / M_PI * 180;
                      
                          auto transform = new Qt3DCore::QTransform{edgeEntity};
                          transform->setRotationX(xAngle);
                          transform->setRotationY(yAngle);
                          transform->setTranslation((srcPos + targPos) / 2);
                      
                          auto material = new QPhongMaterial{edgeEntity};
                          material->setDiffuse("#ffff00");
                      
                          edgeEntity->addComponent(cylinder);
                          edgeEntity->addComponent(transform);
                          edgeEntity->addComponent(material);
                      }
                      
                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved