思路

从Apple Pencil和ipad的交互获取数据,用Unity调用这个数据,进行处理;返回app接口,实现效果。

unity实现“以刀刻石”

概念

  • **纹理(Texture)**:是Unity最基础的图片形式。Material(材质)包含Map(贴图),Map包含Texture(纹理)。
  • **贴图(Map)**:一种就是就是把纹理通过坐标映射到3D物体的表面,另一种就是把纹理加入一些功能,这两种都是贴图。
  • **材质(Material)**:将输入的贴图或者颜色,加上对应的Shader,以及对Shader的特定的参数设置,将这些打包在一起就是一个材质了。
  • 着色器(Shader):Shader负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。
  • 三向贴图:三向贴图是一种投射纹理功能,可缓解地形陡坡上的拉伸效应。 其基本原理是,该纹理投射自 3 个指向,然后选择其中最适合当前表面角度的那一个。 这与使用自顶向下投射技术的标准地形纹理方法不同。

具体实现

在一块三维的石头上实现刻痕以及体积的减少。在石块下方放置两个个正交相机,从下往上拍摄;根据上一步生成深度图,将石块顶点向下方位移,使用tessellation(细分曲面)技术。

  • 具体则是在下方放置两个摄像机,一个相机在第一帧的时候记录下初始深度,因为初始地面可以是刻过的石块,本身就有一定高度。另外一个相机记录实时拍摄的刀的深度。这样根据两个深度就能在任何高度上计算出最后在真正的雕刻地方,将其结果保存在r通道内。首先,下方相机获取深度图,替换上方物体的材质。另外一个相机生成初始深度图。然后根据这两张图生成一张计算后的深度值图。
  • 根据计算后的深度值图,进行两次轮廓线检测,采用的是最基本简单的sobel算子,然后用g和b通道分别存储其颜色。这样做的目的是,可以根据最后的深度图的不同通道,将石块分为基本面(无颜色值)、凸起部分(g通道)、侧边(b通道)、凹陷底部(a通道)四个部分。然后根据不同的通道使用不同的diffuse、normal等贴图渲染即可得到不同的石块面渲染效果。在这之前可以适当的将深度图进行模糊处理,使边界柔和。
  • 最后的一个处理是在表面的渲染部分,形状变形导致了贴图的拉伸,因此采用三向贴图的算法进行贴图。普通uv贴图,靠近边沿的地方贴图会有明显的拉伸。三项贴图处理过后,贴图拉伸变形效果消除。

Pencil: UITouch

Force

当你用力触摸屏幕时得到的线条就比较宽。我们可以将这个特性应用到Unity的“刀的深度”,这是正相关的。Force的大小被记录在touch.force中。一个平均力度触摸的force是1.0,用force乘以某个值来产生正确的“刀的深度”。

高度角和方位角

当Pencil平放在iPad表面时高度角就是0。当它垂直于屏幕时高度角是π/2。记住360度对应的是2π弧度,因此π/2就是90度。实现斜刻的效果。

参考文档(主要部分)

Unity-雪地效果的实现Unity3D与iOS的交互Apple Pencil Tutorial: Getting StartedUITouch