学习光线追踪(10)---三角形

0.简介

在OpenGL或者D3D中,都有一个最基本的图元,就是三角形,三角形可以组成任意形状,并且计算起来也容易,为了能让我们绘制出更多的形状,这次来实现一个三角形类。

1.三角形判断

三角形在空间中形成了一个平面,所以,三角形一定在某个平面上,所以先判断光线是否能打到扫三角形所在平面,如果光线打到了三角形所在平面,那么再计算打在平面上的点是否在三角形内。判断光线是否打在平面上已经在上一节平面中实现了,现在要实现的判断点在三角形内,这里使用的方法是,将三角形三个点和待判断点形成三个向量,两两计算叉积,三个叉积方向一样就说明点在三角形内。另一种就是判断三个向量的角度之和,效果最后都一样。

2.实现

Ray Triangle::intersect(Ray ray)
{
	Ray result(ray.direction, ray.position, ray.intensity, ray.color, nullptr);
	
	if ((result = Plane::intersect(ray)).polygon == nullptr)
		return Ray(ray.direction, ray.position, ray.intensity, vec3(0, 0, 0), nullptr);

	//判断是否在三角形内
	vec3 a = normalize((wA - result.end));
	vec3 b = normalize((wB - result.end));
	vec3 c = normalize((wC - result.end));
	//在三角形内部
	//double angle = (acos(dot(a, b))+ acos(dot(b, c))+ acos(dot(c, a)))* R_ANGLE;
	//if (fabs(angle-360.0)<1)
	//{
	//	return result;
	//}
	vec3 sa = normalize(cross(a, b));
	vec3 sb = normalize(cross(b, c));
	vec3 sc = normalize(cross(c, a));
	if(dot(sa,sb) >0.999 && dot(sb,sc) >0.999 && dot(sc,sa) >0.999)
		return result;
	return Ray(ray.direction, ray.position, ray.intensity, vec3(0, 0, 0), nullptr);
}

3.结果

三角形

4.源码

release 0.05

发布了64 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ARTELE/article/details/103793588
今日推荐