用qt画3d圆柱
程序员文章站
2022-07-13 08:28:32
...
qwidget是在2d坐标第中,要画3d的就要将3d图抽象到2d坐标中来。当一个3d圆柱放到平面坐标中,如果柱面方向和眼睛水平,则是一个矩形
,如果柱面和眼睛方向水平则是一个圆,如柱面方向和眼睛垂直并绕x轴旋转一定角度,那么就是两个个椭圆,且底面椭圆不能完全看见。
这里为了是圆柱圆更像圆柱面,我画的是最后一种。
我们可以理解为有两个椭圆,底面一个,顶面一个,底面的椭圆圆心理论上是和顶面的x坐标是相等的,y坐标的话底面要靠下一些;柱面底面颜色看不到
,顶面颜色可以设置画刷一次性填充,那么中间的柱面颜色咋办呢?其实细心思考可以发现,在二维平面中中间柱面仍是底面圆的范围内,这样就好办了,
先画底面椭圆用一种颜色填充,再画顶面椭圆用一种颜色填充,这样覆盖的部分就是顶面,没被覆盖的底面圆部分就是中间柱面了。
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.save();
//设置反锯齿
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::Qt4CompatiblePainting);
QRect drawRect = event->rect().adjusted(60,60,-60,-60);
drawRect.moveTop(drawRect.top() + 10);
QRadialGradient rg(drawRect.center(),drawRect.width()/2);
rg.setColorAt(1,QColor(Qt::red).lighter());
rg.setColorAt(0,QColor(Qt::red).dark(150));
painter.setBrush(rg);
painter.drawEllipse(drawRect);
drawRect.moveTop( drawRect.top() - 10);
rg.setCenter(drawRect.center());
rg.setRadius(drawRect.width()/2);
rg.setColorAt(1,QColor(Qt::white).lighter());
rg.setColorAt(0,QColor(Qt::red));
painter.setPen(Qt::NoPen);
painter.setBrush(rg);
painter.drawEllipse(drawRect);
event->accept();
painter.restore();
}
上一篇: QML开发——3D旋转特效
下一篇: 3D魔方QT