当前位置:首页 > 技术学院 > 技术前线
[导读]下面我们开始尝试研究不同的绘图风格和技术 - 边缘平滑,贝塞尔曲线,墨水和粉笔,笔和印章和图案 -等等。事实证明,网上没有太多关于此的内容。在下面的示例中,您请大家查看演示源代码,以便了解正在发生的事情。

这篇教程将带您从基础知识(在画布上绘制原始鼠标跟随线),一直到那些和谐画笔,以及复杂的曲线和笔触,从边缘跨越并卷曲成奇怪美丽的结构。

下面我将介绍不同的刷子代码实现,以便您可以自己了解如何在画布上实现自由绘图。

当然,在继续之前,对HTML5画布有一定的了解是必要的。

基本

所以让我们从一个非常基本的方法开始。

简单的铅笔

我们在画布上观察“mousedown”,“mousemove”和“mouseup”事件。

在“mousedown”上,我们将指针移动到单击的坐标(ctx.moveTo)。在“mousemove”上,我们画一条线到鼠标的新坐标(ctx.lineTo)。最后,在“mouseup”上,我们通过将isDrawingflag 设置为false来结束绘图。

此标志用于防止在画布上移动鼠标时进行绘制(没有单击画布的情况)。您可以通过在“onmousedown”中分配“onmousemove”事件处理程序(然后在“onmouseup”中删除它)来避免标记,但flag是一个简单的解决方案,也可以正常工作。

设置光滑连接

现在,我们可以通过改变值来控制线的厚度ctx.lineWidth。但是,粗线造成锯齿状的边缘。

这通常发生在“急转弯”的位置,并且可以通过设置ctx.lineJoin和ctx.lineCap成"round" 来解决(有关这些如何影响渲染的示例,请参阅MDN )。

借助阴影使边缘平滑

现在线条没有在拐角周围出现锯齿。但它们的边缘也不是很光滑。这是因为这里没有抗锯齿化(在canvas上控制抗锯齿从未如此简单)。那么我们如何效仿呢?

有种方法就是借助阴影使边缘平滑。

我们添加的内容都是ctx.shadowBlur和ctx.shadowColor。边缘现在肯定更平滑,因为线条被阴影包围。但还是有一点问题:你会注意到线条在开始时比较薄和模糊,但是随着绘制的内容增加逐渐变得更厚更坚固。

这是一个有趣的效果,但也许完全不是我们想要的。那么为什么会这样呢?

原来这是由于阴影相互重叠,每增加一个点都重新stroke了,这样当前笔划的阴影与前一笔划的阴影重叠,后者与前一笔划的阴影重叠,依此类推。阴影越重叠,模糊越少,线越粗。那么我们如何解决这个问题呢?

基于点的方法

避免这类问题的一种方法是始终stroke一次。我们可以在一个数组中引入一个容器存储鼠标点,并且一次性stroke它们。而不是盲目地在每一次接收到鼠标mousemove的时候都去stroke。

如您所见,它看起来与第一个示例效果相同。现在我们可以尝试在此基础上添加阴影。注意它在整个路径中是如何保持均匀的。

基于点的阴影

边缘平滑与径向渐变

另一种平滑的途径是使用径向渐变。渐变允许更均匀的颜色分布,不像阴影通常比“平滑”更模糊。

但是,正如您所看到的,stroke使用渐变还有其他问题。请注意我们如何在每个鼠标移动点上使用圆形渐变填充区域的。当快速移动鼠标时,我们得到一系列断开连接的圆,而不是具有光滑边缘的直线。

解决此问题的一种方法是在两点间隔距离大时生成额外的点来填补断开的空间。

最后这是一条相当平滑的曲线!

您可能会注意到上面示例中的一个小变化。我们只存储上一个点,而不是存储路径的所有点。我们总是stroke从上一个点到当前的一个点。

有了上一个点那我们需要计算它与当前点之间的距离。如果距离太大,我们就在其中填充更多。这种方法的好处是我们不用存储整个points阵列,这样就减少了内存的使用!

