Disk
今回は円を扱う.
円の描画は結構単純で面白いロジックでいける.
まず最初に平面の判定、これは単純では以下の式で求まるのだった.
これに対して別の変数として
centerとradiusを用意する.円の中心が
centerで円の半径がradiusである.さて、平面に当たっているとすると、平面上のは求まっていることになる.
後はこのを使って位置をで求まる.
この位置と円の中心の距離が
radius内に収まってればOK.つまり,
で求まる.
後はこれをコードに落とし込む.
まずはが平面内かの判定を行う.
double t = Dot(m_center - ray.origin.xyz(), m_normal) / Dot(ray.direction, m_normal);
if (t <= EPSILON_VALUE) { return false; }
あとは距離の判定を入れて、距離内ならtrue,距離外ならfalseとするだけである.
if ((p - m_center).lengthSq() < m_radius * m_radius)
{
record.m_t = t;
record.m_p = p;
record.m_normal = m_normal;
record.m_material = this->m_material;
return true;
}
return false;
double t = Dot(m_center - ray.origin.xyz(), m_normal) / Dot(ray.direction, m_normal);
if (t <= EPSILON_VALUE) { return false; }
Vec3 p = ray.origin.xyz() + t * ray.direction;
if ((p - m_center).lengthSq() < m_radius * m_radius)
{
record.m_t = t;
record.m_p = p;
record.m_normal = m_normal;
record.m_material = this->m_material;
return true;
}
return false;
今回もSiv3Dで描画をしています.