记录一下:

在看Muli3D的RayTracing 的过程中,看到在PS中进行处理 Ray 和 Sphere 是否相交,并且计算交点,现在推导一下过程。

具体的代码:

const vector3 vSphereOrigin( vSphereData.r, vSphereData.g, vSphereData.b );const float32 fSphereRadius = vSphereData.a;// vDiff 是ray.origin 指向球心 的向量const vector3 vDiff = vSphereOrigin - i_vRayOrigin;//  vDiff 在 i_vRayDir的投影const float32 fV = fVector3Dot( vDiff, i_vRayDir );//  fVector3Dot( vDiff, vDiff )就是 vDiff 的长度的平方// (是ray.origin 指向球心 的向量的长度的平方)float32 fDist = fSphereRadius * fSphereRadius + fV * fV - fVector3Dot( vDiff, vDiff );// ray 碰不到 shpere的情况下if( fDist < 0.0f )continue;// 计算距离fDist = fV - sqrtf( fDist );if( fDist >= 0.0f ){// collision with sphere// 计算出ray 碰撞到的 最小的距离 的球if( fDist < fCollisionDistance ){fCollisionDistance = fDist;iCollsionSphere = iSphere;// 计算 交点 (World space)vCollisionPoint = i_vRayOrigin + i_vRayDir * fCollisionDistance;//  计算 法线 (World space)vCollisionNormal = vCollisionPoint - vSphereOrigin;}}

1. 判断圆与Ray是否相交

vDiff = B - A, 那就是 A 指向 B 的向量

fV 就是  AB向量在Ray的投影,投影长度, (代码i_vRayDir 是一个单位向量),所以,fV = AC

代码中 float32 fDist = fSphereRadius * fSphereRadius + fV * fV - fVector3Dot( vDiff, vDiff );

fVector3Dot( vDiff, vDiff ) -> vDiff 长度的平方,那就是AB^2

fDist 结合图中得到的就是

fDist = R^2 + fV ^2 - vDiff ^ 2

->R^2 +  AC ^2 - AB ^ 2

根据勾股定理:

d^2 = AB ^ 2 -  AC ^2

所以得到

fDist = R^2  - d^2

所以,fDist 就是图中的 y^2 ,

那么到这里就知道,其实代码是利用 圆心到Ray的距离 与 圆的半径 的大小比较 来判断 Ray是否与圆相交。

2. 计算圆与Ray的交点

代码 : fDist = fV - sqrtf( fDist ); 表示什么意思呢,结合图

fDist =  AC - sqrtf( R^2  - d^2 )

留意图,其实还有一个关系:

x^2  = R^2  - d^2

得到的

fDist = AC - x

那么就可以得到 fDist 就是 Ray 的原点 与 圆相交点的距离,距离知道了,就可以直接计算交点了。

所以就有

vCollisionPoint = i_vRayOrigin + i_vRayDir * fCollisionDistance;

Muli3D 7 判断Ray与Sphere的关系相关推荐

  1. Java判断类和实例的关系

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. 辐角原理判断点和多边形的关系

    辐角判断点和多边形的关系 一.辐角原理 二.适用条件 三.算法效果 四.matlab代码实现 \qquad标题写的多边形,然而在现实情况中多边形只是该问题的一个子集:我们先讲点和连通域的关系,点和多边 ...

  3. 判断点与圆的关系 点类与圆类 C++

    创建点类,圆类. 将其属性都设置为私有,并提供固定公共接口可以对其值进行修改. 原理就是坐标系中两点距离的判断. #include <iostream> using namespace s ...

  4. 海伦公式判断点和三角形的关系

    一 海伦公式 如果有一个三角形,它的三边分别为 $a, b ,c $, 则三角形的面积为 A=s(s−a)(s−b)(s−c)A = \sqrt{s(s-a)(s-b)(s-c)}A=s(s−a)(s ...

  5. 判断点与多边形的关系(1):向量积法

    判断点与多边形的关系,是计算几何的经典问题,点与多边形的关系可以分为:点在多边形内(inside).点在多边形外(outside)以及点在多边形的边上(onside)三种. 在图像处理系统中,如果通过 ...

  6. Muli3D 5 判断点与面的关系

    记录一下: 点与面的关系如图: 如果法相量是单位向量的话,那么分母为1 所以,当 平面的法向量是单位向量的话,看一个点与平面的关系的公司就是分子: Ax0 + By0 + Cz0 + D 在Muli3 ...

  7. 判断类之间的父子关系

    如何判断两个类之间的父子关系? java为我们提供了instanceof运算符,可以用来判断一个对象是否是否个类的实例,所以很容易的想到子类的对象肯定是父类的实例.但是如何所涉及到的类是不可实例化的该 ...

  8. 神秘大三角(判断点与三角形的关系)

    题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...

  9. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)

    题干: Calculate the number of toys that land in each bin of a partitioned toy box.  Mom and dad have a ...

最新文章

  1. Spring Boot实战:静态资源处理
  2. apue学习笔记(第三章 文件I/O)
  3. 深入浅出学Hive:Hive高级编程
  4. 条件编译指令:#if,#endif
  5. android中的so加固,so加固-加密特定section中的内容
  6. Xtreme ToolkitPro 编译选项
  7. BIEE叙述图导航实例
  8. Docker网络解决方案-Weave部署记录
  9. 【问题解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法...
  10. 供给、需求、有效供给、有效需求
  11. 浏览器野史 UserAgent列传
  12. Oracle项目管理系统之合同台账
  13. UWB室内定位系统,你知道几分
  14. 建行网银盾无法识别怎么办
  15. SQL Server-【知识与实战III】年龄查询、条件查询、多表查询、姓氏查询
  16. 263企业邮箱:客户端授权码登录
  17. php网站恶意注册表,利用注册表对付恶意网站篡改IE主页
  18. 网站压力测试工具was
  19. JVM类加载过程,JDK和JER区别
  20. 数字IC验证:Hands-on Coding之Harness Interface与内部的Interfaces

热门文章

  1. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
  2. 七牛云上传图片并返回图片URL
  3. 什么是java双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...
  4. 企业落地级jmeter性能测试,结果分析以及报告(4-3)
  5. C++11 ThreadPool总结
  6. Android 的四大组件
  7. HTML(二)列表、表格、表单元素
  8. 计算机控制键功能,电脑ctrl键的功能
  9. 磁盘无损简单卷转主分区
  10. 周明:NLP进步将如何改变搜索体验