精华内容
下载资源
问答
  • 目前遇到需要在QT界面上显示一个三维的不规则球面(根据大量数据换算得到),应该用什么实现呀,大致上是这种。希望大佬们慷概解答。 [img=https://img-bbs.csdn.net/upload/202009/28/1601260279_369658.jpg][/img...
  • 最近利用opengl+QT实现了一个3D点云,并且点击点云的时候可以画出一个以选中点为原点的三维坐标系,可以实现移动和旋转,大概效果如下: (图中的小黄圆是截屏软件导致的,并非实际效果。) 在这里分享几个关键...

        最近利用opengl+QT实现了一个3D点云,并且点击点云的时候可以画出一个以选中点为原点的三维坐标系,可以实现移动和旋转,大概效果如下:

                                                                            (图中的小黄圆是截屏软件导致的,并非实际效果。)

    在这里分享几个关键函数。

        将屏幕坐标转换为opengl的世界坐标:

    QVector3D GlDisplayWidget::mousePosToWorldPos(QPoint _pos)
    {
    
        double  modelview[ 16 ], projection[ 16 ];
        int  viewport[ 4 ];
        float  x = _pos.x();
        float  y = _pos.y();
        GLfloat  z =  0 ;
        double  objx, objy, objz;
    
         /*Read the projection, modelview and viewport matrices using the glGet functions.*/
        glGetIntegerv( GL_VIEWPORT, viewport );
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        glGetDoublev( GL_PROJECTION_MATRIX, projection );
    
         //Read the window z value from the z-buffer
    
        glReadBuffer(GL_FRONT);
        glReadPixels( x, viewport[ 3 ]-y,  1 ,  1 , GL_DEPTH_COMPONENT, GL_FLOAT, &z );
    
         //Use the gluUnProject to get the world co-ordinates of
         //the point the user clicked and save in objx, objy, objz.
        gluUnProject( x, viewport[ 3 ]-y, z, modelview, projection, viewport, &objx, &objy, &objz );
    
    
        return QVector3D(objx,objy,objz);
    }

        我们知道,在opengl中,从世界坐标到屏幕坐标的顺序是:

        所以我们只要使用glReadPixels获取该屏幕坐标的深度值,然后读取最后进行的变换矩阵,就可以通过gluUnProject获取屏幕坐标对应的世界坐标,就可以实现点云的选中功能了。由于QT屏幕坐标系与opengl上下相反,所以调用的时候需要将y改成viewport[3]-y。

        将世界坐标转换为屏幕坐标:

    QPointF GlDisplayWidget::worldPosToScreenPos(QVector3D pos)
    {
        double  modelview[ 16 ], projection[ 16 ];
        int  viewport[ 4 ];
        //double  objx, objy, objz;
    
        double x,y,z;
    
        /*Read the projection, modelview and viewport matrices using the glGet functions.*/
       glGetIntegerv( GL_VIEWPORT, viewport );
       glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
       glGetDoublev( GL_PROJECTION_MATRIX, projection );
    
       gluProject(pos.x(),pos.y(),pos.z(),modelview, projection, viewport,&x,&y,&z);
    
       return QPointF(x,viewport[ 3 ]-y);
    }

        类似的,我们可以使用gluProject将世界坐标转换为屏幕坐标。

        接下来是坐标系的绘制,由于我使用的是,z-y-x欧拉角变换,所以旋转都是先绕z轴旋转,再绕y轴,最后绕x轴。

        坐标轴渲染的接口:

    void GlDisplayWidget::draw3DCoord(customPoint point)
    {
    
        double x,y,z,rx,ry,rz;
        x = point.x;
        y = point.y;
        z = point.z;
        rx = point.rotateX;
        ry = point.rotateY;
        rz = point.rotateZ;
    
        const double len = 2.0;
        const double k = 0.75;
        const double vlen = len*(1-k);
    
        const double step =0.707/25.0;
    
        GLUquadric* obj = gluNewQuadric();
    
        glColor3f(0.745,0.745,0.745);
        glPushMatrix();
        glTranslated(x,y,z);
        gluSphere(obj,0.1,20,20);
        glPopMatrix();
    
        glPushMatrix();
    
        //x轴
        glTranslated(x,y,z);
        glRotated(rz,0.0,0.0,1.0);
        glRotated(ry,0.0,1.0,0.0);
        glRotated(rx,1.0,0.0,0.0);
    
        if(curClickType == rxCenter)
        {
          glRotated(rotateAngel,1.0,0.0,0.0);
        }
        else if(curClickType == ryCenter)
        {
            glRotated(rotateAngel,0.0,1.0,0.0);
        }
        else if(curClickType == rzCenter)
        {
            glRotated(rotateAngel,0.0,0.0,1.0);
        }
    
        {
            //圆柱
            if(curClickType == txCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(1.0,0.0,0.0);
            }
    
            glPushMatrix();
            glRotatef(90, 0.0, 1.0, 0.0);
            //glTranslated(x,y,z);
            gluCylinder(obj,0.02,0.02,len*k,30,30);
    
            glTranslated(0.0,0.0,len-vlen);
            gluCylinder(obj,0.1,0.00,0.5,30,30);
    
            //z旋转球
            glRotatef(-90, 0.0, 1.0, 0.0);
            glTranslated(vlen-len+0.5,0.5,0.0);
    
            if(curClickType == rzCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(0.0,0.0,1.0);
            }
            gluSphere(obj,0.12,20,20);
            glPopMatrix();
            //绘制弧线x-y
            glLineWidth(1);
            glBegin(GL_LINE_STRIP);
    
            for(double x1 = 0.0;x1<=0.707;x1 += step)
            {
                double y1 = sqrt(0.50 - x1*x1);
                glVertex3d(x1,y1,0.0);
            }
            glEnd();
    
    
        }
        //y轴
        {
            //圆柱
            if(curClickType == tyCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(0.0,1.0,0.0);
            }
            glPushMatrix();
            glRotatef(90, -1.0, 0.0, 0.0);
            //glTranslated(x,y,z);
            gluCylinder(obj,0.02,0.02,1.8,30,30);
    
            glTranslated(0.0,0.0,len-vlen);
            gluCylinder(obj,0.1,0.00,0.5,30,30);
    
    
            //x旋转球
            glRotatef(-90, -1.0, 0.0, 0.0);
            glTranslated(0.0,vlen-len+0.5,0.5);
            if(curClickType == rxCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(1.0,0.0,0.0);
            }
            gluSphere(obj,0.12,20,20);
            glPopMatrix();
    
            //绘制弧线y-z
            glLineWidth(1);
            glBegin(GL_LINE_STRIP);
    
            for(double y1 = 0.0;y1<=0.707;y1 += step)
            {
                double z1 = sqrt(0.50 - y1*y1);
                glVertex3d(0.0,y1,z1);
            }
            glEnd();
    
        }
    
        //z轴
        {
            //圆柱
            if(curClickType == tzCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(0.0,0.0,1.0);
            }
            glPushMatrix();
            //glTranslated(x,y,z);
            gluCylinder(obj,0.02,0.02,1.8,30,30);
    
            glTranslated(0.0,0.0,len-vlen);
            gluCylinder(obj,0.1,0.00,0.5,30,30);
    
            //y旋转球
            glTranslated(0.5,0.0,vlen-len+0.5);
            if(curClickType == ryCenter)
            {
               glColor3f(1.0,0.0,1.0);
            }
            else
            {
                glColor3f(0.0,1.0,0.0);
            }
            gluSphere(obj,0.12,20,20);
    
            glPopMatrix();
    
            //绘制弧线x-z
            glLineWidth(1);
            glBegin(GL_LINE_STRIP);
    
            for(double x1 = 0.0;x1<=0.707;x1 += step)
            {
                double z1 = sqrt(0.50 - x1*x1);
                glVertex3d(x1,0.0,z1);
            }
            glEnd();
    
        }
        glPopMatrix();
    }

        在函数中,我们使用了opengl绘制图元的方式画作标轴,使用gluSphere绘制球体,gluCylinder绘制圆柱来当坐标轴,gluCylinder来绘制圆锥。绘制圆弧的时候,计算一部分圆弧上的点,再将这些点连起来,就是弧线,效果如下图:

       坐标轴的移动比较简单,但是旋转因为改变旋转顺序会导致结果不同,在这里,我才用了欧拉角旋转公式和逆转公式实现了旋转。

        点绕指定轴旋转a的函数:

    QVector3D GlDisplayWidget::Rotate(QVector3D p1, QVector3D p2, double angle)
    {
        double old_x,old_y,old_z;
        double vx,vy,vz;
    
        old_x = p1.x();
        old_y = p1.y();
        old_z = p1.z();
    
        vx = p2.x();
        vy = p2.y();
        vz = p2.z();
    
        double c = cos(angle/180.0*3.14);
        double s = sin(angle/180.0*3.14);
    
    
        double new_x = (vx*vx*(1 - c) + c) * old_x + (vx*vy*(1 - c) - vz*s) * old_y + (vx*vz*(1 - c) + vy*s) * old_z;
        double new_y = (vy*vx*(1 - c) + vz*s) * old_x + (vy*vy*(1 - c) + c) * old_y + (vy*vz*(1 - c) - vx*s) * old_z;
        double new_z = (vx*vz*(1 - c) - vy*s) * old_x + (vy*vz*(1 - c) + vx*s) * old_y + (vz*vz*(1 - c) + c) * old_z;
    
        return QVector3D(new_x,new_y,new_z);
    }

       已知坐标轴从状态a到状态b,获取从a到b旋转角度的函数:

    QVector3D GlDisplayWidget::fromRotate(QVector3D x,QVector3D y,QVector3D z)
    {
        double r11,r12,r13,r21,r22,r23,r31,r32,r33;
    
        r11 = x.x();
        r12 = y.x();
        r13 = z.x();
    
        r21 = x.y();
        r22 = y.y();
        r23 = z.y();
    
        r31 = x.z();
        r32 = y.z();
        r33 = z.z();
    
        QVector3D result;
    
        double cb = sqrt(r11*r11+r21*r21);
        if(cb != 0)
        {
            result.setY(atan2(0-r31,sqrt(r11*r11+r21*r21))/3.14*180.0);
            result.setZ(atan2(r21,r11)/3.14*180.0);
            result.setX(atan2(r32,r33)/3.14*180.0);
            return result;
        }
    
        else
        {
            result.setY(90.0);
            result.setZ(0);
            result.setX(atan2(r21,r22)/3.14*180.0);
    
            return result;
        }
    }

        这个接口得出来的角度一定是从z轴旋转c,y轴旋转b,x轴旋转a,得到了角度a,b,c。具体原理大家可以去了解欧拉角和RPY角。

     

        如果想给窗口加一个背景图,可以先切换正交视角,关闭深度测试,加载图片,然后再切换投影视角,开启深度测试,再进行渲染。

    展开全文
  • REDHAT7.4+QT5.9.3+OPENGL,三维编程实例,参考网上其他实例程序,进行修改移植,在上述环境下运行正常。
  • 在使用Q3DSurface 绘制三维图,坐标系是在笛卡尔坐标系下增加一下Z轴(右手坐标系),在QSurface3DSeries中z表示行, x表示各行的列,y表示幅度值(即颜色深度),如果z范围为0 ~360,x的范围为0 ~ 10,如果不设置显示...

    在使用Q3DSurface 绘制三维图,坐标系是在笛卡尔坐标系下增加一下Z轴(右手坐标系),在QSurface3DSeries中z表示行, x表示各行的列,y表示幅度值(即颜色深度),如果z范围为0 ~360,x的范围为0 ~ 10,如果不设置显示比例,则显示的三维图z很长,x很短,比例失衡:如下图所示:

     

    通过调用QAbstract3DGraph::setHorizontalAspectRatio方法,默认为0,则显示的比为按量程范围设置,设置为1为x, z的轴长一致,如果要设置y轴与平面的显示比例,则调用 QAbstract3DGraph::setAspectRatio。

    展开全文
  • 之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现。 代码如下: main.cpp 1234567891011121314 #include...

    之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现。

    代码如下:

     main.cpp 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "GLWidget.h"
    #include <QApplication>

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);

        GLWidget glw;
        glw.resize(
    640480);
        glw.setWindowTitle(
    "gluUnProject Demo");
        glw.show();

        
    return a.exec();
    }

     

    GLWidget.h 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #ifndef GLWIDGET_H
    #define GLWIDGET_H

    #include <QGLWidget>

    class GLWidget : public QGLWidget
    {
        Q_OBJECT

    public:
        GLWidget(QWidget *parent = 
    0);
        ~GLWidget();

    protected:
        
    virtual void initializeGL();
        
    virtual void resizeGL(int w, int h);
        
    virtual void paintGL();

        
    virtual void mousePressEvent(QMouseEvent *event);

    private:
        
    void draw();
        
    void DrawFloor();
        
    void DrawAxis();

        GLdouble   objx;
        GLdouble   objy;
        GLdouble   objz;
    };

    #endif // GLWIDGET_H

     

    GLWidget.cpp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     
    #include "GLWidget.h"
    #include <QMouseEvent>
    #include <GL/glu.h>
    #include <QDebug>

    static const qint32 s_Scale = 8;

    GLWidget::GLWidget(QWidget *parent)
        : QGLWidget(parent)
    {
        objx = 
    0.0;
        objy = 
    0.0;
        objz = 
    0.0;
    }

    GLWidget::~GLWidget()
    {

    }

    void GLWidget::initializeGL()
    {
        glClearColor(
    0.00.00.00.0);

        glClearDepth(
    1.0);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LEQUAL);
    }

    void GLWidget::resizeGL(int w, int h)
    {
        
    int viewport[4];
        glViewport( 
    00, w, h );
        glGetIntegerv( GL_VIEWPORT, viewport );
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );
        gluPerspective( 
    451.330.1400 );
        
    double projection[16];
        glGetDoublev( GL_PROJECTION_MATRIX, projection );
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity( );
        gluLookAt( 
    01010000010 );
    }

    void GLWidget::paintGL()
    {

        glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

        
    //The big gray floor like polygon
        glBegin( GL_POLYGON );
        glColor3f( 
    0.50.50.5 );
        glVertex3f( -
    100,  10  );
        glVertex3f( -
    100, -10  );
        glVertex3f( 
    10,  0, -10 );
        glVertex3f( 
    10,  010 );
        glEnd( );
        
    //DrawFloor();
        DrawAxis();

        
    //The red cube to be drawn at clicked position
        glPushMatrix( );
        glTranslatef(objx, objy, objz );
        draw();
        
    double modelview[16];
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        glPopMatrix( );
    }

    void GLWidget::mousePressEvent(QMouseEvent *event)
    {
        updateGL();
        
    double modelview[16], projection[16];
        
    int viewport[4];
        
    float x = event->pos().rx();
        
    float y = event->pos().ry();
        GLfloat  z = 
    0;
        
    double winx, winy, winz;
        qDebug(
    "Window coords are (%d, %d)\n", x, y);
        
    /*Read the projection, modelview and viewport matrices using the glGet functions.*/
        glGetIntegerv( GL_VIEWPORT, viewport );
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        glGetDoublev( GL_PROJECTION_MATRIX, projection );

        
    //Read the window z value from the z-buffer

        glReadBuffer(GL_FRONT);
        glReadPixels( x, viewport[
    3]-y, 11, GL_DEPTH_COMPONENT, GL_FLOAT, &z );

        
    //Use the gluUnProject to get the world co-ordinates of
        //the point the user clicked and save in objx, objy, objz.
        gluUnProject( x, viewport[
    3]-y, z, modelview, projection, viewport, &objx, &objy, &objz );
        qDebug(
    "World coords at z=%.1f are (%.3f, %.3f, %.3f)\n", z, objx, objy, objz);

        updateGL();
    }

    void GLWidget::draw()
    {
        glPushMatrix();
        glBegin(GL_QUAD_STRIP);
        glColor3f(
    100); glVertex3f(0.0f, 0.0f, 0.0f);
        glColor3f(
    110); glVertex3f(0.0f, 1.0f, 0.0f);
        glColor3f(
    010); glVertex3f(1.0f, 0.0f, 0.0f);
        glColor3f(
    011); glVertex3f(1.0f, 1.0f, 0.0f);
        glColor3f(
    100); glVertex3f(1.0f, 0.0f, -1.0f);
        glColor3f(
    110); glVertex3f(1.0f, 1.0f, -1.0f);
        glColor3f(
    010); glVertex3f(0.0f, 0.0f, -1.0f);
        glColor3f(
    011); glVertex3f(0.0f, 1.0f, -1.0f);
        glColor3f(
    100); glVertex3f(0.0f, 0.0f, 0.0f);
        glColor3f(
    110); glVertex3f(0.0f, 1.0f, 0.0f);
        glEnd();
        glBegin(GL_QUAD_STRIP);
        glColor3f(
    001); glVertex3f(0.0f, 0.0f, 0.0f);
        glColor3f(
    101); glVertex3f(1.0f, 0.0f, 0.0f);
        glColor3f(
    010); glVertex3f(0.0f, 0.0f, -1.0f);
        glColor3f(
    100); glVertex3f(1.0f, 0.0f, -1.0f);
        glColor3f(
    110); glVertex3f(0.0f, 1.0f, 0.0f);
        glColor3f(
    101); glVertex3f(1.0f, 1.0f, 0.0f);
        glColor3f(
    001); glVertex3f(0.0f, 1.0f, -1.0f);
        glColor3f(
    100); glVertex3f(1.0f, 1.0f, -1.0f);
        glEnd();
        glPopMatrix();
    }

    /*---------------------------------------------------------------------------*/
    void GLWidget::DrawFloor()
    {
        glDepthMask(GL_FALSE);
        glColor4ub(
    175175175255);
        glBegin(GL_LINES);

        glNormal3d(
    0.01.00.0);
        
    for (qint32 i = -s_Scale; i <= s_Scale; i += s_Scale >> 3)
        {
            glVertex3i(i, 
    0, -s_Scale);
            glVertex3i(i, 
    0, s_Scale);
            glVertex3i(-s_Scale, 
    0, i);
            glVertex3i(s_Scale, 
    0, i);
        }
        glEnd();
        glDepthMask(GL_TRUE);
    }
    /*---------------------------------------------------------------------------*/
    void GLWidget::DrawAxis( void )
    {
        
    // Local Space
        static const qint32 s_Scale = 64;

        glPushAttrib( GL_LINE_BIT );
        glLineWidth(
    1.0f );
        glBegin( GL_LINES );

        
    // X轴
        glColor3ub( 25500 );
        glVertex3i( 
    000 );
        glVertex3i( s_Scale, 
    00 );

        
    // Y轴
        glColor3ub( 02550 );
        glVertex3i( 
    000 );
        glVertex3i( 
    0, s_Scale, 0 );

        
    // Z轴
        glColor3ub( 00255 );
        glVertex3i( 
    000 );
        glVertex3i( 
    00, s_Scale );

        glEnd( );
        glPopAttrib( );
    }

    代码仅供参考,最近一直在研究这个,用于实现场景中单个对象的拖拽,效果还欠佳,欢迎交流讨论。

    转载于:https://www.cnblogs.com/MakeView660/p/10709428.html

    展开全文
  • *Qt使用OpenGL绘制三维曲线时,需要加入OPenGL模块。 此处的绘制的核心代码同样可以移植到MFC上显示。 如下代码可以再进行优化。 #ifndef QTDRAW3DCTRL_H #define QTDRAW3DCTRL_H #include <QtOpenGL/qgl.h> #...

    *Qt使用OpenGL绘制三维曲线时,需要加入OPenGL模块。
    此处的绘制的核心代码同样可以移植到MFC上显示。
    如下代码可以再进行优化。

    #ifndef QTDRAW3DCTRL_H
    #define QTDRAW3DCTRL_H
    #include <QtOpenGL/qgl.h>
    #include <QWidget>
    #include <QGridLayout>
    #include <QtGui/QtGui>
    #include <QtOpenGL/QtOpenGL>
    #include <QtOpenGL/QGLWidget>
    #include <QtWidgets/QOpenGLWidget>
    #include <QtOpenGL/QGL>
    #include <vector>
    
    #include <GL/glu.h>
    #include "ui_qtdraw3dctrl.h"
    
    #ifdef _DEBUG
    #pragma comment(lib, "Qt5OpenGLd")
    #else
    #pragma comment(lib, "Qt5OpenGL")
    #endif
    #ifdef _DEBUG
    #include <QDebug>
    #endif
    class QtDraw3DCtrl : public QGLWidget
    {
    	Q_OBJECT
    
    public:
    	QtDraw3DCtrl(QWidget *parent = 0);
    	~QtDraw3DCtrl();
    	void GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num);
    protected:
    	int m_scloe;
    	double m_rotx;
    	double m_roty;
    	double m_rotz;
    	QPoint m_rotPosOld;
    	int m_base;
    	int m_isize;
    	double m_count;
    
    	double m_valuex;
    	double m_valuey;
    	double m_valuez;
    	std::vector<double> m_vetorx;
    	std::vector<double> m_vetory;
    	std::vector<double> m_vetorz;
    
    public slots:
    	void UpdateSlots();
    	
    protected:
    	virtual void initializeGL();
    	virtual void resizeGL(int w, int h);
    	virtual void paintGL();
    	virtual void mousePressEvent(QMouseEvent *event);
    	virtual void mouseMoveEvent(QMouseEvent *event);
    	virtual void wheelEvent(QWheelEvent *event);
    private:
    	Ui::QtDraw3DCtrl ui;
    };
    
    #endif // QTDRAW3DCTRL_H
    
    
    #include "qtdraw3dctrl.h"
    
    QtDraw3DCtrl::QtDraw3DCtrl(QWidget *parent)
    	: QGLWidget(parent)
    {
    	ui.setupUi(this);
    	m_scloe = -15;
    	m_rotx = 0;
    	m_roty = 0;
    	m_rotz = 0;
    	m_count = -40;
    	m_isize = 4;
    	QTimer* timer = new QTimer(this);
    	timer->setInterval(10);
    	connect(timer, SIGNAL(timeout()), this, SLOT(UpdateSlots()));
    	timer->start();
    }
    
    QtDraw3DCtrl::~QtDraw3DCtrl()
    {
    }
    
    void QtDraw3DCtrl::UpdateSlots()
    {
    	m_valuex = m_count*0.1;
    	m_valuey = sin(m_count)*0.1;
    	m_valuez = cos(m_count)*0.1;
    	m_count+= 0.05;
    
    	update();
    }
    
    void QtDraw3DCtrl::initializeGL()
    {
    	glClearColor(0.0, 0.2, 0.3, 1.0);
    	glShadeModel(GL_SMOOTH);
    	glEnable(GL_DEPTH);
    }
    
    void QtDraw3DCtrl::resizeGL(int w, int h)
    {
    	if (h == 0)//防止height为0
    	{
    		h = 1;
    	}
    	glViewport(0, 0,(GLint)w, (GLint)h);//重置当前的视口
    
    	glMatrixMode(GL_PROJECTION);//选择投影矩阵
    	glLoadIdentity();//重置投影矩阵
    	gluPerspective(45.0, (GLfloat)w / (GLfloat)h, 0.001, 1000.0);//建立透视投影矩阵
    
    	glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
    	glLoadIdentity();//重置模型观察矩阵
    	
    }
    void QtDraw3DCtrl::paintGL()
    {
    
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存
    	glLoadIdentity();//重置当前的模型观察矩阵。在glLoadIdentity()调用之后,函数返回之前,添加代码来创建基本的形
    					 //目前所做的就是将屏幕清除成前面所决定的颜色,清除深度缓存并且重置场景,仍然没绘制任何东西。
    					 //glPolygonMode(GL_FRONT_AND_BACK ,GL_LINE );//前后面,填充方式(点point、线line、FILL)
    
    	//旋转显示窗口
    	glTranslatef(0, 0, m_scloe);
    	glRotatef(fabs(m_roty), m_rotx, m_roty, m_rotz);
    	GLUquadricObj *objCylinder = gluNewQuadric();
    
    	int pt = 8;
    	int num = 40;
    	//网格
    	//X
    	glPushMatrix();
    	glColor3f(0.8, 0.8, 0.8);
    	glTranslatef(-m_isize, -m_isize, -m_isize);
    	GLGrid(0, 0, 0, pt, 0, pt, num);
    	glPopMatrix();
    
    	glPushMatrix();
    	glColor3f(1, 0, 0);
    	glTranslatef(m_isize, -m_isize, -m_isize);
    	glRotatef(90, 0, 1, 0.0);
    	gluCylinder(objCylinder, 0.1, 0.0, 0.2, 100, 1);                 
    	glPopMatrix();
    
    	//Y
    	glPushMatrix();
    	glTranslated(-m_isize, m_isize, -m_isize);
    	glRotatef(90, 1.0, 0.0, 0.0);
    	glColor3f(0.8, 0.8, 0.8);
    	GLGrid(0, 0, 0, pt, 0, pt, num);
    	glPopMatrix();
    
    	glPushMatrix();
    	glColor3f(0, 1, 0);
    	glTranslatef(-m_isize, m_isize, -m_isize);
    	glRotatef(-90, 1, 0, 0);
    	gluCylinder(objCylinder, 0.1, 0.0, 0.2, 100, 1);                 	
    	glPopMatrix();
    
    	//Z
    	glPushMatrix();
    	glTranslatef(-m_isize, -m_isize, -m_isize);
    	glRotatef(90, 0.0, 0.0, 1.0);
    	glColor3f(0.8, 0.8, 0.8);
    	GLGrid(0, 0, 0, pt, 0, pt, num);
    	glPopMatrix();
    
    	glPushMatrix();
    	glColor3f(0, 1, 1);
    	glTranslatef(-m_isize, -m_isize, m_isize);
    	glRotatef(90, 0, 0, 1);
    	gluCylinder(objCylinder, 0.1, 0.0, 0.2, 100, 1);                
    	glPopMatrix();
    
    	if (m_vetorx.size() >= 2) {
    		glBegin(GL_LINE_STRIP);
    		glTranslatef(-m_isize, -m_isize, -m_isize);
    		glColor3f(1, 0, 1);
    		for (int i = 0; i < m_vetorx.size(); i++) {
    			glVertex3f(m_vetorx[i], m_vetory[i], m_vetorz[i]);
    		}
    
    		glEnd();
    		glFlush();
    	}
    
    	if (m_vetorx.size() >= 2) {
    		glBegin(GL_LINE_STRIP);
    		glTranslatef(-m_isize, m_isize, -m_isize);
    		glColor3f(1, 0, 0);
    		for (int i = 0; i < m_vetorx.size(); i++) {
    			//glVertex3f(m_vetory[i], m_vetorx[i], m_vetorz[i]);
    			glVertex3f(m_vetorx[i], 3*m_vetory[i], 3*m_vetorz[i]);
    		}
    
    		glEnd();
    		glFlush();
    	}
    
    	if (m_vetorx.size() >= 2) {
    		glBegin(GL_LINE_STRIP);
    		glTranslatef(-m_isize, m_isize, -m_isize);
    		glColor3f(1, 1, 0);
    		for (int i = 0; i < m_vetorx.size(); i++) {
    			glVertex3f(m_vetorz[i], m_vetory[i], m_vetorx[i]);
    		}
    
    		glEnd();
    		glFlush();
    	}
    
    	m_vetorx.push_back(m_valuex);
    	m_vetory.push_back(m_valuey);
    	m_vetorz.push_back(m_valuez);
    }
    
    void QtDraw3DCtrl::mousePressEvent(QMouseEvent *event)
    {
    	QPoint pos = event->pos();
    	qDebug() << "x: " << pos.x() << "  y:" << pos.y();
    }
    
    void QtDraw3DCtrl::mouseMoveEvent(QMouseEvent *event)
    {
    	QPoint pos = event->pos();
    	qDebug() << "x: " << pos.x() << "  y:" << pos.y();
    
    	if (pos.y()  > m_rotPosOld.y())
    	{
    		m_rotz -= 1;
    		qDebug() << m_rotz;
    
    		m_rotx -= 1;
    		qDebug() << m_rotx;
    
    		m_roty -= 1;
    		qDebug() << m_roty;
    	}
    	else if(pos.y()  < m_rotPosOld.y())
    	{
    		m_rotz += 1;
    		qDebug() << m_rotz;
    
    		m_rotx += 1;
    		qDebug() << m_rotx;
    
    		m_roty += 1;
    		qDebug() << m_roty;
    	} 
    	m_rotPosOld = pos;
    
    	update();
    }
    
    void QtDraw3DCtrl::wheelEvent(QWheelEvent *event)
    {
    	qDebug() << event->delta();
    
    	if (event->delta() < 0) {
    		m_scloe++;
    
    	} else if (event->delta() > 0) {
    		m_scloe--;
    	}
    
    	update();
    }
    
    void QtDraw3DCtrl::GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num)
    
    {
    	const float _xLen = (pt2x - pt1x) / num;
    	const float _yLen = (pt2y - pt1y) / num;
    	const float _zLen = (pt2z - pt1z) / num;
    	glLineWidth(0.1f);
    	//glLineStipple(1, 0x0303);//线条样式
    
    	glBegin(GL_LINES);
    	glEnable(GL_LINE_SMOOTH);
    
    	int xi = 0;
    	int yi = 0;
    	int zi = 0;
    
    	//绘制平行于X的直线
    	for (zi = 0; zi <= num; zi++) {
    		float z = _zLen * zi + pt1z;
    		for (yi = 0; yi <= num; yi++) {
    			float y = _yLen * yi + pt1y;
    			glVertex3f(pt1x, y, z);
    			glVertex3f(pt2x, y, z);
    			
    		}
    	}
    	绘制平行于Y的直线
    	for (zi = 0; zi <= num; zi++) {
    		float z = _zLen * zi + pt1z;
    		for (xi = 0; xi <= num; xi++) {
    			float x = _xLen * xi + pt1x;
    			glVertex3f(x, pt1y, z);
    			glVertex3f(x, pt2y, z);
    		}
    	}
    	//绘制平行于Z的直线
    	for (yi = 0; yi <= num; yi++) {
    		float y = _yLen * yi + pt1y;
    		for (xi = 0; xi <= num; xi++) {
    			float x = _xLen * xi + pt1x;
    			glVertex3f(x, y, pt1z);
    			glVertex3f(x, y, pt2z);
    		}
    	}
    	glEnd();
    }
    
    

    在这里插入图片描述

    展开全文
  • OpenGL绘制三维坐标

    热门讨论 2013-03-23 17:42:48
    自制的基于MFC、OpenGL平台的三维坐标图程序,在vc2008编译通过
  • OpenGL三维坐标系绘图程序

    热门讨论 2011-01-11 19:30:25
    本例实现在三维坐标系中绘制图形,可以从COM口接收数据,并根据接收的数据在三维坐标系中绘制图像。同时实现了把三维的曲线投影到三个平面上。
  • QT三维图形1

    千次阅读 2019-11-09 19:19:19
    首先这个系列很小,我觉得大概也就几节罢了,不可能给大家把三维Opengl讲透,所以读者应该是有点基础的。 在做体渲染的时候,我们有时候只需要渲染里面的一部分内容,也就是说我们不需要把整个体空间都渲染出来,这...
  • QT三维图形3

    千次阅读 2019-11-10 16:49:20
    我们定义两个类,分别调节立方体坐标值和立方体的边长: class My3DHalfBoundary : public QGroupBox class My3DCentralPoint : public QGroupBox 注意第一个边界也是定义的半边界。 中心点比较麻烦,...
  • QT三维图形4

    千次阅读 2019-11-10 17:23:06
    我们先把基本的功能写上: ...也就是说,假如我们现在的边界长是0.3了,我们的坐标位置在0.3处,而0.3+0.3是大于0.5的,所以中心点是需要往中间来偏移。 现在各个功能都已经说完了,我们看一下最后的效果:
  • QT三维图形2

    千次阅读 2019-11-10 12:21:46
    移动的时候,我们就分别让y的旋转量代表鼠标左右移动的量,x旋转量代表鼠标上下移动的量(大家可以去看看三维坐标轴是怎么定义的)。然后update()来更新整个换面显示区。 最后是鼠标松开事件: void My3...
  • 三维坐标系转化成二维坐标系

    千次阅读 2011-01-10 15:22:25
    一,三维坐标系转化成二维坐标系1.flash中的二维坐标系(1)坐标的转换 flash中场景左上角为(0, 0),而在数学中是场景中心为(0, 0),怎样把数学中的坐标系转成flash的呢?假设场景宽度:550,高度400. x = 550 / 2 + this....
  • 我们把OpenGL里模型的三维坐标往二维坐标的转化称为投影,则屏幕上的二维坐标往三维坐标转化则可以称为反投影,下面我们来介绍一下反投影的方法。 主要是gluUnProject函数的使用,下面是代码: [cpp] view ...
  • 我们把OpenGL里模型的三维坐标往二维坐标的转化称为投影,则屏幕上的二维坐标往三维坐标转化则可以称为反投影,下面我们来介绍一下反投影的方法。主要是gluUnProject函数的使用,下面是代码: void screen2GLPoint...
  • opengl实现三维画图窗口,但是他是在二维的屏幕上显示,在交互式程序中经常遇到鼠标的二维坐标操作窗口内三维景象的情况,这篇文章讲的就是二维三维对应求解方法,我的程序就是用这个方法做的。
  • 做过三维图形的朋友应该都知道一般在界面左下角会有一个固定坐标系,用来显示指示方向,便于识别 ...VTY库中提供vtkAxesActor类,方便用户快捷实现三维坐标的实现。效果如下: C#核心代码如下: vtkAxesAc
  • VTK三维坐标点拾取

    千次阅读 2015-05-02 21:12:25
    参考资料 [1]VTK拾取三维空间细胞(vtkcell)坐标参数
  • 这是qtc++实现的绘制三维高度图和绘制三维空间中的曲面的例子,对于曲面数据的三维可视化有很大的参考意义!
  • OpenGL三维坐标显示

    千次阅读 2017-10-31 17:48:27
    3、三维坐标网格实现 #define AXES_LEN 10 //坐标轴长 void CMyStatic::GLDrawCubeCoordinates(void) { /*****网格绘制*****/ /*****使用颜色混合来消除一些锯齿, 主要针对点和线 以及不相互重叠的多边形的...
  • Qt::RightButton)//鼠标右键 { glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(0, 0, 0, 0, 0.8, 0.4); glOrtho(-25, 25, -25, 25, -20, 20); //glFrustum(-1, 1, -1, 1, 0.2, 35)...
  • 2. 根据深度图计算框选区域三维坐标 vector < double > getxyz( int u, int v, Mat depth_16bit, vector < double > params) //获取指定像素的3维坐标,可以经过两个循环计算出点云 { int camera_...
  • 根据三维坐标点绘制河床断面图及土方计算程序
  • 上面的函数是使坐标系中的所有对象,以(1,0,0)矢量为轴,以上图方向 旋转10度,当然如果角度设置成-10度,那就是以上图的反方向,旋转10度了。 注意:上图满足右手法则:拿出右手,拇指指向轴向方
  • 屏幕坐标向opengl三维坐标转换

    千次阅读 2012-08-08 17:16:02
    很多人用OpenGL绘图会遇到一个问题即屏幕坐标向OpenGL坐标转换,在网上流传着如下类似的代码:  GLint viewport[4];   GLdouble modelview[16];   GLdouble projection[16];   GLfloat winX, winY, ...
  • //入参:int x,int y 表示屏幕的坐标 GLint viewport[4] = { 0 }; GLdouble modelview[16] = { 0 }; GLdouble projection[16] = { 0 }; GLfloat winX = 0.0f; GLfloat winY = 0.0f; GLfloat winZ = 0.0f; ...
  • Qt+OpenGL实现三维地形显示,数字地图使用图片形式存储
  • Qt 获取坐标类型

    千次阅读 2019-06-23 21:08:42
    参考 ...代码 void MainWindow::mouseMoveEvent(QMouseEvent *event) { //获得相对于屏幕的坐标 QPoint sPoint1 = event->globalPos(); qDebug() << "相对于屏幕坐标1:" <&l...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,160
精华内容 1,264
关键字:

qt三维坐标