贝塞尔曲线

我遇到的一个有趣的概念是使用bezier线而不是直线。这允许自由绘制路径的曲线更自然更平滑。

这个想法的实现是使用quadraticCurveTo来替换straight-line,用两个连续点之间的中间点作为二次贝塞尔曲线控制点。来试试吧:

到现在你已经知道:绘图和平滑曲线的一些基本知识。从简单的连线到更复杂的基于贝塞尔的曲线。让我们继续前进发现更有趣的事情吧。

刷子,毛皮,笔

刷子

现实的画笔工具箱中的一个技巧是简单地用图像stroke。我在 blog post by Andrew Trice.遇到了这种技巧。这种想法是使用一小部分图像作为画笔去stroke。这开启了很多可能性。

根据图像,我们可以实现不同的画笔样式。在这种情况下,它类似于厚刷。

毛皮(旋转画布)

跟前面一样用绘制图片方式填充路径,但每次绘制时生成随机的角度值旋转一下画布。

如果我们这样做,我们可以得到类似毛皮(或花环)一样的东西。

笔(变化宽度)

当谈到模拟钢笔写字时,一个很好的解决方案是简单地随机变化路径的线宽!我们仍然是结合moveTo+ lineTo的方式,但每次去更改“lineWidth”绘制出来的线是什么样子呢?这是它的外观:

要记住的一件事是,为了使绘图看起来真实,随机值差别不应该太大。

笔2(多线条)

另一模拟钢笔的实现是通过多笔触完成的。我们在点与点之间连线stroke多次,而不是仅仅一次。

但是我们并不是在同一个坐标位置重复画线,因为这不会改变任何事情。

相反,我们在原始(图片上的绿点)位置旁边取几个随机点(图片上的蓝点),然后从那里开始。因此,不是一行,而是在原始线旁边增加了两天“凌乱”的线条。完美的钢笔模拟!

厚刷

你可以用这种“多笔触”技术做很多事情。我鼓励大家尝试自己的想法。

这里有一个例子,如果我们增加线条宽度并稍加修正第条线的偏移量,我们可以模拟一个厚刷子。边缘上的那些空白点使其看起来很逼真。

“切片”笔触

多笔触的方法中如果使用均匀的小点的偏移量,我们可以得到类似于切片的东西。

这一次,不使用图像。

简单的方法让路径呈现偏斜效果。

带有透明度的“切片”笔触

如果我们使用与前面示例中相同的画笔,并给每次笔触依次变小的透明度,我们会得到一个像这样的有趣效果。

多行线条

笔直线条用够了。我们是否可以将相同的技术应用于基于贝塞尔曲线的路径呢?当然。我们只需要在偏离原始点一定距离的位置绘制每条曲线。这就是它的样子:

带有透明度的多行线条

我们也可以使用相同的“褪色”技术,让其中每条线的不透明度依次降低。这使得这些线条看起来更加简洁优雅。

与直笔触一样,使用贝塞尔曲线的可能性是无尽的。

印记样

基本概念

在我们学会了如何划线和曲线后,实现印章刷不是更简单!我们所需要的只是在每次鼠标移动时,在鼠标的位置绘制某种形状。而已。这是一个用红色圆圈标记的例子。

追踪效果

您可以看到中间点的相同问题,我们可以使用相同的预填充技术解决这些问题。邮票的预填充往往会产生非常有趣的线索或管状效果。您可以通过在最后一个点和当前点之间预先填充每个点的间隔来控制管的密度。

随机半径,不透明度

当然,我们总是可以调情,以某种方式改变每个邮票。例如,第一个例子中随机变化的半径和不透明度就是这个。

形状

当涉及到那种邮票时,你可以尽可能地去 - 从我们刚看到的基本形状(例如圆圈)到由数百或数千条曲线组成的更复杂的路径。这里唯一的限制因素是性能。这是一个用简单的五角星冲压的例子。

旋转形状

