光线求交-面、三角形、球 (Ray intersection)
光线求交
- 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\);
- 球定义: center p, radius r;
- 平面定义:normal \(\vec{n}\) , offset t;
- 三角形定义:position \(a_1\), \(a_2\), \(a_3\), normal \(\vec{n}\);
光线与球相交 (Ray/Sphere Intersection)


c++代码 :
bool HitTest(const Ray& ray, HitTestResult* result)
{
Vector eo = Center - ray.Position;
float v = eo * ray.Direction;
auto disc = Radius * Radius - (eo * eo) + v * v;
if (disc < 0) return false;
disc = v - sqrt(disc);
if (disc < 0.001f || disc >= ray.MaxDistance) return false;
result->Shape = const_cast<Sphere*>(this);
result->Normal = (disc * ray.Direction - eo).Normalize();
result->Distance = disc;
return true;
}
光线与平面相交 (Ray / Plane Intersection)
线与平面相交 Ray/Plane Intersection
平面在空间几何中可以用一个向量(法向量)和平面中的一点P0来表示。
平面就是满足下式的点集:\(\vec{n}(\vec{P}-\vec{P_0})= 0\)
得到:\(\vec{n}\cdot\vec{P}=d\); \(d=\vec{n}\cdot\vec{P_0}\);
给定射线r(t) = o +td,平面方程为n.p+d=0,将p(t)带入到平面方程,最后求得t:
\(t = (-d-(\vec{n}\cdot\vec{p_0}))/(\vec{n}\cdot\vec{d})\)


c++代码:
bool HitTest(const Ray& ray, HitTestResult* result)
{
auto denom = Normal * ray.Direction;
if (denom > 0) return false;
auto d = (Normal * ray.Position + Offset) / (-denom);
if (d >= ray.MaxDistance) return false;
result->Shape = const_cast<Plane*>(this);
result->Normal = Normal;
result->Distance = d;
return true;
}
光线与三角形相交 (Ray/Triangle Intersection)
- 判断射线是否与平面相交
- 判断点是否在三角形内
//构造函数:
Triangle(const Vector& Point1, const Vector& Point2, const Vector& Point3)
: Point1(Point1), Point2(Point2), Point3(Point3)
{
auto n1 = Point2 - Point1;
auto n2 = Point3 - Point1;
normal = Vector::Cross((Point2 - Point1), (Point3 - Point1)).Normalize();
}
bool HitTest(const Ray& ray, HitTestResult* result)
{
float eo;
if (normal.Length() != 0 && (eo = ray.Direction * normal) < 0)
{
auto S = (Point1 - ray.Position) * normal / eo;
if (S < 0.001f || S >= ray.MaxDistance)
return false;
auto V = S * ray.Direction + ray.Position;
if (IsInner(V))
{
result->Shape = const_cast<Triangle*>(this);
result->Normal = normal;
result->Distance = S;
return true;
}
return false;
}
return false;
}
另一种方法:[用三角形重心求交

光线求交-面、三角形、球 (Ray intersection)的更多相关文章
- ray与triangle/quad求交二三事
引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...
- 一步一步实现基于GPU的pathtracer(二):求交算法
不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...
- [NetTopologySuite](2)任意多边形求交
任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...
- HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)
pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...
- OpenCASCADE 平面求交
OpenCASCADE 平面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二 ...
- 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并
[练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...
- 一个好用的多方隐私求交算法库JasonCeng/MultipartyPSI-Pro
Github链接传送:JasonCeng/MultipartyPSI-Pro 大家好,我是阿创,这是我的第29篇原创文章. 今天是一篇纯技术性文章,希望对工程狮们有所帮助. 向大家推荐一个我最近改造的 ...
- 试题系列四(袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6))
1.袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6) #include<stdio.h> int main(int argc, char** argv) ...
- hdu 5111 树上求交
hdu 5111 树上求交(树链剖分 + 主席树) 题意: 给出两棵树,大小分别为\(n1\),\(n2\), 树上的结点权值为\(weight_i\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...
随机推荐
- ZOJ 3778 C - Talented Chef 水题
LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3778 题意:有n道菜,每道菜需要\(a_i\)道工序,有m个锅可 ...
- Codeforces 450B div.2 Jzzhu and Sequences 矩阵快速幂or规律
Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...
- 绝妙的SQL行列转换语句
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法. 问题:假设有张学生成绩表( ...
- javascript复习笔记
/* Javascript:用来在页面中编写特效,和HTML.CSS一样都是有浏览器解析 Javascript语言: 一.JS如何运行(javascript,jscript,vbscript,appl ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- C++ 模板特化以及Typelist的相关理解
近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值 ...
- MySQL常见错误代码说明
附:MySQL常见错误代码说明 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据 ...
- HDU 6187 Destroy Walls (对偶图最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6187 题意:有一个V个结点M条边的带边权无向平面图,有一个人在一个区域,要拆一些墙使得他可以到达任意一 ...
- mysql 创建数据库的时候选择 utf8 bin 和 utf8 ci的区别
utf8 ci 不区分大小写: utf8 bin 区分大小写:
- nexus 安装配置
一.下载Nexus http://nexus.sonatype.org/downloads 我是用的版本是 nexus-2.11.4-01-bundle.tar.gz 每个版本的配置有些许差别. 二. ...