计算机图形学九:几何1—隐式曲面(代数形式,CSG, 距离函数,分型几何)与显式曲面

(本篇文章同步发表于知乎专栏:https://zhuanlan.zhihu.com/p/144392820 欢迎三连关注)

几何形体是计算机图形学当中十分重要的一部分内容,无论是人物,风景,建筑,都离不开几何,如何表示好各种各样的模型是几何部分的主要研究内容之一。本篇笔记是系列笔记的第九篇,作为几何部分的第一次笔记会主要介绍隐式曲面和显式曲面的特点,以及二者分类之下各自主要的几何表现形式。

1 隐式曲面(Implicit Surface)与显示曲面(Explicit Surface)的特点

在进入具体讲解之前,先放轻松一起看看几个几何的例子。

水杯:

水滴:

建筑群:

在见过这些各式各样的几何形体之后,为了进行更进一步的分类,我们首先把几何分为两大类别即隐式与显式。

1.1 隐式曲面的特点

所谓隐式曲面指的是并不会告诉你任何点的信息,只会告诉你该曲面上所有点满足的关系。来举个具体的隐式曲面的例子:
x 2 + y 2 + z 2 = 1 x^2 + y^2+z^2=1 x2+y2+z2=1
相信读者都能一眼看出来这是一个3维球体的方程,一般地的我们会把隐式曲面的代数方程写作 f ( x , y , z ) = 0 f(x,y,z) = 0 f(x,y,z)=0,该球体的 f ( x , y , z ) = x 2 + y 2 + z 2 − 1 f(x,y,z) = x^2 + y^2+z^2-1 f(x,y,z)=x2+y2+z21

对于隐式方程来说因为没有给出任何点的信息,因此如何采样到曲面上具体的点是一个很难的问题,如下图这样一个例子:

别说找出这样一个圆环上的点了,相信不少人都像作者一样,第一眼见到这个代数方程之后连他表现的形状是什么都不知道。

考虑到事物的两面性,有它的坏处自然也就有它的好处:

如果使用隐式曲面方程,将会十分容易的判断出一点与曲面的关系,这是一种非常具有吸引力的特性(能够轻易的判定光线与物体是否相交)。

对于其他具体的隐式曲面稍后再做介绍,首先来看看与之相对的显式曲面的特点。

1.2 显式曲面的特点

对于显式曲面来说是与隐式曲面相对应的,所有曲面的点被直接给出,或者可以通过映射关系直接得到,如下图:

虽然没有直接给出点的数据x,y,z,但是拥有u,v的取值范围以及从 ( u , v ) → ( x , y , z ) (u,v)\rightarrow(x,y,z) (u,v)(x,y,z)的映射关系,那么只需要将所有的u,v代入自然就可求得x,y,z。

区别隐式曲面与显示曲面的关键就在于是否可以直接表示出所有的点

在1.1节提到了隐式曲面难以采样曲面上的点,但是可以轻易判断点与曲面的关系,对于显式曲面来说恰恰相反,我们可以很轻易的采样到所有的点,但是给予你任意一点却很难判断它与曲面的关系!

因此没有哪一种的几何表现方式是更好的,根据具体的任务来选择隐式还是显式才是合理的做法。

2 具体的几种隐式曲面

2.1 代数曲面(Algebraic Surfaces)

对于该类隐式曲面来说其实正是在第一章中举例说明所运用到的,通过代数表达式可以得到许许多多不同的几何曲面:

但似乎单纯代数表达式的曲面都颇具有规则性,那么对于更复杂的几何形体怎么办呢?
CSG(不知道这个怎么翻译才比较好,就直接用英文代替了)便应运而生了。

2.2 Constructive Solid Geometry(CSG)

CSG指的是可以对各种不同的几何做布尔运算,如并,交,差:

通过这些操作可以得出各种更为复杂的几何:

通过CSG的方法可以一定程度上缓解隐式曲面难以表现复杂形体的困境。
(该种方法广泛存在于各类建模软件之中)

2.3 符号距离函数(Signed Distance Function)

除了对于几何的布尔操作,还可以通过距离函数来得到几何形体混合的效果,如下图:
在这里插入图片描述
如何得到这种blend的效果,就要从SDF即符号距离函数说起了(这里的符号是指距离可以有正有负)。

首先对于符号距离函数来说本质上就是一种定义距离的函数。如有空间任意一点到各个几何物体表面的距离,对这些距离做各种各样的运算操作最后得到的一个函数就是最终的距离函数了,举一个简单的例子:
在这里插入图片描述
对于这样一个二维平面的例子,定义空间中每一个点的SDF为该点到阴影区域右边界的垂直距离,在阴影内部为负,外部为正,因此对于A和B两种阴影来说的SDF分别如上图下半部分所示。有了SDF(A),SDF(B)之后对这两个距离函数选择性的做一些运算得到最终的距离函数,这里采用最简单的SDF = SDF(A)+SDF(B)来举例,最终得到的SDF为零的点的集合即为blend之后曲面,对该例子来说,就是两道阴影之间中点的一条线:
在这里插入图片描述
因此对于一开始的那个例子来说,只需合理定义空间中任意一个点的SDF,再令SDF为0即可得到混合的效果了。

(tips:对于几何体混合效果自然不可能像这里简单的两个距离相加就可以得到了,该效果具体实现是找出任一个点到两个几何体表面距离中的最短距离再减去一个变量作为该点最终的SDF,有兴趣的读者可以取油管搜索Coding Adventure:Ray Marching,该视频的讲解很不错)

2.4 水平集(Level Set)

水平集的方法其实与SDF很像(像是SDF的一种特殊形式),也是找出函数值为0的地方作为曲线,但不像SDF会空间中的每一个点有一种严格的数学定义,而是对空间用一个个格子去近似一个函数,如下:
在这里插入图片描述
对该面内的每一个点利用已经定义好的格子值进行双线性插值(在纹理映射一节已讲解)就可以得到任意一点的函数值,找出所有=0的点作为曲面。

该方法的好处是对于SDF,我们可以更加显示的区空间曲线的形状。该方法广泛的运用在医学成像和物理模拟之中:
在这里插入图片描述
在这里插入图片描述

2.5 分型几何(Fractals)

分型几何是指许许多多自相似的形体最终所组成的几何形状。

如雪花是一个六边形,放大之后会发现每一个边上又是一个六边形,再放大六边形边上的六边形边上又是六边形,就这样无限套娃,有点递归的意思。
在这里插入图片描述

以上就是对隐式曲面的具体例子的一些介绍了,总的来说隐式曲面具有形式简单,轻易判断点与曲面关系等优点,但难以采样曲面点和模拟过于复杂的形状。

接下来看看显示曲面。

3 具体的几种显式曲面

首先,同样在第一章中所用的类似参数方程的方法间接得到所有点坐标的方法是一种显示曲面的类型(贝塞尔曲线以及贝塞尔曲面可以归结在这一类,但是二者较为复杂会放到下一篇笔记讲解),除了该种方法,看看还有什么显示曲面的类型呢?

3.1 点云(Point Cloud)

在这里插入图片描述
顾名思义,就是很多很多的点构成的曲面,直接有着所有点的信息,没什么太多可讲的,多过点多模型细节就多,点少模型细节就少。

3.2 多边形网格(Polygon Mesh)

在这里插入图片描述

对于多边形网格来说相信读者并不陌生,该方法广泛应用在计算机图形当中,简单来说通过定义各个多边形面的顶点以及顶点之间的连接关系就可以得到许许多多的三角形面或是四边形面,再通过这些面来近似表现出我们想要的模型效果。

例如比较著名的.obj文件,其格式如下
在这里插入图片描述
这是一个立方体的模型数据例子。

3-10行定义了立方体的8个顶点信息。
12-25行定义了这些顶点的纹理坐标信息(每个面4个点,共6个面所以最多有24种不同的纹理坐标信息,这里有一些纹理对于不同面上的点是公用的)。
27-34行定义了6个面的法线信息,为什么有8个是因为建模软件输出的精度问题不必在意,其中有两个是重复的。

最重要的就是36-47行了,f 代表一个面,其中x/x/x的第一位表示是哪个顶点,第二位表示该顶点纹理坐标是第几个,第三位表示法线信息是第几个。 3个 x/x/x表示3个顶点的信息构成一个面。

总结

以上就是对几何的一些基础知识的讲解了,下一节会具体介绍显式曲面中的贝塞尔曲线以及贝塞尔曲面。

最后如果本文对你有帮助求点赞求收藏求一个大大的关注 😃,后序会持续更新,感谢阅读!

Reference

[1] GAMES101-现代计算机图形学入门-闫令琪


---------------------
作者:剑 来!
来源:CSDN
原文:https://blog.csdn.net/qq_38065509/article/details/106105000
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学课程设计任务书[1] ———————————————————————————————— 作者: ———————————————————————————————— 日期: 南京工程学院 课程设计任务书                课  程 名  称  计算机图形学  院(系、部、中心) 计算机工程学院 专       业  计算机科学与技术 班       级 多媒体091  起  止   日 期 2011.12.19—12.25 指   导 教 师 丁宇辰                     " 1.课程设计应达到的目的 " "《计算机图形学》是一门理论与实践并重的课程,既要注重理解基本知识,也要注重培" "养基本技能。相应的计算机图形学课程设计对帮助学生全面牢固地掌握课堂教学内" "容、培养学生编程能力、提高学生全面素质具有很重要的意义。通过本课程的实践" "环节,使学生具有使用计算机图形学的基本算法开发简单应用程序的能力,并理解 " "软件系统开发的基本流程。 " "2.课程设计题目及要求 " "选择实现以下任务中的1~2个。 " "1、《多边形填充》(直线、圆、椭圆利用算法自编函数进行调用) " "具体要求: " "(1)能利用交互手段实现多边形、圆或椭圆的绘制,并能实现填充; " "(2)自己编写划线函数; " "(3)自己编写填充函数; " "2、《二维图形裁剪》 " "具体要求: " "设计程序实现二维图形的裁剪; " "设计坐标系,画出二维图形; " "用中点法或区域代码的方法实现裁剪。 " "3、《图形变换》 " "具体要求: " "绘制出图形; " "实现图形的平移、旋转、缩放、错切等变换。 " "4、《绘制曲线》 " "具体要求: " "编写一个交互绘制Bezier或B样条曲线的程序; " "给出控制点就能绘制曲线; " "自己编写函数实现。 " "5、《可见面判断》 " "具体要求: " "绘制多面体图形; " "输出各面的可见性; " "做任意角度旋转变换,再判断各面的可见性 " "6、《颜色渐变三角形》 " "具体要求: " "绘制三角形; " "实现颜色的各种变换; " "实现填充色的渐变(从一个方向开始颜色由浅入深) " "7、《绘制三维五角星》 " "具体要求: " "编写一个绘制三维五角星的程序; " "实现填充,中心点最红,渐变到外围颜色变浅; " "8. 《观察和投影变换》 " "具体要求: " "设计一立体图形; " "输出其三视图; " "定义观察窗口,输出其三维线架图。 " "9.《设计一个动画程序》 " "具体要求: " "设计一个图形,完成该图形的动画演示; " "给出使用说明。 " "10.《用OpenGL绘制一三维图形》 " "具体要求: " "绘制三维图形; " "添加纹理。 " "11.《设计一个分形树》 " "具体要求: " "写出算法分析步骤; " "实现该算法; " "改变输入,观察分形图形。 " "12.《设计B样条曲面》 " "具体要求: " "对B样条曲面的数学表达式进行分析,写出算法步骤; " "实现该算法; " "改变输入,观察曲面图形。 " "13.《自造字库,设计一个特大型汉字》 " "具体要求: " "构造汉字字库; " "实现汉字的输出; " "对汉字进行填充及各种变换。 " "14.在屏幕上使用鼠标左键绘制数量大于4的任意顶点形成控制多边形,单机鼠标 " "右键绘制三次B样条曲线,同时在控制多边形的每一个特征三角形内用虚线显示三 " "次B样条曲线的几何生成原理。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "15.给定"树叶"轮廓的控制点,要求使用B样条曲线的特殊构造技巧,使用B样条绘制" "所构造的树叶。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "16.样条曲线和正弦曲线同时绘制,进行效果对比,绘制的长度不少于两个周期。" "具体要求: " "分析原理,写出算法; " "实现该算法; " "17.自定义一个三维图形,可参考下图,绘出其三视图。 " "具体要求: " "分析原理,写出算法; " "实现该算法; " "18.模仿Windows画图的界面,编写一个交互画图的小系统程序。 " "具体要求: " "写出实现方法; " "实现该方法; " "19.设计一个多边形,利用活化边表算法进行填充。 " "具体要求: " "写出实现方法; " "实现该方法; " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "3.课程设计任务及工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值