这是同一颗星,但每次移动都会随机旋转,以获得更自然的感觉。

随机化一切!

哎呀,让我们放大一点 - 尺寸,角度,不透明度,颜色,厚度!现在不是那么有趣。

彩色像素

我们也不仅限于形状。一种选择是直接操纵鼠标点周围的像素。一个简单的例子就是随机化它们的颜色和位置。

基于图案的画笔

现在我们已经过了抚摸和冲压,让我们来看看一个完全不同的野兽模式。我们可以使用canvas’随时createPattern填充路径。这会产生一些非常有趣的效果。我们来看一个简单的点图案。

圆点图案

注意这里是如何创建模式的。我们将实例化迷你画布,在其上绘制圆圈,然后将该画布用作主画布上的图案!我们可能也习惯使用普通图像,但使用canvas的美妙之处在于我们可以通过编程方式访问它,并且无论如何我都可以更改它。这意味着我们可以创建动态模式,例如改变模式中圆的颜色,半径等。这也意味着我们可以更快更容易地尝试模式。

线条图案

根据前面的示例,您应该能够创建类似的东西。让我们说一个水平线条图案。

双色线条图案

…或垂直线条,具有互换的颜色。

彩虹

…甚至是多条不同颜色的线条。一切皆有可能。想想一些模式,并尝试在迷你画布上创建它。剩下的就是照顾createPattern和填充路径。

图片

最后,这是一个使用基于图像的模式与贝塞尔曲线路径一起使用的示例。这里改变的是我们将图像对象传递给createPattern(然后将结果模式分配给strokeStyle)。

喷雾

现在goold-old喷刷怎么样?我们可以通过几种方式实现它。其中之一是用颜色简单地填充鼠标点周围的区域(像素)。面积(半径)越大,喷雾越厚。我们填充的像素越多,它就越密集。

基于时间的喷雾

您可能会注意到,之前的方法并不像真正的喷雾那样。一个真正的喷漆面积不断,不只是当我们移动鼠标/刷。为了实现这一点,我们需要在按下鼠标时以恒定间隔绘制区域。这样,某些区域可以通过更长时间“保持喷雾”而变得更暗。

基于时间的喷雾,圆形分布

前面的例子更现实,但并不完全如此。真正的喷涂油漆在圆形区域上,而不是矩形。所以让我们尝试在圆形区域上分布像素。

好多了。

随机点

最后,我们还能做些什么来使喷雾更逼真吗?当然,除了使用图像作为印章。我们当然可以使涂料偶尔散布,就像在现实生活中一样。如果我们改变每个绘制像素的不透明度,我们会得到非常相似的效果。

邻居点连接

连接邻居点的概念由zefrank的Scribbler和doob先生的Harmony推广。如果你还记得Harmony画笔,如粗略,阴影,铬色 - 这就是我所说的效果。

这个想法是:在已经绘制的路径的附近点之间添加额外的笔划。这通常会产生草图,网页或某种阴影的效果; 额外的笔划在小的“弯曲”区域增加了较暗点的错觉。

全点连接

一个天真的方法是采用我们的第一个简单的基于点的画笔的例子,并添加额外的抚摸。对于沿路径的每个点,我们将朝着路径上的前一个点冲程:

你可以开始看到类似Harmony画笔的东西,但它并不完全相同。通过降低额外笔画的不透明度(即对比度)可以使其更加逼真和阴影。但要完全重建效果,我们需要遵循不同的算法。

邻居点

负责“附近”抚摸的部分是这样的:

复制代码

1 var lastPoint = points[points.length-1];

2

3 for (var i = 0, len = points.length; i < len; i++) {

4 dx = points[i].x - lastPoint.x;

5 dy = points[i].y - lastPoint.y;

6 d = dx * dx + dy * dy;

7

8 if (d < 1000) {

9 ctx.beginPath();

10 ctx.strokeStyle = ‘rgba(0,0,0,0.3)’;

11 ctx.moveTo(lastPoint.x + (dx * 0.2), lastPoint.y + (dy * 0.2));

12 ctx.lineTo(points[i].x - (dx * 0.2), points[i].y - (dy * 0.2));

13 ctx.stroke();

14 }

15 }

