基元建模primative 3d modeling
November 2021
积木建模I
Begin
本文没有那么严格,只是粗略在分类和讨论和介绍,以下[基元]一词和[积木]一词等价,在偏理论一点的环境,基元是更自然的一个描述,有MeshPrimitive, a graphics primitive,primitive也会出现在许多模型语义分割的论文里。
通常来讲,我们最常见的模型类型有:多边形面片模型,四面体与六面体网格模型,体素模型,点云模型,参数曲面模型等,并且他们本身之间也存在直接和间接的转换。
按普通大众比较熟悉的是多边形模型[大部分游戏里看到的],体素模型[我的世界],虽然四面体、六面体是个比体素更广泛的体素,为了简化,我们这里体素专门指的就是立方体[含长方体]。
那么我这里介绍的积木建模,一是角色[物件]建模,二是场景建模。
角色建模主要聚集于构成一个模型,并不是常见的人形动物的角色的意思,主要指的就是物体模型,但是这个模型有许多积木构成。
场景建模聚集于一个场景,会有大量的模型,每个模型可能是一个积木,也可能由多个积木构成。
角色包括常见的模型,车、房子,一个稍大点的房子,加上院子、装修、花场就就是一个小场景,但是缩小到一个人物大小,也可以称为一个物件。
基元@Mathemtica
通常来讲,基元的复杂度是不高的,就是些基本图案、基础模型,比如环、方块、圆环等。
点线面
点线面,已经是一种3维空间维度的最低基元了。 线最基本的主要是一个直线段,然后可以拼成许多折线,也可以是样条曲线等由参数曲线。 面最基本的是一个三角面或任意封闭平面,扩展一下也可以是参数曲面等。
Graphics Primitive
Cuboid、Sphere、BezierCurve、Cone、Cylinder、Line…等等这些都是2维和三维的图形基元。
不同的类型的积元,复杂程度和表达方式是不一样的,其中,如果把所有的基元三角化,那么圆和曲面的三角形数量是更多的。
基元分级
本来不想在这里引入分级,因为信息还谈得还不够多。不过这里也自然,如上,
点线面等我们可以称为一级基元,GraphicsPrimitive可以称为二级基元,三级基元我们可以称为一个完整的贴图模型复杂度的。
高级的基元可以高低级的基元表达或生成或复现,也可以直接生成。
积木&&基元
积木这个词更直观,更偏向于现实世界,简单一点的就是幼儿圆里有的,球,圆锥,方块等,复杂一点的有一个建模的部分,比如楼梯等。 唯一一点是点不太好表示,积木不能任意放大缩小等操作。因此,主要是二级基元,一根细直线,其实也可以看作是一个可视半径较小的圆柱。
复杂一点的就是乐高积木,高达拼接玩具等。
虚拟世界中自由度当然很高,分为面向玩家还是面向作者。 网络游戏中的家园系统和积木系统[三级基元和二级基元],我的世界就是典型的面向玩家的积木系统[一级、二级基元]
面向玩家
游戏家园系统
家园系统中主要是三级基元,游戏公司制作一些完整的基本模型,比如房子,门窗等家具,玩家只能限制性地修改,因为涉及到性能优化和赚钱等各种问题,玩家一般是不能任意DIY的,家具是要花钱或花游戏时间来获取的。
积木系统
三级基元,可以用来复现一些现实世界中的物件或建筑等,跟我的世界类似。
面向作者
面向开发者
面向开发者,主要就是各种行业的专业人士,建模工作者等。面向开发者,一般使用的是最通常使用的技术,只有有某个特性,一般不会限制。
一级、二级、三级都会由不同的人员使用。但是这里通常是不受限制的二级基元,就是同样一个曲面,我可以自定义曲面
面向玩家作者
开发商提供一些基础的平台或工作,玩家可以创造一些UGC内容来创造或分享。因为受限于工具,表达能力受限,因此不是那么自由。
限制性二级基元,我想要一个曲面模型,不好意思,没有导入模型的工具,或曲面工具,或者需要一些工具,比如我的世界要转换成指定格式的体素化模型。
玩家UGC创作需求与开发者提供工具的矛盾
因为玩家的功能受限,表达能力受限,所以有限制性二级基元==>一级基元==>二级基元==>三级基元这么一条迂回曲折的道路,当然其间也会有不同的风格,是直接创作时无法简单复现的。
直接导入模型
直接导入模型这件事情,远没有普通人认识的这么简单。他分为导入原创模型和导入网上直接下载的模型。导入原创模型理论上来说是受支持的,但是如何跟非原创的或非原创可任意商用模型等区分开来是个核心矛盾。 一个问题是版权问题如何来控制,是否是自用,是否可商,是否可改。 理论上来讲,最简单的是人工审核,但是人也不知道你这个模型是哪来的呀,作者自己录制建模过程证明视频?
一个问题是性能,你要知道3D66网上随便下一个模型,导出obj文件后可能是1个G大小,一百万个面。。。开发者有一套成熟的要培训才能使用的模型规范和流程,来解决减面导入适配使用问题。 如果底层模型普通是几万个面的,这里就有一个性能矛盾,其他的我就不多说了。
所以这件事情,一些简单的解决方案是, 支持一个受限制的模型导入,比如支持一个10万个面的模型导入 支持自定义积木 支持曲面工具 支持基元模型
自定义积木
上面提到,在这样一个系统中,我们想要自定义积木功能,提出了一些需求背景,然后回到积木建模本身这件事情上来。
积木建模
积木建模的本质就是用更低级的积木组装成更高级的积木的过程,其中不限制高级积木向低级积木的投影[球缩小表示一个点,砖头压扁变成一个面片,一个模型某一个轴向的缩放分量变为0等操作]
动机必要性
从我个人角度,我首先是作为玩家来做这件事情,是因为上述提到的创作力与系统的支持不匹配这个矛盾。
从家园游戏开发者角度,必要性是给玩家提供积木系统这件事情。 这一块有可能有性能优化点的,当然通常来讲积木数量过多,给到每个积木定义一些属性更多,系统性能是有压力的。 但是如果底层进行了一些优化,同样类型的模型与贴图,我都只存一个,还有一种是把建模时的性能压力转化为渲染或输出时的系统压力。
从行业开发者角度,大家已经在普通使用积木建模了【比如样条曲面】但是最终使用的时候还是会三角化等再输出使用,体素建模本身在图形行业就是一种新的方式,但是是否有必要三角化是待考虑的。 极小化积木建模是有可能可以节省资源的,比如所有2级基元,不管三角化表示时顶点数是多少,性能都是一样的时候,我一个圆环只要10个基元表示,为什么要用2000千个三角面基元表示?
从研究者角度,本身也是语义分析中的一个点,比如点云模型的语义分割,一个点就是一个立方体积木时。 是否存在新的基元表达方式是可以探索的。
从艺术创作角度,这是一种独特的风格,或者过程中可以生成一些独特风格的作品。
积木建模本身的必要性
如果一个模型,我可以直接用参数或系统支持的更直接的方式来生成,如果不是为了追求特殊风格,我可能没有必要使用积木来搭起来逼近。
所以有时是为了适配终端落地的系统,从头部就开始进行积木建模,具体我们可以在[3D软件与积木建模]这里聊聊。
积木系统
基本可变参数,积木作为一个整体,可以进行按三个轴缩放、位移、旋转、镜像。
积木是否可以相交和重叠 在游戏系统中,两个积木不一定可以相交,或者可能可以受限制相交,比如定义横梁和门窗是可以相交的,比如考虑到物理碰撞的是不能相交的等。 在一个面向玩家作者者的编辑器中,积木可能可以相交,积木相交表达能力更强。在本文的轮胎案例中,就是积木相交的一个情况。
极小化积木建模
极小化积木建模的意思是这样的,一个圆环,最小可以由多少个低级基元表示? 简单举例来说,一个圆环,可以由20个积木生成,也可以由2000个三角形积木?那么20就是我要的极小值。
正向积木建模
积木建模与阵列
10年的时候我就开始玩玩剑阵啊群组之类的,竟然已经10年了,然后升级了一下,去年玩了点门窗生成啥的[LongDash][LongDash] 参考历史作品:https://zhuanlan.zhihu.com/p/33985250
案例演示@直线风格建模@门窗

