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);
}