隐式曲面(代数形式,CSG,距离函数,分型几何)与显式几何

2023-10-30 14:20

本文主要是介绍隐式曲面(代数形式,CSG,距离函数,分型几何)与显式几何,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

隐式曲面与显式曲面

1.1隐式曲面的特点

所谓隐式曲面值得是并不会告诉你任何点的信息,只会告诉你该画面上所有点满足的关系。来举个具体的隐式曲面的例子:
在这里插入图片描述
相信读者都能一眼看出来这是一个三维球体的方程,一般地我们会把隐式曲面的代数方程写成在这里插入图片描述
该球体的
对于隐式方程来说因为没有给出任何点的信息,因此如何采样到曲面上具体的点是一个很难的问题,如下图这样一个例子:
在这里插入图片描述
别说找出这样一个圆环上的点,相信不少人都像作者一样,第一眼见到这个代数方程之后连他表现得形状都不知道。
但是考虑到事物的两面性,有坏处自然也有好处。
在这里插入图片描述
如果使用隐式曲面方程,将会十分容易的判断出一点与曲面的关系,这是一种非常具有吸引力的特性(能够轻易的判定光线与物体是否相交)
对于其他具体的隐式曲面稍后再做介绍,首先来看看与之相对的显式曲面的特点。

1.2显式曲面的特点

对于显式曲面来说是与隐式曲面相对应的,所有曲面的点被直接给出,或者可以通过映射关系直接得到,如下图:
在这里插入图片描述
虽然没有直接给出点的数据x,y,z,但是拥有u,v的取值范围以及从(u,v)->(x,y,z)的映射关系,那么只需要将所有的u,v代入自然就可求得x,y,z。

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

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

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

2具体的几种隐式曲面

2.1代数曲面

对于该类隐式曲面来说其实正式在第一张中举例说明所运用到的,通过代数表达式可以得到许许多多不同的几何曲面:
在这里插入图片描述
但似乎单纯代数表达式曲面都比较有规则性,那么对于更复杂的几何形体怎么办呢?CSG便应运而生了。

2.2Constructive Solid Geometry(CSG)

CSG指的是可以对各种不同的集合做布尔运算,比如并,交,差:
在这里插入图片描述
通过这些操作可以得出各种更为复杂的几何:
在这里插入图片描述

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

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

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

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

2.4水平集

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

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

2.5分型几何

分型几何是指许许多多自相似的形体最终组成的几何形状。
如雪花是一个六边形,放大后发现每一个边上又是一个六边形,再放大六边形边上的六边形边上又是六边形,就这样无限套娃,类似于递归。
在这里插入图片描述

3具体的几种显式1曲面

首先,同样在第一章中所用的类似参数方程的方法间接得到所有点方法是一种显示曲面的类型。

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个顶点的信息构成了一个面。

这篇关于隐式曲面(代数形式,CSG,距离函数,分型几何)与显式几何的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308493

相关文章

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注