这一块Mathematica 12.1增加了HatchFilling和PatternFilling是我比较喜欢的功能,以后再扩展介绍一下。
案例演示@城市

案例演示@轮胎

正向的难点
懒
要人工参与,要设计
逆向积木建模
逆向积木建模的意思是,我有一个初始模型,点云也好,三角面模型也好,我把他转化成最终的积木系统适配的模型。
积木建模之三角网格建模
案例演示@阴阳兔子@LowPoly风格

法拉利2020款,历史有许多作品是这种分组三角化积木模型 https://www.bilibili.com/video/BV1EZ4y1u7r3/
积木建模之空间矩形建模
主要指的是建模的目标是大部分是矩形为主的比较适配。矩形建模的一个好处是适配于房子等自带矩形属性的模型,不容易会出现拼接缝隙。
积木建模之立方体素建模
参考我的世界
Mathematica这块我以后再单独展开,除了我的世界和体素风小游戏中使用,是强风格化的,也不一定好看,许多人并不喜欢。
而我做得较多的另一部分是拿来生成虽然底层是体素化的,看起来就是普通的房子这种,体素可视风格没有那么强。 所以我一直在探索强风格化与弱风格化之间的平衡问题。

积木建模之平行六面体建模
我的世界或体素化模型你不会看到斜面,也不会看的斜着的柱子,这里的平行六面体就是把立方体在空间旋转一个角度的效果
主要指的一个是Parallelogram,一个是BoundingBox里的MinOrientedRectangle,因为后者求出来会用Parallelogram来封装,如果Parallelogram在积木系统是不受支持的,其实可以用一个立方体+旋转参数表达。
综合积木建模
考虑到必要性,重复一下,如果积木中已经提供了一个球形,你再用三角形去拼一个,是没有必要的,但是如何把这个球形识别出来?然后再用系统有的球形去融合进行就是一个难点啦。这里就涉及到逆向建模中的模型分割问题,语义分割就是算法能自动分割,否则我们就要在3D软件里进行人工分割。
这一块也可以称为模型分组,这个分组可以分为积木级别的分组和基元级别的分组和贴图级别的分组,是个多层次的分组。
综合积木建模的意思就是不同的分组使用不同的积木来替换掉。
逆向的难点
比如减面困难,效果未必达到预期。 语义分割+BoundingBox+BoundingConvex是一个比较好的减面方案,但是语义分割受限于模型来源,模型不是用来解决你的需求的。。。 非标准曲面光滑是相对困难的,标准曲面比如一个圆环这种是相对简单的。
积木建模与限制性基元建模
在普通的建模中,我们的三角化是任意的,在Mathematica中对Mesh做三角化如Triangulate和DiscreteGraphics的过程中,MeshRefinementFunction可以控制部分三角化。 对于三角面模型,我任意一个三角形都可以由三个顶点的坐标生成,但是如果系统中只存在一个直角三角形呢,不能任意生成一个三角形呢?此时只有两种方式,一是把一个任意三角形,分解成两个直角三角形
限制性基元
所以以上这个直角三角形称为限制性基元,限制性基元有时是因为系统受限被动选择,有时是为了风格或某种别的目的主动选择。
3D建模软件、Blender、Mathematica与积木建模
Blender
以Blender为例,如果我们要实现一个积木建模,那么在Blender中可以按积木建模的方式进行,一是可以把Blender本身当成一个积木系统,二是与后处理系统对接,比如分组、切割模型的目标要依赖后处理系统的需求。
0@Blender=积木系统 1@Blender==>积木模型 2@Blender==>后处理系统==>积木系统
Mathematica与积木建模
作为3D软件,Mathematica可以作为一个弱3维建模软件,强参数3D建模软件存在。 作为脚本语言,Mathematica可以作为一个脚本编辑语言存在,并且也可以融合其他语言的程序。
Mathematica==>积木模型
Blender==>Mathematica==>积木模型
Mathematica==>Blender==>Mathematica==>积木模型
小结
文字是不是已经太多了[LongDash][LongDash],本文Mathematica相关的代码内容可能不是太多,后续再补充+别的案例。
纯手写太多太累了,懒得写了[LongDash][LongDash],有空把部分独立出来和补充细节以及分享更多好玩的趴,有啥想法或哪些局部看不太清楚的可以评论里或有空QQ里聊吧,比如对哪块更有兴趣的也可以扩展扩展。
有能力和喜欢做低面建模的可以一起玩,可以一起来生成一些艺术作品,比如我需要大量2万面以下-10万面以下的模型。