UE4绘制户型

画户型是一个在家装行业经常使用的功能,主要是通过用户在2D平面绘制墙体,然后快速得到3D的物体。目前完成的2D界面效果如下图。功能包括墙体的增删,门窗柱子等的增删改,操作撤销等等。

在开发过程中确实遇到了不少问题。下面主要列举几个主要会遇到的问题。

1.如何寻找密闭空间?

在网上查找了不少资料,这里给出一些链接。

http://blog.csdn.net/qq_22824481/article/details/66477426;这个算法的主要思路类似于寻路,但是这种方式存在各种特殊情况,需要做大量的判断。

http://www.docin.com/p-753529280.html。

最后我的解决方案的主要思想是,每一条线进行“加粗”,然后通过“连接点”来计算加粗后的线段应该有哪些交点。然后再通过交点来重组线段。重组后的线段应该是两两相连,并且相连的线段必定构成密闭空间。

2.如何绘制自定义多边形?

一个密闭空间我们会将其涂上颜色以表示为一个空间。如下图所示:

因为一个空间可能是各种各样的形状(因为支持画斜线),所以在UE4里面如何绘制出自定义顶点的多边形呢?

这里我们只需要通过重写Swidget的OnPaint函数即可,在OnPaint函数中调用FSlateDrawElement::MakeCustomVerts,并传入正确的顶点数据和顶点下标。这里的顶点和模型的顶点原理大致相似,不过因为是2D绘制,所以这里不需要区分顶点顺序时针问题。

3.撤销和恢复的细节问题

撤销和恢复基本都是采用命令模式来进行设计的,但是命令模式有一个缺点就是如果命令种类太多的话,那么就会有太多的类存在。从本质上思考,绘制户型的所有操作都是围绕着数据的增删改来进行的。在我完成的这个撤销系统中,一共就只有四个类来表示命令。

这里有必要提醒的一点就是,如果一个操作是通过指针来修改数据,要注意在删除和重新创建的时候,命令队列里面的数据的地址发生了改变。我是通过恢复创建时通知命令队列修改地址来解决这个问题的。

本文来源于网络整理,由作者小云发布,其观点不代表番茄鱼视觉的立场,转载请联系原作者。
5
美梦成真

发表评论