光线求交-面、三角形、球 (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\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...
 
随机推荐
- Image Scaling using Deep Convolutional Neural Networks
			
Image Scaling using Deep Convolutional Neural Networks This past summer I interned at Flipboard in P ...
 - Python print "hello world" SyntaxError: invalid syntax
			
刚安装Python,在IDLE中输入print “Hello World”,谁知却发生错误: >>> print "Hello World"SyntaxError ...
 - 【BZOJ4565】【HAOI2016】字符合并 [状压DP][区间DP]
			
字符合并 Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为 n 的 01 串,你 ...
 - CodeForces - 999C
			
You are given a string ss consisting of nn lowercase Latin letters. Polycarp wants to remove exactly ...
 - 旅游(CSUST省赛选拔赛2+状压dp+最短路)
			
题目链接:http://csustacm.com:4803/problem/1016 题目: 思路:状压dp+最短路,比赛的时候有想到状压dp,但是最短路部分写挫了,然后就卡死了,对不起出题人~dis ...
 - CentOS7最小化安装连接到网络的解决方案
			
周末在家想装个虚拟机学一下Hadoop啥的,因为网速小水管比较慢所以下载的是CentOS的minimal版本的: 这个版本安装完之后默认是没有安装net-tools的,也就是说ifconfig不能用: ...
 - java类中访问属性
			
package first; public class for_protect { private int age=10; int number = 100; public void show(){ ...
 - angular 最大字数限制
			
js可以通过onkeyup onkeydown判断当前节点字数. angular可以通过监听的方式: $scope.input = {//初始化,避免ng-model绑定取不到值 MaxBT:'', ...
 - utsrelease.h 包含svn信息
			
utsrelease.h是一个自动生成的文件,没有办法修改,但这个数据是根据Makefile和.config的内容进行生成的,通过修改这两个文件的内容,可以改变!/usr/src/linux/Make ...
 - kernel编译速度提高
			
1. 使用tmpfs来代替部分IO读写 2. ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失 3.distcc,多机器编译 4.将 ...