아래 링크를 참조해서 만들었다. 사실 거의 그대로고 vec3 인터폴레이션 하는 부분만 추가한것이다.
static bool PointInTriangle(const vec3& A, const vec3& B, const vec3& C, const vec3 &P, const vec3& valueA, const vec3& valueB, const vec3& valueC, vec3& returnValue)
{
using namespace graphics;
// Compute vectors
vec3 v0 = C - A;
vec3 v1 = B - A;
vec3 v2 = P - A;
// Compute dot products
real dot00 = inner(v0, v0);
real dot01 = inner(v0, v1);
real dot02 = inner(v0, v2);
real dot11 = inner(v1, v1);
real dot12 = inner(v1, v2);
// Compute barycentric coordinates
real invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
real u = (dot11 * dot02 - dot01 * dot12) * invDenom;
real v = (dot00 * dot12 - dot01 * dot02) * invDenom;
// Check if point is in triangle
bool b = (u > 0) && (v > 0) && (u + v < 1);
if(b)
{
// line C-A
vec3 ca((valueC.v[0]-valueA.v[0])*u, (valueC.v[1]-valueA.v[1])*u, (valueC.v[2]-valueA.v[2])*u);
//ca = valueA + ca;
// line B-A
vec3 ba((valueB.v[0]-valueA.v[0])*v, (valueB.v[1]-valueA.v[1])*v, (valueB.v[2]-valueA.v[2])*v);
//ba = valueA + ba;
returnValue = valueA + ba + ca;
}
return b;
}
{
using namespace graphics;
// Compute vectors
vec3 v0 = C - A;
vec3 v1 = B - A;
vec3 v2 = P - A;
// Compute dot products
real dot00 = inner(v0, v0);
real dot01 = inner(v0, v1);
real dot02 = inner(v0, v2);
real dot11 = inner(v1, v1);
real dot12 = inner(v1, v2);
// Compute barycentric coordinates
real invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
real u = (dot11 * dot02 - dot01 * dot12) * invDenom;
real v = (dot00 * dot12 - dot01 * dot02) * invDenom;
// Check if point is in triangle
bool b = (u > 0) && (v > 0) && (u + v < 1);
if(b)
{
// line C-A
vec3 ca((valueC.v[0]-valueA.v[0])*u, (valueC.v[1]-valueA.v[1])*u, (valueC.v[2]-valueA.v[2])*u);
//ca = valueA + ca;
// line B-A
vec3 ba((valueB.v[0]-valueA.v[0])*v, (valueB.v[1]-valueA.v[1])*v, (valueB.v[2]-valueA.v[2])*v);
//ba = valueA + ba;
returnValue = valueA + ba + ca;
}
return b;
}