开发环境:qtcreator4.8.2, qt版本5.12.2
本例程通过重写QGLWidget类实现点云的显示,并可对点云进行移动,缩放,旋转的操作。
按住鼠标左键移动可实现旋转,按住鼠标右键移动可实现点云的拖动,滚动滚轮实现点云的缩放。
点云创建过程如下:
GLuint GLBox::makeObject()
{
GLuint list;
list = glGenLists(1);
glNewList(list, GL_COMPILE);
qglColor(Qt::gray);//物体,点的颜色// Shorthand for glColor3f or glIndex
//test
glPointSize(2.0);
glBegin(GL_POINTS);
for(int i=0;i<100;i++)
{
for(int j=0;j<100;j++)
{
int x = j-50;
int y = i-50;
int z = (i*100+j)%3;
glVertex3i(x,y,z);
}
}
glEnd();
//红色轴是X轴,绿色是Y轴,蓝色是Z轴
glBegin(GL_LINES);
glColor3f(1.0f,0.0,0.0);
glVertex3f(0.0,0.0,0.0);
glVertex3f(2,0.0,0.0);
glEnd();
glBegin(GL_LINES);
glColor3f(0.0,1.0,0.0);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,2,0.0);
glEnd();
glBegin(GL_LINES);
glColor3f(0.0,0.0,1.0);
glVertex3f(0.0,0.0,0.0);
glVertex3f(0.0,0.0,2);
glEnd();
//test
glEndList();
return list;
}
点云显示代码如下:
void GLBox::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(m_ptOffsetRBt.x(), -m_ptOffsetRBt.y(), -10.0);//平移矩阵
glScalef(m_scale, m_scale, m_scale);//x,y,z分别为模型在x,y,z轴方向的缩放比。如glScalef(1.0f,1.0f,-1.0f);将模型关于z轴翻转了180°(即关于xy轴所在平面对称);
glRotatef((float)(m_ptOffsetLBt.toPoint().y()%360), 1.0, 0.0, 0.0);
// 该函数用来设置opengl中绘制实体的自转方式,即物体如何旋转
// angle:旋转的角度,单位为度;
// x,y,z表示绕着那个轴旋转,如果取值都为0,则表示默认的绕x轴逆时针旋转。
// x,y为0,z不为0时,表示绕z轴旋转;x,z为0,y不为0时,表示绕y轴旋转;y,z为0,x不为0,表示绕x轴旋转。
glRotatef((float)(m_ptOffsetLBt.toPoint().x()%360), 0.0, 1.0, 0.0);
//glRotatef(m_zRot, 0.0, 0.0, 1.0);
glCallList(m_object);
}