スポンサーリンク

glm::intersectRayTriangleについて

三角形とレイの交点を求める。

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

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

}

重心座標系について。

というかこのプログラムの色算出間違っていた。上が正解。体力があれば下記事も修正する。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: