二维矢量动画智能制作软件开发合集
个人开发二维矢量动画智能制作软件界面如下:
目录
线宽控制
本篇介绍软件左侧工具栏→填充工具→线宽控制
根据轮廓类型,线宽控制分为两类:1)纯色类线宽控制;2)纹理类线宽控制。
一、线宽控制原理
线宽控制功能仅对有轮廓的形状有效,本软件轮廓类型有2种,1)纯色类轮廓;2)纹理类轮廓,具体如下图所示:
绘制原理介绍如下:
① 纯色类轮廓绘制原理:采用QPainterPath的drawPath()方法,绘制的难点在于轮廓的path计算,本软件绘制(此处可理解为“计算”)path中,包含3个部分:1)起始节点的笔头;2)终止节点的笔头;3)起始节点和终止节点笔头的连接桥。
Ps. 博主认为这部分有许多值得思考的点:
① 在传统绘图软件中,轮廓的笔头默认为圆形或者矩形,但现实画笔的笔头并不是规整的形状,那么实现仿生笔时,是不是对该部分进行相应调整;
② 在传统绘图软件中,轮廓形状默认为和线条保持一致的纯色形状,那么实际绘制中,人手会抖动,相应的轮廓也会变化,那么是否可以据此现象对path的绘制逻辑进行修改,达到更真实的绘制效果。
② 纹理类轮廓绘制原理:采用QPainter的drawPixmapFragments()方法(参数详见Qt官方说明),纹理图案在该方法中设置。
简要介绍PixmapFragment类:
[static] PixmapFragment PixmapFragment::create(const QPointF &pos, const QRectF &sourceRect, qreal scaleX = 1, qreal scaleY = 1, qreal rotation = 0, qreal opacity = 1)
从参数中可见,该类可以设置pixmap的位置、可见范围、x轴缩放、y轴缩放、旋转角度和可见度,多样的参数使得该类使用非常方便,博主强烈安利这个方法,实现效果非常赞!
线宽数值设置和获取均通过QGraphicsItem继承类中增加set和get方法实现。
二、纯色类线宽控制实现
1.代码示例
.h文件变量申明:
QPainterPath m_path;
QList<QGraphicsItem *> PosItems;
void stroke::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QBrush brush(Qt::SolidPattern);
painter->setBrush(brush);
painter->drawPath(m_path);
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
for(int i = 0;i < PosItems.length();i++)
PosItems[i]->setLineWidth(PosItems[i]->m_lineWidth*(1 + 0.001));
}
2.示例效果
纯色
三、纹理类线宽控制实现
1.代码示例
.h文件变量申明:
QList<QGraphicsItem *> PosItems;
void stroke::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPainter::PixmapFragment pf[pfNum];
for(int i = 0; i < pfNum; i++)
{
qreal s = (m_p1->m_lineWidth+(m_p2->m_lineWidth-m_p1->m_lineWidth)/pfNum*i)/lineWidthBaseValue;
qreal opa = (strokeOpaEnd - strokeOpaStart)/pfNum*i+strokeOpaStart;
qreal a = jitterAngle*i;
pf[i] = QPainter::PixmapFragment::create(pfPath.pointAtPercent(1.0/pfNum*i),rect,s,s,a,opa);
}
painter->drawPixmapFragments(pf,pfNum,brushPix,QPainter::OpaqueHint);
}
void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
for(int i = 0;i < PosItems.length();i++)
PosItems[i]->setLineWidth(PosItems[i]->m_lineWidth*(1 + 0.001));
}
2.示例效果
纹理
四、线宽控制软件测试视频
线宽控制
结束语
本文简要梳理了软件【线宽控制】的实现框架,内容均为原创。
作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。
若需,请联系本人小红书(小红书号:YzLab96),谢谢。
链接: 软件开发及测试所有视频合集见小红书