复制代码

这里发生了什么?看起来很疯狂 我花了一些时间来理解,但这个概念非常简单!

绘制线时,我们检查已经绘制的路径的整个距离,将所有点与当前(最后一个)点进行比较。如果该点在d < 1000最后一个点的某个接近度()中,我们移动指向它的指针并从那里划线到当前点。dx * 0.2并dy * 0.2给那些额外的笔画稍微偏移。

而已。简单的想法,强大的效果。

毛皮通过邻居点

这种技术的一个有趣的转折 - 在和谐中看到 - 是创造皮毛效果。不是向附近点(从最后一点)划动,而是向相反方向行程。稍微偏移,它会在某些(近距离)区域产生毛茸茸的笔触。

调查Harmony画笔后不久,我偶然发现了LukášTvrdý的精彩博客文章,很好地解释了邻居点技术的一些变化。他描述了不同参数如何影响笔画及其产生的效果类型。绝对值得一试。

所以你有它 - 一些基本的以及更有趣的绘图技术。我们这里只是划了一个表面。有无限的可能性来定制任何一个画笔,创造更多令人兴奋的效果。改变不透明度或颜色,宽度或偏移,引入随机因素,并产生全新的效果。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

尼得科株式会社开发的电机产品被太阳诱电株式会社(以下简称“太阳诱电”)推出的可支持再生制动系统的电动助力自行车——充满一次电可最多骑行1000km*1的再生电动助力系统 “FEREMO™”*2所采用。

关键字: 电机 自行车

在电力电子和机械工程领域,电机作为转换和传递能量的关键设备,其稳定运行至关重要。然而,电机运行过程中,有时会出现过电流现象,这不仅影响电机的性能,还可能造成严重的设备损坏甚至安全事故。因此,深入理解电机报过电流的原因,并...

关键字: 电机 过电流

在科技迅猛发展的今天,履带机器人在诸多领域展现出了广泛的应用前景,从现代农业的采摘、喷药,到消防领域的救援,再到现代化防疫中的喷雾消毒,甚至是复杂地形的运输任务,它们都能出色地完成任务。而驱动这些履带机器人的核心部件,便...

关键字: 履带机器人 机器人 电机

随着各行各业自动化程度的提高,运动控制的重要性日益凸显。为了有效地驱动电机,描述速度和位置的控制输入必不可少。然而,实现这种感测的技术有多种,每种技术都有不同的特点和应用场景。

关键字: 传感器 电机 自动化

为增进大家对鼠标的认识,本文将对鼠标左键单击变双击的维修方法以及鼠标单击异常的解决方法予以介绍。

关键字: 鼠标 指数 驱动

以下内容中,小编将对显卡驱动的相关内容进行着重介绍和阐述,希望本文能帮您增进对显卡驱动的了解,和小编一起来看看吧。

关键字: 显卡 驱动 显卡驱动

一直以来,步进电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来步进电机的相关介绍,详细内容请看下文。

关键字: 电机 步进电机

使用电机测试:让家中的一个电机运行,如果电机能够正常工作,说明家中可能存在短路问题。使用万用表检测可以确定短路的具体位置。

关键字: 零线接地 跳闸 电机

面向消费者市场的eVTOL制造商AIR公司宣布与商业、工业、家电电机以及控制器的大型制造商尼得科电机株式会社(Nidec Motor Corporation)合作研发适用于AIR公司的双座eVTOL“空中一号(AIR O...

关键字: 电机 AIR 空中交通

在现代工业和设备设计中,电机作为动力源扮演着至关重要的角色。正确选择电机对于确保整个系统的高效运行、节能减排以及成本控制都至关重要。本文将详细阐述电机选型的步骤,并提供一些实用的建议,帮助工程师和技术人员做出明智的决策。

关键字: 电动机 电机
关闭
关闭