レイと三角形との交差判定

  • サンプルデータのイメージ

  • サンプルコード
#include<stdio.h>

double tri[3][3]={ // 三角形
	{10, 50, 40},
	{-40, 70, -10},
	{2, 8, -25}
};

double lay[2][2][3]={
	{{-80, 3, 0}, {60, 70, 0}}, // 交わる光線
	{{10, 120, 30}, {160, 230, -30}}, // 交わらない光線
};

int intersect_triangle(double orig[3], double dir[3],
		       double vert0[3], double vert1[3], double vert2[3],
		       double *t, double *u, double *v);

int intersect_triangle1(double orig[3], double dir[3],
			double vert0[3], double vert1[3], double vert2[3],
			double *t, double *u, double *v);

int intersect_triangle2(double orig[3], double dir[3],
			double vert0[3], double vert1[3], double vert2[3],
			double *t, double *u, double *v);

int intersect_triangle3(double orig[3], double dir[3],
			double vert0[3], double vert1[3], double vert2[3],
			double *t, double *u, double *v);

main()
{
	int ret;
	double t, u, v;

	// intersect_triangle()
	printf("intersect_triangle():\n");
	ret = intersect_triangle(lay[0][0], lay[0][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay1 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	ret = intersect_triangle(lay[1][0], lay[1][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay2 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	// intersect_triangle1()
	printf("intersect_triangle1():\n");
	ret = intersect_triangle1(lay[0][0], lay[0][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay1 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	ret = intersect_triangle1(lay[1][0], lay[1][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay2 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	// intersect_triangle2()
	printf("intersect_triangle2():\n");
	ret = intersect_triangle2(lay[0][0], lay[0][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay1 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	ret = intersect_triangle2(lay[1][0], lay[1][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay2 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	// intersect_triangle3()
	printf("intersect_triangle3():\n");
	ret = intersect_triangle3(lay[0][0], lay[0][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay1 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);

	ret = intersect_triangle3(lay[1][0], lay[1][1],
		tri[0], tri[1], tri[2],
		&t, &u, &v);
	printf("    lay2 ret = %d, t = %g, u = %g, v = %g\n",
		ret, t, u, v);
}
  • 結果

それぞれの関数は速度以外にUVの扱いが違う