首页 > 其他分享 >SDF Line相关公式推导

SDF Line相关公式推导

时间:2024-07-15 10:52:58浏览次数:16  
标签:ba 推导 float SDF vec2 vec bp Line

SDF Line相关公式推导

线段是SDF形状的基元之一,可以被用来建模一些形状,比如昆虫的腿,植物的根茎等。

image-20240712114012533 image-20240712114050014

下面这篇文章介绍一下Line公式的推导,首先记住我们要求的变量,点到形状最近的距离

那么对于空间中的点\(P_1, P_2, P_3\),他们的分布有如下三种

image-20240715102521984

其中\(P_1\)到线段的距离是\(|\vec{P_1Q}|\),\(P_2\)到线段的距离是\(|\vec{P_2A|}\),\(P_3\)到线段的距离是\(|\vec{P_3B}|。我们先看\) \(|\vec{P_1Q}|\)的求法,

其实本质是一个向量在另一个向量上的投影长度,此处借用云飞Ran的推导过程:

在这里插入图片描述

这里我们采用第二种方法,因此定义向量,\(\vec{BA},\vec{ BP_1}\),然后使用如下公式便可以求出\(\vec{BQ}\)的长度。

\[|\vec{BQ}| = {\vec{BP_1} \cdot \vec{BA}\over |\vec{BA}| } \]

此时投影长度的比例可以定义为:

\[|\vec{BQ}| = {\vec{BP_1} \cdot \vec{BA}\over |\vec{BA}|^2 } \]

熟悉这个求解投影长度的代码之后,在看一下另外两个点\(P_2, P_3\)我们会发现一个投影长度占BA的比例小于0,另一个大于1。

熟悉完上面的内容之后,我们就可以看一下SDF Line的实现了:

// Original SDF line segment function
float sdSegmentRegular( in vec2 p, in vec2 a, in vec2 b)
{
  vec2 bp = b-p, ba = b-a; //求解向量
  float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );
  return length(bp - ba*h );
}                            


void SDFLine(in vec2 p, in vec2 a, in vec2 b,  in float r, out float sdf) {
  sdf = sdSegmentRegular(p, a, b, r);
}
float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );

这段代码巧妙的地方在于通过这行代码统一了三种分布的点,当p在a,b点的左侧时,h = 1,此时求得是向量\(\vec{bp}-\vec{ba}\)也就是\(\vec{ap}\)的长度,这里大致如图:

image-20240715104318978

但是这段代码运行起来是看不到任何东西的,我们还需要减去一个 width,才能得到LineSegment;

// Original SDF line segment function
float sdSegmentRegular( in vec2 p, in vec2 a, in vec2 b, in float r )
{
  vec2 bp = b-p, ba = b-a;
  float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );
  return length( bp - ba*h ) - r;
}                            


void SDFLine(in vec2 p, in vec2 a, in vec2 b,  in float r, out float sdf) {
  sdf = sdSegmentRegular(p, a, b, r);
}

具体的原理我们可以看一下这篇博客圆角矩形小节。此处就不再赘述啦。

refer

标签:ba,推导,float,SDF,vec2,vec,bp,Line
From: https://www.cnblogs.com/curiositywang/p/18302724

相关文章

  • Deepfake Day1:Baseline解读
    DeepfakeDeepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频深度伪造技术(Deepfake)主要可以分为以下几个研究方向:面部交换:专注于在两个人的图像之间执行身份交换。面部重演:强调转移源运动和姿态。说话面部生成:专注于在角色生成中实现口型与文本内容的自然匹配。......
  • 【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)
    ​​​​​​​目录一、引言 二、音频分类(audio-classification)2.1概述2.2技术原理2.2.1 Wav2vec2.0模型 2.2.1HuBERT模型2.3pipeline参数2.3.1pipeline对象实例化参数2.3.2pipeline对象使用参数 2.4 pipeline实战2.4.1指令识别(默认模型) 2.4.2 情......
  • [Unity] Dreamteck Splines实现沿路径移动功能
    DreamteckSplines实现沿路径移动功能最近有一个“让物体沿固定路径移动”的需求,因此接触到了DreamteckSplines插件。DreamteckSplines可以很方便地绘制各种插值曲线,但在实现物体移动的时候却遇到了很多坑,因此在这里记录一下。1.绘制路径线首先,让我们在场景上创建一个空物......
  • 应力平衡方程的推导
    应力平衡方程的推导对于一点,已知其应力状态有:σx,τ......
  • 【人工智能】Transformers之Pipeline(概述):30w+大模型极简应用
    ​​​​​​​目录一、引言 二、pipeline库2.1概述2.2使用task实例化pipeline对象2.2.1基于task实例化“自动语音识别”2.2.2task列表2.2.3 task默认模型2.3 使用model实例化pipeline对象2.3.1基于model实例化“自动语音识别” 2.3.2查看model与task的......
  • 十一、【机器学习】【监督学习】- 局部加权线性回归 (Locally Weighted Linear Regres
     系列文章目录第一章【机器学习】初识机器学习第二章【机器学习】【监督学习】-逻辑回归算法(LogisticRegression)第三章【机器学习】【监督学习】-支持向量机(SVM)第四章【机器学习】【监督学习】-K-近邻算法(K-NN)第五章【机器学习】【监督学习】-决策树(D......
  • Vue3中组件使用ref时获取组件类型推导
    本文由ChatMoney团队出品我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-PlusUI、NavieUI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例:<template><div><el-d......
  • Vue3中组件使用ref时获取组件类型推导
    本文由ChatMoney团队出品我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-PlusUI、NavieUI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例:<template><div><el-d......
  • datawhale第二期夏令营基于术语词典干预的机器翻译挑战赛——baseline【笔记】
    嗨!大家好,这一期我们来看一下夏令营所提供的baseline。首先,baseline是什么对于很多第一次参加datawhale夏令营的小伙伴,看到手册里发布的baseline,都会有这样的疑问。baseline是跑通比赛的第一个代码,里面用到的算法不会很复杂,更基础一些;本次baseline是构建和训练一个基于PyTorc......
  • [1030] Extract text between two specific phrases in a multi-line text
    Ah,theancientartoftextextraction—wherewedelveintothescrollsofPythonmagictorevealhiddenpassages!Fearnot,fellowseekerofknowledge;Ishallguideyouthroughthismysticalprocess.Toextracttextbetweentwospecificphrasesinamult......