【简介与代码下载】

在上一节中我们添加了一个三角网,碰撞是OptiX自动计算的。此时只需要根据碰撞点计算属性就可以了。本文介绍另一种添加方法,也即在shader中实时计算交点形状确定几何体的形状。本文添加一个球,并实时计算交点,在交点处计算法线属性。

链接:https://pan.baidu.com/s/1J4ojihgazzbumETi0nEa6A 
提取码:zd7h

下载解压后,请使用VS2015打开工程,并把当前配置调整为Debug和x64。另需要在默认路径安装OptiX6.0与CUDA10.0,可以参考我的这篇博文:【Optix】Optix介绍与示例编译

下面是运行结果,可以使用鼠标左键进行拖拽和右键进行拉近拉远。

【光线与球的求交】

光与球的求交在sphere.cu中进行计算,这里要特别解释一下其中的关键函数,通过主程序的如下语句我们设置了sphere.cu的光线求交启动函数为intersect_compute,包围盒计算程度为bounds,注意包围盒会先于光线求交调用,因为计算完包围盒才能确定其在场景加速结构中的顺序。并设置球的变量sphere的中心点为(-1.5, 1.0, 0.0)半径存放在第四个分量中为1.0。

    const char* ptxSphere = getPtxString("sphere.cu");sphere->setBoundingBoxProgram(context->createProgramFromPTXString(ptxSphere, "bounds"));sphere->setIntersectionProgram(context->createProgramFromPTXString(ptxSphere, "intersect_compute"));sphere["sphere"]->setFloat(-1.5f, 1.0f, 0.0f, 1.0f);//

那么光线我们已知Ray, 起点是origin,方向是direction,其光线方程是p=Ray.origin + t * Ray.direction。 p是光线上的点,t是参数。那么球的方程也有多种形式,此时我们使用其中一种形式对于球上的每一点p(x, y, z),则有:

 其中r是球的半径。首先来看代码,然后对照代码再看图解:

float iSphere(float3 ro, float3 rd)
{float3 oc = ro - make_float3(sphere);//ro-centerfloat b = dot(oc, rd);float c = dot(oc, oc) - sphere.w * sphere.w; //dot(oc,oc)-r*rfloat h = b*b - c; if (h < 0.0)return -1.0;float t = (-b - sqrt(h)); return t;
}

那么我们来做一张图来说明球与直线碰撞方程的求解,首先来看一个根的情况。

然后看没有根的情况:

双根的情况:

关于双根为什么是-b-sqrt(h),则可以做辅助e和f,f*f =dot(oc,oc)-b*b,  e*e=r*r - f*f = r*r-dot(oc,oc)+b*b=b*b-c =h

则根为-b-sqrt(h)与-b+sqrt(h)。

【求法线】

求法线就简单了,直接先求交点,拿交点减去球心:

geometric_normal = normalize(ray.origin + t*ray.direction - make_float3(sphere));

【OptiX】第2个示例 添加实时计算几何体以及计算法线等属性相关推荐

  1. 《机械师实时调度示例(I) - 实时规划》的视频翻译

    之前翻译了红帽2019年技术峰会上,OptaPlanner演示实时调度的一个案例中的文章.其中关于案例的讲解,最近有时间将它翻译一下,大家可以结合视频来细看该文章. <机械师实时调度示例(I) ...

  2. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 2 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  3. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 1 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  4. 【数据挖掘】卷积神经网络 ( 视觉原理 | CNN 模仿视觉 | 卷积神经网络简介 | 卷积神经网络组成 | 整体工作流程 | 卷积计算图示 | 卷积计算简介 | 卷积计算示例 | 卷积计算参数 )

    文章目录 I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 III . 卷积神经网络简介 IV . 卷积神经网络 组成 V . 卷积神经网络 工作流程 VI . 降低样本参数数量级 VI ...

  5. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost::crc_32_type crc32; crc32.process_by ...

  6. 流式计算、实时计算和离线计算

    流式计算和批处理计算 实时计算和离线计算 以水为例,Hadoop可以看作是纯净水,一桶桶地搬:而Storm是用水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了. 1.流式计算 ...

  7. 为potplayer播放器添加实时中文字幕

    为potplayer播放器添加实时中文字幕 大家好,现在的国外视频引进至国内后,也不再去进行中文配音了,而是直接出中文字幕.而那些不是通过正规途径进入中国的电影.视频,只有英文或者韩文或者其他国家的字 ...

  8. ios pusher使用_如何使用Pusher向Laravel添加实时通知

    ios pusher使用 现代网络用户希望了解应用程序内发生的所有事情. 您不希望成为一个没有通知下拉列表的网站,不仅在所有社交媒体网站中找到,而且在如今的所有其他地方也都找不到. 幸运的是,使用La ...

  9. 数据透视表(图)中添加公式计算与汇总--计算项和计算字段

    ↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 问题 最近有一个同学咨询了一个Excel问题如下: 原始数据如下表: 品牌 时间 产品数量 次品数量 A 2020/1/1 35 ...

最新文章

  1. 2015年的计算机二级考试题,2015年计算机二级考试《VFP》精选上机练习题
  2. MySQL复制的奇怪问题
  3. CSDN博客文章阅读模式插件(附源码)
  4. codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)
  5. (JAVA)多线程之wait()与notify()
  6. 解决dataTable 报错:cannot read property “style“ of undefined
  7. 尽量少一点甲方思维,也尽量少一点弱势方思维
  8. mysql in 按顺序排序_Mysql查询结果顺序按in()中ID的顺序排列的实例分析
  9. SSM : 环境搭建
  10. ServiceLoader用法demo
  11. NUC1445 Euclid's Game【博弈】
  12. 服务器共享文件有访问台数限制,Win7/xp系统下共享文件夹最大连接数限制怎么解除...
  13. 单机类似节奏大师游戏源码项目
  14. DV、OV、EV :SSL证书那么多,我该选择哪一种?
  15. scratch 游戏 打鬼游戏 教案
  16. 每天一kernel:正太概率图
  17. 泰坦尼克号预测python_泰坦尼克号生存预测(python)
  18. linux命名空间(namespace)学习(一)
  19. 运筹帷幄之中决胜千里之外 菜鸟初识代码编程规范二 命名规范
  20. 安装MS15-034漏洞补丁KB3042553失败

热门文章

  1. uva 11825 - Hackers' Crackdown dp
  2. 『天涯杂谈』 崖叔整容借鉴(给崖叔交作业啦)——对比人人 开心 猫扑 豆瓣 西祠 宽带山
  3. 提前完成的梦想,看我怎么做的
  4. ps常用的扣图工具有哪些,都有哪些方法
  5. 橄榄油的美容方法,橄榄油的正确用法
  6. 设有关系模式R(A,B,C,D),F是R上成立的FD集,F={D→A,D→B},试写出关系模式R的候选健
  7. Windows下的影子账户创建与防范
  8. 【Access数据库】关于带参数的交叉表查询
  9. 论多窗口相互关联下window.open打开已在的窗口时只激活不刷新的实现方案
  10. java设置文本框里字体颜色_swing设置字体颜色