Ownway.Info
 
HOMESDL + OpenGLでグラフィックス → マウスで画面上の平面を選択する
マウスで画面上の平面を選択する

以下にこのページで説明するコードを示す。

本サンプルは、表示された平面をマウスで選択すると、マウスが選択した位置に球を表示するプログラムである。 出力例を下記に示す。

このサンプルでは、マウスカーソルが挿した場所から奥行きに対してまっすぐに伸びたベクトルを想定し、面と交差する位置を算出している。 関連するコードとして、Picking/main.cppの一部を以下に示す。

  // 選択した位置を表示する
  Vector3 pick1;Vector2 pick2;
  if(plane.pick(cursor, pick1, pick2)) {
    // 選択した3次元座標位置に球を描画する
    Material4Collection::EMERALD.set();
    glPushMatrix(); {
      glLoadIdentity();
      glTranslatef(pick1.x, pick1.y, pick1.z);
      GLUquadric* quadric=gluNewQuadric();
      gluSphere(quadric, 0.5f, 5, 5);
      gluDeleteQuadric(quadric);
    } glPopMatrix();

    // 選択した平面上での二次元座標値を描画する
    Material4Collection::WHITE.set();
    glTranslatef(0.0f,-11.0f,0.0f);
    drawVector("Pick(X-Y)", pick2, font, 0.0f, 0.0f);
  }

plane は画面上に表示している面を表すオブジェクトである。 cursor は、画面上のマウスポインタを表すオブジェクトである。 plane.pick メソッドは、cursor との交差点を算出し、 平面の上を選択していると判断した場合は戻り値として true を返すと共に pick1 および pick2 に交差点の情報を返す。

戻り値となるベクトルが2つあるのは、絶対座標上での交差点と平面上での相対座標の二つを返すからである。 いずれか片方があればもう片方を計算することは可能だが、利便性の観点から二つを同時に返している。

戻る: SDL + OpenGLでグラフィックス