文章目录
表达几何有非常多的方式,每种方法都有其特定的应用场合,没有最优的,只有合适的。
Implicit Surface
- 采样会变得困难
- 但是Inside和Outside测试将会变得非常容易
Explicit Surface
- 采样会变得容易
- Inside/Outside测试会变得很困难
Algebraic Surfaces (Implicit)
Constructive Solid Geometry (Implicit)
Distance Functions (Implicit)
注意距离场的定义:
从任意位置到对象的最短距离(可以是带符号的距离)
Distance Functions (Implicit)
距离场的融合
可以参考这篇文章的SDF混合思路,可以做出Organic的效果 https://www.jcohen.name/papers/Ferreira_Levelsets_2007.pdf
关于SDF的简单效果可以看我实现的ShaderToy https://www.shadertoy.com/view/ttcyWB
//******************************Soft Blend*****************************
// https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
float opSmoothUnion( float d1, float d2, float k ) {
float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );
return mix( d2, d1, h ) - k*h*(1.0-h); }
float opSmoothSubtraction( float d1, float d2, float k ) {
float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );
return mix( d2, -d1, h ) + k*h*(1.0-h); }
float opSmoothIntersection( float d1, float d2, float k ) {
float h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );
return mix( d2, d1, h ) + k*h*(1.0-h); }
//*********************************************************************
贝塞尔曲线
图为3阶贝塞尔曲线
贝塞尔曲线的代数形式
因为计算高阶贝塞尔曲线会比较费,而 Piecewise cubic Bezier 则是使用贝塞尔曲线的一般形式
C
0
C^0
C0 continuity:
a
n
=
b
0
a_n = b_0
an=b0
$C 1 1 1 continuity: a n = b 0 = 1 2 ( a n − 1 + b 1 ) a_n=b_0=\frac{1}{2}(a_{n-1}+b_{1}) an=b0=21(an−1+b1)
贝塞尔曲面
贝塞尔曲面就跟 cubic 贝塞尔曲线一样,但是控制点就多了一个维度
具体的实现如下
引用
[1]https://sites.cs.ucsb.edu/~lingqi/teaching/resources/
[2] https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm