SDF Line相关公式推导
SDF Line相关公式推导
线段是SDF形状的基元之一,可以被用来建模一些形状,比如昆虫的腿,植物的根茎等。
![]() |
![]() |
|---|
下面这篇文章介绍一下Line公式的推导,首先记住我们要求的变量,点到形状最近的距离。
那么对于空间中的点\(P_1, P_2, P_3\),他们的分布有如下三种

其中\(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}\)的长度。
\]
此时投影长度的比例可以定义为:
\]
熟悉这个求解投影长度的代码之后,在看一下另外两个点\(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}\)的长度,这里大致如图:

但是这段代码运行起来是看不到任何东西的,我们还需要减去一个 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
SDF Line相关公式推导的更多相关文章
- Cache Line 伪共享发现与优化
https://yq.aliyun.com/articles/465504 Cache Line 伪共享发现与优化 作者:吴一昊,杨勇 1. 关于本文 本文基于 Joe Mario 的一篇博客 改编而 ...
- [C++]现行的试卷封面并获取学生题目得分信息以及学号信息的原型系统
大二的时候写的一个CV小玩意,最终决定还是把它放出来,也许会帮助到很多人,代码写的很丑,大家多多包涵.附加实验报告主要部分. 课题背景及意义: 本项目主要目标是设计一套能自动分析我校现行的试卷封面并获 ...
- 一个前端程序猿的Sublime Text3的自我修养
来源于:http://guowenfh.github.io/2015/12/26/SublimeText/ 详细设置 && 20+插件 本文章会在本人有插件或者设置更新时,进行不定时更 ...
- 干货之运用CALayer创建星级评分组件(五角星)
本篇记录星级评分组件的创建过程以及CALayer的运用. 为了实现一个星级评分的组件,使用了CALayer,涉及到mask.CGPathRef.UIBezierPath.动画和一个计算多角星关键节点的 ...
- iOS----友盟分享完善版本
分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...
- 为什么要选择Sublime Text3?
为什么要选择Sublime Text3? Sublime Text3 自动保存,打开图片 跨平台启动快!!!!多行游标,太好用. 插件,简直选不过来. 代码片段 VIM兼容模式 菜单栏基础功能介绍 F ...
- opencv笔记5:频域和空域的一点理解
time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...
- 有关线程安全的探讨--final、static、单例、线程安全
我的代码中已经多次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很多地方最容易提的问题就是这个东西线程不安全 于是我不免产生了以下几个亟待解决的问题: 什么样的代码是天生线程 ...
- 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】
P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
随机推荐
- 即时通讯技术文集(第14期):WebSocket精华文章合集 [共15篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第14 期. [- 1 -] 新手快速入门:WebSocket简明教程 [链接] http://w ...
- 《CUDA编程:基础与实践》读书笔记(4):CUDA流
1. CUDA流 一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列.除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者.一个CUDA流中的各个操作按照主机发布的次序执行:但来 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 21 期(2025年1.6-1.12)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- 【转载】Geojson常用工具,收藏备用
收集了网上几个比较好用的网站,收藏备用 1.Geojson数据下载器:http://datav.aliyun.com/tools/atlas/#&lat=33.54139466898275&a ...
- 基于同态加密的PSI开源库-1
下面介绍一个PSI的开源库,还原论文:CCS2017:Fast Private Set Intersection from Homomorphic Encryption和CCS2018:Labeled ...
- 对象流的序列化与反序列化:ObjectInputStream 和 ObjectOutputStream
1.对象流: ObjectInputStream 和 ObjectOutputStream2.作用:ObjectOutputStream:内存中的对象--->存储中的文件.通过网络传输出去:序列 ...
- Iceberg治理服务Amoro---配置Prometheus + Grafana看板
一.基础资料 1.mac安装Prometheus + Grafana https://www.cnblogs.com/robots2/p/18689540 2.配置文档 https://amoro.a ...
- mac安装spark
一.基础信息 spark版本:spark-3.1.3-bin-hadoop3.2 hadoop版本:hadoop-3.2.1 scala版本:scala-2.11.12 建议3.12版本 下载地址: ...
- 【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库(文末附笔记及材料)
一.总体方案 目前在使用 DeepSeek 在线环境时,页面经常显示"服务器繁忙,请稍后再试",以 DeepSeek R1 现在的火爆程度,这个状况可能还会持续一段时间,所以这里给 ...
- TypeScript 中的 type 和 interface:你真的了解它们的不同吗?
如果你有写过 Vue3 的项目,那么对 TypeScript 肯定不会陌生.不管是公司新项目技术选型还是个人学习开发新的前端项目,Vue3 + TypeScript 已经成为首选技术方案之一 在 Ty ...

