光线求交

  • 光线定义: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)的更多相关文章

  1. ray与triangle/quad求交二三事

    引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...

  2. 一步一步实现基于GPU的pathtracer(二):求交算法

    不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...

  3. [NetTopologySuite](2)任意多边形求交

    任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...

  4. HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)

    pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...

  5. OpenCASCADE 平面求交

    OpenCASCADE 平面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二 ...

  6. 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并

    [练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...

  7. 一个好用的多方隐私求交算法库JasonCeng/MultipartyPSI-Pro

    Github链接传送:JasonCeng/MultipartyPSI-Pro 大家好,我是阿创,这是我的第29篇原创文章. 今天是一篇纯技术性文章,希望对工程狮们有所帮助. 向大家推荐一个我最近改造的 ...

  8. 试题系列四(袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6))

    1.袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6) #include<stdio.h> int main(int argc, char** argv) ...

  9. hdu 5111 树上求交

    hdu 5111 树上求交(树链剖分 + 主席树) 题意: 给出两棵树,大小分别为\(n1\),\(n2\), 树上的结点权值为\(weight_i\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...

随机推荐

  1. HDU 4978 计算 凸包

    有以无限间隔$D$的水平线分割的平面,在上面随机投下一个圆,圆中有一些点,点之间两两成一条线段,问随机投下至少有一条线段于平行线相交的概率. 以下是不严(luan)谨(lai)的思路. 首先都知道对于 ...

  2. ZOJ 3780 E - Paint the Grid Again 拓扑排序

    https://vjudge.net/problem/49919/origin 题意:给你n*n只出现O和X的字符阵.有两种操作,一种操作Ri将i行全变成X,一种操作Ci将i列全变成O,每个不同的操作 ...

  3. TabLayout 使用方法 (基础)

    此为布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:a ...

  4. C11线程管理:条件变量

    1.简介 C11提供另外一种用于等待的同步机制,它可以阻塞一个或者多个线程,直到收到另外一个线程发出的通知或者超时,才会唤醒当前阻塞的线程.条件变量要和互斥量配合起来使用. condition_var ...

  5. 重构改善既有代码设计--重构手法10:Move Method (搬移函数)

    你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机: ...

  6. JQuery对RadioButton和CheckButton的操作

    js对RadioButton和CheckButton的操作,在网站开发中会经常遇到,而JQuery操作RadioButton和CheckButton非常便捷.小编觉得网站开发人员有必要熟练掌握.所以小 ...

  7. 【NOIP2013提高组T3】加分二叉树

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  8. HDU 1577 WisKey的眼神 (找规律 数学)

    题目链接 Problem DescriptionWisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵 ...

  9. [\u4e00-\u9fa5] //匹配中文字符

     [\u4e00-\u9fa5] //匹配中文字符 ^[1-9]\d*$    //匹配正整数^[A-Za-z]+$   //匹配由26个英文字母组成的字符串^[A-Z]+$      //匹配由26 ...

  10. B2旅游签证记

    先去https://ceac.state.gov/ceac/,选择DS-160表格,在线申请登记个人信息 ,选择大事馆“CHINA BEIJING”和验证码,点 Start an Applicatio ...