三角形とレイの交点を求める。
void draw_intersect() { // 三角形を定義 auto p0 = glm::vec3(-0.944245, 1.16309, -0.236938); auto p1 = glm::vec3(1.10855, -0.444616, 0.859098); auto p2 = glm::vec3(-0.21789, -0.660092, -0.62216); // レイの定義 auto origin = glm::vec3(-0.846075, -0.217401, 0.880718); // レイ始点 auto endp = glm::vec3(0.356164, -0.323941, -1.58961); // レイ終点 auto dir = glm::normalize(endp - origin);// レイ方向計算+normalize glm::vec2 bary;// 重心座標系のu,v float distance;// originから交点までの距離 glm::intersectRayTriangle(origin, dir, p0, p1, p2, bary, distance); // 三角形の描画 glBegin(GL_TRIANGLES); glColor3d(1, 0, 0); glVertex3fv(glm::value_ptr(p0)); glColor3d(0, 1, 0); glVertex3fv(glm::value_ptr(p1)); glColor3d(0, 0, 1); glVertex3fv(glm::value_ptr(p2)); glEnd(); // レイを表示 glColor3d(1, 1, 1); glLineWidth(1); glBegin(GL_LINES); glVertex3fv(glm::value_ptr(origin)); glVertex3fv(glm::value_ptr(endp)); glEnd(); glLineWidth(3); glColor3d(1, 1, 1); glBegin(GL_LINES); glVertex3fv(glm::value_ptr(origin)); glVertex3fv(glm::value_ptr(origin + dir * distance)); glEnd(); // 交点を強調表示 glColor3f(1, 1, 1); glPointSize(15); glBegin(GL_POINTS); glVertex3fv(glm::value_ptr(origin + dir * distance)); glEnd(); }
baryPositionは重心座標系を返す。重心座標系はu,v,wで表せるが、u+v+w==1なので、w=1-u-vとなる。従ってbaryPositionにはu,vしか入っていない。wは自分で計算する。
void draw_intersect2() { auto p0 = glm::vec3(-0.944245, 1.16309, -0.236938); auto p1 = glm::vec3(1.10855, -0.444616, 0.859098); auto p2 = glm::vec3(-0.21789, -0.660092, -0.62216); auto origin = glm::vec3(-0.846075, -0.217401, 0.880718); auto endp = glm::vec3(0.356164, -0.323941, -1.58961); auto dir = glm::normalize(endp - origin); glm::vec2 bary; float distance; glm::intersectRayTriangle(origin, dir, p0, p1, p2, bary, distance); // 重心座標系 float u = bary.x; float v = bary.y; float w = 1-u-v; // 三角形の頂点の色 glm::vec3 r(1, 0, 0); glm::vec3 g(0, 1, 0); glm::vec3 b(0, 0, 1); // 交点の色を重心座標系から求める glm::vec3 cc = w * r + u * g + v * b; // 三角形の描画 glBegin(GL_TRIANGLES); glColor3fv(glm::value_ptr(r)); glVertex3fv(glm::value_ptr(p0)); glColor3fv(glm::value_ptr(g)); glVertex3fv(glm::value_ptr(p1)); glColor3fv(glm::value_ptr(b)); glVertex3fv(glm::value_ptr(p2)); glEnd(); // レイを表示 glColor3d(1, 1, 1); glLineWidth(1); glBegin(GL_LINES); glVertex3fv(glm::value_ptr(origin)); glVertex3fv(glm::value_ptr(endp)); glEnd(); glLineWidth(3); glColor3d(1, 1, 1); glBegin(GL_LINES); glVertex3fv(glm::value_ptr(origin)); glVertex3fv(glm::value_ptr(origin + dir * distance)); glEnd(); // 交点を表示 glPointSize(20); glColor3f(1,1,1); glBegin(GL_POINTS); glVertex3fv(glm::value_ptr(origin + dir * distance)); glEnd(); glPointSize(15); glColor3fv(glm::value_ptr(cc)); glBegin(GL_POINTS); glVertex3fv(glm::value_ptr(origin + dir * distance)); glEnd(); }
重心座標系について。
というかこのプログラムの色算出間違っていた。上が正解。体力があれば下記事も修正する。