光线求交

  • 光线定义: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. javascript中字符串的两种定义形式

    1.var s = "this is a string";  var t = "this is also a string"; s.test = 20; 2.v ...

  2. 51nod1056 最长等差数列 V2

    基准时间限制:8 秒 空间限制:131072 KB 分值: 1280  N个不同的正整数,从中选出一些数组成等差数列.   例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括 ...

  3. iOS静态库 ---iOS-Apple苹果官方文档翻译

    iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...

  4. Three.js基础探寻五——正二十面体、圆环面等

    除了立方体.平面.球体,Three.js还提供了很多其他几何形状. 1.圆形 CircleGeometry可以创建圆形或者扇形: THREE.CircleGeometry(radius, segmen ...

  5. 记点事! oracle 调用外部命令

    oracle执行系统命令   测试成功环境:windows XP+oracle 10g.window 2008 R2 + 11g   代码如下: www.2cto.com   Sql代码   crea ...

  6. NGUI优化之Drawcall

    今天在运行之前的程序时,无意中发现一个简单的menu菜单页面drawcall居然达到接近30了,这个数值感觉太高了. 后网上查询关于降低drawcall的方法,发现主要有以下几点: 1.少用Panel ...

  7. [重磅]Deep Forest,非神经网络的深度模型,周志华老师最新之作,三十分钟理解!

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 深度学习最大的贡献,个人认为就是表征 ...

  8. 教你如何更改android应用的包名

    Android 源码自带了很多应用程序,想改个包名方便修改?很简单,两步搞定,以packages/apps/Settings为例: 1.打开AndroidManifest.xml,把 <mani ...

  9. css实现一行居中显示,两行靠左显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解决wordpress无法发送邮件的问题|配置好WP-Mail-SMTP的前提

    我的WordPress主机是万网的,配置WP-Mail-SMTP时一直无法发送邮件,导致设置失败.经过多次询问度娘才找到了解决wordpress无法发送邮件的方法,在这里把这个wordpress技巧分 ...