使用QPainter画一个3D正方体
本文实例为大家分享了QPainter画一个3D正的具体代码,供大家参考,具体内容如下
My3DBox.h
#includeusingnamespaceEigen; #defineSQUARE_LENGTH200//是一个边长200的正方体 #defineCAMERA_DISTANCE300//视点距离 classMy3DBox:publicQWidget { Q_OBJECT public: explicitMy3DBox(QWidget*parent=0); protected: QPointm_mousePos; Vector3dm_vector[8];//正方形8个点坐标 voidmouseMoveEvent(QMouseEvent*); voidpaintEvent(QPaintEvent*); voiddrawPlane(constQPoint*points,QPainter&painter); Matrix3dgetMartix(); QPointToPoint(Vector3dvector); voiddrawUp(QPoint*points,QPainter&painter);//正方体面的绘制 voiddrawDown(QPoint*points,QPainter&painter); voiddrawLeft(QPoint*points,QPainter&painter); voiddrawRight(QPoint*points,QPainter&painter); };
My3DBox.cpp
#include"widget.h"
#definePI3.1415926
My3DBox::My3DBox(QWidget*parent):
QWidget(parent),m_mousePos(0,0)
{
setMouseTracking(true);//在任何情况下启用mouseMoveEvent
setGeometry(400,200,500,500);
m_vector[0]<<-100,100,100;//设置正方体顶点初始位置
m_vector[1]<<100,100,100;
m_vector[2]<<-100,-100,100;
m_vector[3]<<100,-100,100;
m_vector[4]<<-100,100,-100;
m_vector[5]<<100,100,-100;
m_vector[6]<<-100,-100,-100;
m_vector[7]<<100,-100,-100;
}
voidMy3DBox::mouseMoveEvent(QMouseEvent*e)//此处把坐标原点从左上角变换至屏幕中心
{
if(e->pos().x()<0)
m_mousePos.setX(-width()/2);
elseif(e->pos().x()>width())
m_mousePos.setX(width()/2);
else
m_mousePos.setX(e->pos().x()-width()/2);
if(e->pos().y()<0)
m_mousePos.setY(height()/2);
elseif(e->pos().y()>height())
m_mousePos.setY(-height()/2);
else
m_mousePos.setY(-e->pos().y()+height()/2);
update();
}
voidMy3DBox::paintEvent(QPaintEvent*)
{
QPainterpainter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.setPen(Qt::NoPen);
painter.fillRect(rect(),QColor(3,22,52));
Vector3dvector[8];
Matrix3dmatrix=getMartix();//获取变换矩阵
QPointpoints[8];//正面0123左面4062右面1537上面4501下面2367(以观察者的方向为主)
for(inti=0;i<8;++i)//计算变换后坐标
{
vector[i]=matrix*m_vector[i];
points[i]=ToPoint(vector[i]);
points[i].setX(points[i].x()+width()/2);//将坐标系原点变换至左上角
points[i].setY(-points[i].y()+height()/2);
}
//一共要画5个面,最后画正面
if(qAbs(m_mousePos.x())>qAbs(m_mousePos.y()))
{
if(m_mousePos.x()>0)
{
if(m_mousePos.y()>0)
drawDown(points,painter);
else
drawUp(points,painter);
drawLeft(points,painter);
}
else
{
if(m_mousePos.y()>0)
drawDown(points,painter);
else
drawUp(points,painter);
drawRight(points,painter);
}
}
else
{
if(m_mousePos.y()>0)
{
if(m_mousePos.x()>0)
drawLeft(points,painter);
else
drawRight(points,painter);
drawDown(points,painter);
}
else
{
if(m_mousePos.x()>0)
drawLeft(points,painter);
else
drawRight(points,painter);
drawUp(points,painter);
}
}
//画正面
QPointpoint[4]=
{
points[0],
points[1],
points[3],
points[2]
};
drawPlane(point,painter);
}
voidMy3DBox::drawPlane(constQPoint*points,QPainter&painter)
{
QLinearGradientlinearGradient(points[1],points[3]);//设置渐变色
linearGradient.setColorAt(0.0,QColor(150,150,250));
linearGradient.setColorAt(1.0,QColor(170,170,255));
painter.setBrush(QBrush(linearGradient));
painter.drawConvexPolygon(points,4);
}
Matrix3dMy3DBox::getMartix()
{
doubleunit_x=0;//同方向单位向量的x和y
doubleunit_y=0;
doublez=0;
if(m_mousePos.x()!=0||m_mousePos.y()!=0)
{
unit_x=m_mousePos.x()/qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y());
unit_y=m_mousePos.y()/qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y());
z=qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y())/qSqrt(width()*width()/4+height()*height()/4);
}
Matrix3dM_Z;
if(unit_x==0&&unit_y==0)
M_Z<<1,0,0,
0,1,0,
0,0,1;
else
M_Z<
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。