紧接上文!上一篇制作了画板和笔刷,那么如何控制画笔,画出想要的图案呢?
这一节制作笔刷相关蓝图。
笔刷
一个最基础的球形笔刷,包含三个要素,“半径”,“浓度”,“位置”。
半径和浓度
其中,半径和浓度已经实现了。
移动
为其增加一个位移 Center
虽然说“增加”,但要使用减法减
Center
虽然我们称之为“增加”,但在实际操作中是通过减法来实现的。
这是因为我们正在操作的是“UV坐标系”,因此需要通过减去Center
来实现位移。 具体来说,如果我们想将点向右移动,那就相当于将整个坐标系向左移动。
以Center = (1,0,0)
为例,可以看到笔刷球体跑到了一侧:
绘制
BP_VolPainter
只是用来测试,接下来要做完整的绘制功能
为了简化教程,我们添加一个第一人称模板
用第一人称模板只是为了简化教程步骤
第一人称模板不是必须的,在制作的时候,我会注意将功能独立于模板
你可以用自己喜欢的方式
VolumePainter
接下来新建一个Actor组件VolumePainter
这是为了保持通用性,不把关键代码写到第一人称模板里
Reset RT
在 VolumePainter
新建函数 Reset RT
,负责清除RT
Traces Target
新建函数Traces Target
,他将用来计算绘制点
首先为函数增加三个输入:
名称 | 类型 | 说明 |
---|---|---|
MeshActor | Static Mesh Actor | 场景中,被绘制的体积模型 |
PaintLocation | Vector | 笔刷位置 |
PaintRadius | Float | 笔刷半径 |
首先为了调试,使用 Draw Debug
系列函数制作一些可视化:
绿色部分:为体积的立方体模型绘制一个盒体,表示我们正在对这个模型进行绘制。使用 IsValid
判断是否正确的输入了MeshActor
,“正确”绘制,“不正确”不绘制。
蓝色部分:无论是否有MeshActor
,都要为笔刷绘制一个用于调试的可视化球体。
接下来,需要判断笔刷是否在 MeshActor
内部。
不是什么都需要使用“碰撞检测”的!
我们只需要将 PaintLocation 笔刷位置
转换为 MeshActor
空间的局部位置①,判断是否在Box内部②就可以了。
顺便,根据判断结果,我们改变一下笔刷调试球的颜色③。
接下来获取模型的资产尺寸,定义盒体
Pawn
像我之前所说,核心功能都在
VolumePainter
,它可以在任何需要的地方应用。
因此不会对Pawn进行过多设计,这里只会注重VolumePainter
如何使用,我们会简短的进入Pawn
后离开,
接下来进入Pawn的蓝图
添加Scene
添加一个场景组件并附加在相机下,并移动它让他在相机前方:
添加VolumePainter
添加VolumePainter:
添加Tick
,并将Scene
的位置设置到TracesTarget
作为笔刷位置:
拖出MeshActor
,并新建变量
为变量勾选可编辑实例
场景
摆放体积模型
在场景中摆放SM_TwoSided
如果现在RT是空的,则不会显示球(例如重启,切换关卡,都可能清空RT)。
以防你有些迷茫,这时可以使用BP_VolPainter
再画一次RT
但这不影响后续
摆放Pawn
这3步十分关键:
-
把
BP_FirstPersonCharacter
拖入到场景 -
为
Mesh Actor
选择填入刚才的体积模型
-
选择自动控制
玩家0
准备就绪:
一切准备就绪,接下来我们就可以绘制体积了!