3

シンプルな3Dゲームを作っています。3Dシーンでオブジェクト上のマウスを検出するための最良の方法は何ですか?

4

1 に答える 1

2

実際、私はこれらのピッキング方法を使用することを避け、数学的にのみ行います。マウス カーソルの位置からシーンまで直線を作成し、シーン内のすべてのオブジェクトの境界球と交差させます。交差する境界球ごとに、どの頂点が目の位置に最も近いかを確認するだけです。

直線は、このアルゴリズムを使用して z を 0 に設定し、それぞれ 1 に設定して作成できます。

math::Vec3f windowToObjectf(const math::Vec3f& windowCoord) {
  math::Matrix4f modelViewMatrix;
  math::Matrix4f projectionMatrix;
  std::array <GLint, 4> viewport;
  glGetFloatv( GL_MODELVIEW_MATRIX, modelViewMatrix.data() );
  glGetFloatv( GL_PROJECTION_MATRIX, projectionMatrix.data() );
  glGetIntegerv( GL_VIEWPORT, &viewport.front() );
  math::Vec3f ret(0, 0, 0);
  auto succes = gluUnProject( windowCoord.x , windowCoord.y, windowCoord.z, modelViewMatrix.data(), projectionMatrix.data(), &viewport.front(), &ret.x, &ret.y, &ret.z );
  RASSERT(succes == GL_TRUE);
  GL_RASSERT();
  return ret;
}
于 2013-02-19T09:15:58.767 に答える