您好,Apple 开发专家,我目前正在创建一个包含手写绘图功能的 iOS 应用程序。由于某些限制,我无法直接使用 PencilKit,需要使用 MetalKit 框架来渲染笔迹。
在开始这项任务之前,我仔细检查了Apple的PencilKit(通过Notes应用程序)实现的效果并进行了一些编码尝试。然而,我的尝试明显低于 PencilKit 的结果,这让我相信我的方法可能存在缺陷。
在Notes应用程序中,笔画的渲染非常平滑和清晰。例如,用 iPencil 轻轻敲击会产生一个“几乎完美的圆形,边缘非常光滑清晰”。同样,缓慢移动 iPencil 会在屏幕上创建平滑且清晰的不规则路径。
经过一番研究,我尝试了以下绘图过程:
我收集了 iPencil 和屏幕之间的接触点列表,称为
TouchPoints- 。
我使用贝塞尔曲线对这些接触点进行插值,以形成大致平滑的点路径,我们将其称为
BezierPoints- 。
由于第二步中的插值更注重曲线的整体平滑度,但点之间仍可能留有相当大的距离,因此我尝试对 BezierPoints 执行线性插值,以创建用于使用 MetalKit 渲染的最终顶点列表,称为
金属顶点- 。
这些顶点以及其他属性,如颜色和大小(此处未详细说明),然后提交给 MetalKit 进行渲染。
-
在第4步中,我想补充几点:
调用drawPrimitives时,提供的图元类型是'
point- '。
在片段着色器代码中,我包含了一些 alpha 过渡计算(距离图元中心越远,alpha 通道值越低),以减轻一些锯齿。
-
总而言之,我当前的方法是将手写轨迹插值到一组非常密集的点基元中,然后将其渲染在屏幕上。
按照这些步骤,我已经能够成功渲染笔划,但笔划的边缘仍然不如 PencilKit 中的那么平滑和清晰。
因此,我想澄清两个关键点:
我上面描述的方法正确吗?
- 是否有其他方法可以达到更好的效果,例如将点图元与三角形图元相结合,或者为笔画计算高精度的CGPath?
-
考虑到我当前的方法是否存在根本缺陷的不确定性,我选择不在这里发布冗长的源代码,以避免混乱讨论。如果您认为我目前的做法是正确的,我可以提供源代码以供稍后进一步讨论。
感谢您的见解!