1. 無職の学び舎
  2. >
  3. 無職はゲーム数学の勉強をする
  4. >
  5. 衝突判定用の形状定義

衝突判定用の形状定義

衝突判定で利用する形状の定義について記載しています。

記載しているソースコードは簡易版というかあくまでイメージです、実際に利用しているコードはここにあります。

点はxy座標の2つから定義します。無職の場合は点はPointというようなクラスは作成せず、Vector2という2次元ベクトルクラスを作成し利用しています。

サンプルコード

class Vector2 
{
  /** x座標 */
  x:number;

  /** y座標 */
  y:number;
}

直線

直線は無限に続く線で、直線上の1点と、直線の方向を表すベクトルの2つの情報で定義しています。

サンプルコード

class Line 
{
  /** 直線上の1点 */
  p:Vector2;

  /** 直線の方向を表すベクトル */
  v:Vector2;
}

半直線

半直線は1点を端として、一方に無限に伸びている線です。

半直線は始点となる座標と、方向を表すベクトルの2つの情報で定義しています。 所有する情報は直線と同じなので、Lienクラスを継承してもいいと思います。

サンプルコード

class Ray   
{
  /** 始点 */
  p:Vector2;

  /** 半直線の方向を表すベクトル */
  v:Vector2;
}

線分

線分は始点と終点があり、長さを持つ線です。

線分は始点と終点の情報で定義もできますが、衝突判定をする上では始点と線分の向きと長さを表すベクトルの2つの情報で定義したほうが良い気がします。

サンプルコード

class Segment   
{
  /** 始点 */
  p:Vector2;

  /** 線分の方向と長さを表すベクトル */
  v:Vector2;
}

円は衝突判定において、非常に扱いやすく優秀な形状です。中心座標と半径の2つの情報で定義しています。

サンプルコード

class Circle   
{
  /** 中心 */
  p:Vector2;

  /** 半径 */
  r:number;
}

楕円

楕円は中心座標とXとYそれぞれの半径、そして回転の3つの情報で定義します。

サンプルコード

class Ellipse   
{
  /** 中心 */
  p:Vector2;

  /** XとYの半径 */
  r:Vector2;

  /** 回転 */
  angle: number;
}

矩形

矩形は回転しない四角形、左上の座標と幅と高さの3つの情報で定義します。

サンプルコード

class Rect   
{
  /** 左上の座標 */
  p:Vector2;

  /** 幅 */
  w:number;

  /** 高さ */
  h: number;
}

矩形(回転あり)

回転する四角形は中心座標とXY半径、回転の3つの情報で定義します。

サンプルコード

class Box   
  {
    /** 中心座標 */
    p:Vector2;
  
    /** XとYの半径 */
    r:Vector2;
  
    /** 回転 */
    angle:number;
  }

三角形

三角形は頂点3つの座標で定義します。

サンプルコード

class Triangle   
{
  /** 頂点1 */
  p1:Vector2;

  /** 頂点2 */
  p2:Vector2;

  /** 頂点3 */
  p3:Vector2;  
}

カプセル

カプセルは円が線分上を移動するものとして考えて、線分と円の半径の2つの情報で定義します。 半径がカプセルの太さに該当するパラメーターになります。

サンプルコード

class Triangle   
{
  /** 線分 */
  s:Segment;

  /** 半径(カプセルの太さ) */
  r:number;
}