RayMarching中的SDF法线计算方法

在这里插入图片描述
本文参考自:normals for an SDF - 2015
在做RayMarching时,我们获得距离和位置信息后,为了进一步做光照渲染,需要得到物体表面的法线信息。

因为我们已经得到了空间中点的位置信息p,以及每个点到最近曲面的距离d,所以可以通过标量函数f§ = d构建一个[标量场( scalar field )]当距离d为一个常量C时,所有距离为C的点p会形成一个表面,这就是这个标量场的等值面,我们要求法线的面就是场景中d=0的面,所以f(p)= 0所表示的等值面就是物体的表面,根据向量场梯度的定义,假设向量G 过任意点p,p在这个向量上运动带来的f(p)的变化最大,则这个向量G称之为函数f(p)在p点的梯度,因为梯度必定垂直标量函数f(p)的等值面,所以物体表面的法线就是当f(p)= 0时所有p点位置的梯度。

根据梯度计算公式有:
在这里插入图片描述
当然这里我们不需要计算导数,根据极限的思想,和导数的定义,当点p的在各个轴上的位移足够小时,在x轴上的导数可以写作:

在这里插入图片描述
这当中h就是那个最小值,当然这种方法会更偏向正轴,我们可以使用中心差分法来校正:
在这里插入图片描述
因为向正负轴个移动了h个单位所以,需要除以2h个单位,加上另外两个轴:
在这里插入图片描述
这里直接去掉了2h因为对于法线这种不需要长度只需要方向的单位,归一化后自然抵消掉长度信息。
当然这种方式虽然精度较高但明显损耗也较大,所以我们也可以使用正向差分法代替

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab,可以使用libigl或者cgal库的函数来调用SDF(Signed Distance Function)函数。具体来说,可以使用cgal库sdf_values函数来计算SDF值。在编译gptoolbox时,可以使用cmake来生成sdf_values.mexw64文件。然后,在Matlab客户端,可以通过以下命令调用该函数: [~, fsdf] = sdf_values(V1', F1', 2*pi/3, 8, 1); 这将计算出V1和F1表示的三维几何体的SDF值,并将结果存储在fsdf变量。请注意,为了使用该函数,需要先启动Matlab进程。如果Matlab进程已经启动,则MLOpen函数不进行任何操作;如果关闭了Matlab进程,则可以使用MLOpen来重新启动Matlab。此外,sdf_values函数只能在宏子例程使用,因此需要在MLAutoStart函数使用"no"参数,手动使用Matlabinit来初始化ExcelLink和启动Matlab进程。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* [matlab编译并使用sdf_values](https://blog.csdn.net/zjf6738/article/details/127574835)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* *4* [matlab sdf文件怎么打开,sdf文件格式变成excel后如何还原](https://blog.csdn.net/weixin_36477752/article/details/115940276)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值