(57)【要約】【課題】ジャイロセンサを用いて入力装置の姿勢を正確に算出する。【解決手段】姿勢算出装置は、ジャイロセンサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する。姿勢算出手段は、ジャイロセンサが検出する角速度に基づいて入力装置の姿勢を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データに基づいて入力装置の加速度を示す加速度ベクトルを算出する。補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、補正手段は、入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。【選択図】図１８
2010207331.tif 000002
【特許請求の範囲】
【請求項１】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する姿勢算出装置であって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第１補正手段とを備え、
前記第１補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出装置。
【請求項２】
前記第１補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第１の変換と、前記第１の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第２の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項１に記載の姿勢算出装置。
【請求項３】
前記第１補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項１または請求項２に記載の姿勢算出装置。
【請求項４】
前記第１補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項１から請求項３のいずれか１項に記載の姿勢算出装置。
【請求項５】
前記第１補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項１から請求項４のいずれか１項に記載の姿勢算出装置。
【請求項６】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第２補正手段をさらに備える、請求項１から請求項５のいずれか１項に記載の姿勢算出装置。
【請求項７】
前記第２補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項６に記載の姿勢算出装置。
【請求項８】
請求項１から請求項７のいずれか１項に記載の姿勢算出装置によって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲーム装置。
【請求項９】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する姿勢算出装置のコンピュータで実行される姿勢算出プログラムあって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第１補正手段として前記コンピュータを機能させ、
前記第１補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出プログラム。
【請求項１０】
前記第１補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第１の変換と、前記第１の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第２の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項９に記載の姿勢算出プログラム。
【請求項１１】
前記第１補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項９または請求項１０に記載の姿勢算出プログラム。
【請求項１２】
前記第１補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項９から請求項１１のいずれか１項に記載の姿勢算出プログラム。
【請求項１３】
前記第１補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項９から請求項１２のいずれか１項に記載の姿勢算出プログラム。
【請求項１４】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第２補正手段をさらに備える、請求項９から請求項１３のいずれか１項に記載の姿勢算出プログラム。
【請求項１５】
前記第２補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項１４記載の姿勢算出プログラム。
【請求項１６】
請求項９から請求項１５のいずれか１項に記載の姿勢算出プログラムによって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲームプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、姿勢算出装置または姿勢算出プログラムに関し、より特定的には、入力装置の姿勢を算出する姿勢算出装置または姿勢算出プログラムに関する。
【背景技術】
【０００２】
従来、加速度センサおよびジャイロセンサを用いて入力装置の姿勢を算出する技術が考えられている。例えば、特許文献１には、加速度センサおよびジャイロセンサを備えた入力制御装置を使用するゲーム装置が記載されている。このゲーム装置は、ゲームキャラクタが持つ刀を入力制御装置の動きに応じて制御するものである。具体的には、加速度センサの出力に基づいて刀を振る動作のデータが作成され、ジャイロセンサの出力に基づいて刀の姿勢のデータが作成される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−３０８７５６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上記特許文献１のようにジャイロセンサを用いて姿勢を算出する場合、算出される姿勢と入力制御装置の実際の姿勢との間に誤差が生じる。入力制御装置の動きが遅い場合に入力制御装置の角速度がジャイロセンサによって検知されなかったり、逆に、入力制御装置の動きが激しい場合に入力制御装置の角速度がジャイロセンサの検知可能な範囲を超えてしまったりすること等が生じる場合があるからである。また、角速度データの出力の間隔よりも短い期間中に角速度が急激に変化するような場合にも、誤差が発生する可能性がある。そして、角速度から算出される姿勢には、時間とともに角速度の誤差が蓄積されていくことになるので姿勢の誤差が大きくなっていくことになる。特許文献１では、ジャイロセンサから算出される姿勢の誤差を想定していないために、姿勢を正確に算出することができないおそれがある。
【０００５】
それ故、本発明の目的は、角速度センサを用いて入力装置の姿勢を正確に算出することができる姿勢算出装置または姿勢算出プログラムを提供することである。
【課題を解決するための手段】
【０００６】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、本欄における括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【０００７】
本発明は、角速度センサ（ジャイロセンサ５５，５６）と、加速度センサ（３７）とを少なくとも備えた入力装置（８）からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する姿勢算出装置である。姿勢算出装置は、姿勢算出手段（ステップＳ４を実行するＣＰＵ１０。以下、単にステップ番号のみを記載する。）と、加速度ベクトル算出手段（Ｓ２）と、第１補正手段（Ｓ５）とを備える。姿勢算出手段は、角速度センサが検出する角速度に基づいて入力装置の姿勢（第１姿勢データ６８）を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データ（６４）に基づいて入力装置の加速度を示す加速度ベクトル（Ｖａ１またはＶａ２）を算出する。第１補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、第１補正手段は、入力装置の姿勢に関して、所定軸（図１９に示すＺ軸ベクトルＭ１Ｚ）の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。
【０００８】
本発明によれば、角速度センサを用いて算出される姿勢は、加速度データに基づいて補正されるので、角速度センサから算出される姿勢の誤差を補正することができ、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【０００９】
また、本発明によれば、姿勢の補正は、姿勢を表す所定軸に関して、補正前の向きと補正後の向きとの変化が最も小さくなるように行われる。そのため、仮想のゲーム空間内におけるオブジェクトの姿勢を入力装置の姿勢に応じて変化させるゲーム処理においては、上記所定軸に対応するオブジェクトの向きは、補正に起因する変化が最小となる。つまり、上記姿勢の補正が行われても、上記所定軸に対応するオブジェクトの向きの変化をできるだけ小さくすることができる。したがって、本発明によれば、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなり、当該補正によってプレイヤが違和感を感じることを防止することができる。その結果、操作性の良いゲーム操作を提供することができる。
【００１０】
また、第１補正手段は、所定軸に垂直な平面（図１９に示す平面ＸＹ）に加速度ベクトルを投影した方向（投影加速度ベクトルＶａｐ）と、当該平面に鉛直下方向を投影した方向（投影重力ベクトルＧｐ）とを近づけるように所定軸回りの回転を行う第１の変換（第１変換行列ｍｔｘ１）と、第１の変換が行われた加速度ベクトル（図２０に示す加速度ベクトルＶａ’）の方向と鉛直下方向とを近づける回転を行う第２の変換（第２変換行列ｍｔｘ２）とからなる変換によって入力装置の姿勢を補正してもよい。
【００１１】
上記によれば、所定軸回りの回転を行う第１の変換と、第１の変換が行われた加速度ベクトルの方向と鉛直下方向とを近づける回転を行う第２の変換とによって入力装置の姿勢を補正するので、当該補正による所定軸の向きの変化を容易かつ確実に最小とすることができる。
【００１２】
また、第１補正手段は、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正してもよい（Ｓ３１−Ｓ３７）。
【００１３】
上記によれば、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正することによって、姿勢を迅速に補正することができる。特に、本発明では、補正による所定軸の変化を小さくしているので、姿勢を迅速に補正する場合であっても、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなる。
【００１４】
また、第１補正手段は、加速度ベクトルの大きさが重力加速度の大きさに近いほど、加速度ベクトルの方向と空間における鉛直下方向とが近づくように、入力装置の姿勢の補正量を制御してもよい。
【００１５】
上記によれば、加速度センサによって検出された加速度の大きさが重力加速度の大きさに近いほど、入力装置の姿勢がより大きく補正されることになる。ここで、加速度センサの検出結果は、加速度の大きさが重力加速度の大きさが近いほど、重力加速度の方向をより正確に示していると推測され、重力加速度の方向が正確に得られていると推測される。上記によれば、重力加速度の方向が正確に得られている場合ほど、当該重力加速度を基準とした補正が強く反映され、重力加速度の方向があまり正確に得られていない場合には、当該重力加速度を基準とした補正があまり反映されないこととなる。これによって、補正後の姿勢をより正確に算出することができる。
【００１６】
また、第１補正手段は、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ入力装置の姿勢を補正してもよい。
【００１７】
上記によれば、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準以上である場合には、第１補正手段は補正を行わない。つまり、加速度ベクトルが重力加速度の方向を正確に示していないと推測される場合には（不正確な）加速度ベクトルを用いた補正を行わないようにすることによって、結果的に、姿勢をより正確に算出することができる。
【００１８】
また、入力装置は、撮像手段（撮像素子４０）をさらに備えていてもよい。このとき、姿勢算出装置は、撮像手段が撮像する所定の撮像対象の画像（撮像画像）に基づいて、入力装置の姿勢をさらに補正する第２補正手段（Ｓ６）をさらに備える。
【００１９】
上記によれば、撮像手段の画像に基づいて入力装置の姿勢をさらに補正することによって、入力装置の姿勢をより正確に算出することができる。
【００２０】
また、第２補正手段は、入力装置の姿勢に所定軸（Ｚ軸）回りの回転を加えることによって入力装置の姿勢を補正してもよい。
【００２１】
上記によれば、撮像手段の画像に基づく補正は、所定軸回りの回転に関して行われることとなる。所定軸回りの回転であれば、補正がプレイヤに気づかれにくいので、入力装置の操作性を維持しながら、入力装置の姿勢をより正確に算出することができる。
【００２２】
また、本発明は、上記の姿勢算出装置によって補正された姿勢を入力装置の姿勢として用いてゲーム処理（Ｓ７）を行うゲーム装置として提供されてもよい。
【００２３】
上記によれば、ゲームのプレイヤは、加速度データおよび撮像対象の画像に基づいて補正された正確な入力装置の姿勢をゲーム入力として用いてゲーム操作を行うことができるので、入力装置の姿勢に応じたゲーム操作の操作性を向上することができる。
【００２４】
また、本発明は、情報処理装置のコンピュータを上記各手段として機能させる姿勢算出プログラムあるいはゲームプログラムの形態で実施されてもよい。
【発明の効果】
【００２５】
本発明によれば、角速度センサを用いて算出される姿勢は加速度データに基づいて補正される。これによって、角速度センサから算出される姿勢の誤差を補正することができるので、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【図面の簡単な説明】
【００２６】
【図１】ゲームシステムの外観図
【図２】ゲーム装置の機能ブロック図
【図３】入力装置の外観構成を示す斜視図
【図４】コントローラの外観構成を示す斜視図
【図５】コントローラの内部構造を示す図
【図６】コントローラの内部構造を示す図
【図７】入力装置の構成を示すブロック図
【図８】第１の姿勢および第２の姿勢を示すベクトルを示す図
【図９】補正量を示すベクトルｖ３を示す図
【図１０】第１補正処理による補正後の第１の姿勢を示すベクトルを示す図
【図１１】第１の姿勢および第３の姿勢を示すベクトルを示す図
【図１２】第２補正処理による補正後の第１の姿勢を示す図
【図１３】ゲーム装置のメインメモリに記憶される主なデータを示す図
【図１４】ゲーム装置において実行される処理の流れを示すメインフローチャート
【図１５】図１４に示す第１補正処理（ステップＳ５）の第１の処理例の流れを示すフローチャート
【図１６】空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図
【図１７】図１６に示す状態から、加速度ベクトルＶａを最短距離で回転させる方法によって第１の姿勢（Ｚ軸ベクトルＭ１Ｚ）を回転させた状態を示す図
【図１８】図１４に示す第１補正処理（ステップＳ５）の第２の処理例の流れを示すフローチャート
【図１９】投影加速度ベクトルおよび投影重力ベクトルを示す図
【図２０】図１９に示す状態から第１の変換を行った状態を示す図
【図２１】図２０に示す状態から第２の変換を行った状態を示す図
【図２２】図１４に示す第２補正処理（ステップＳ６）の流れを示すフローチャート
【図２３】撮像画像に対応する２次元座標を示す図
【発明を実施するための形態】
【００２７】
［ゲームシステムの全体構成］
図１を参照して、本発明の一実施形態に係る姿勢算出装置の一例であるゲーム装置を含むゲームシステム１について説明する。図１は、ゲームシステム１の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図１において、ゲームシステム１は、テレビジョン受像器（以下、単に「テレビ」と記載する）２、ゲーム装置３、光ディスク４、入力装置８、およびマーカ部６を含む。本システムは、入力装置８を用いたゲーム操作に基づいてゲーム装置３でゲーム処理を実行するものである。
【００２８】
ゲーム装置３には、当該ゲーム装置３に対して交換可能に用いられる情報記憶媒体の一例である光ディスク４が脱着可能に挿入される。光ディスク４には、ゲーム装置３において実行されるためのゲームプログラムが記憶されている。ゲーム装置３の前面には光ディスク４の挿入口が設けられている。ゲーム装置３は、挿入口に挿入された光ディスク４に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【００２９】
ゲーム装置３には、表示装置の一例であるテレビ２が接続コードを介して接続される。テレビ２は、ゲーム装置３において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ２の画面の周辺（図１では画面の上側）には、マーカ部６が設置される。マーカ部６は、その両端に２つのマーカ６Ｒおよび６Ｌを備えている。マーカ６Ｒ（マーカ６Ｌも同様）は、具体的には１以上の赤外ＬＥＤであり、テレビ２の前方に向かって赤外光を出力する。マーカ部６はゲーム装置３に接続されており、ゲーム装置３はマーカ部６が備える各赤外ＬＥＤの点灯を制御することが可能である。
【００３０】
入力装置８は、自機に対して行われた操作の内容を示す操作データをゲーム装置３に与えるものである。本実施形態では、入力装置８はコントローラ５とジャイロセンサユニット７とを含む。詳細は後述するが、入力装置８は、コントローラ５に対してジャイロセンサユニット７が着脱可能に接続されている構成である。コントローラ５とゲーム装置３とは無線通信によって接続される。本実施形態では、コントローラ５とゲーム装置３との間の無線通信には例えばＢｌｕｅｔｏｏｔｈ（ブルートゥース）（登録商標）の技術が用いられる。なお、他の実施形態においてはコントローラ５とゲーム装置３とは有線で接続されてもよい。
【００３１】
［ゲーム装置３の内部構成］
次に、図２を参照して、ゲーム装置３の内部構成について説明する。図２は、ゲーム装置３の構成を示すブロック図である。ゲーム装置３は、ＣＰＵ１０、システムＬＳＩ１１、外部メインメモリ１２、ＲＯＭ／ＲＴＣ１３、ディスクドライブ１４、およびＡＶ−ＩＣ１５等を有する。
【００３２】
ＣＰＵ１０は、光ディスク４に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。ＣＰＵ１０は、システムＬＳＩ１１に接続される。システムＬＳＩ１１には、ＣＰＵ１０の他、外部メインメモリ１２、ＲＯＭ／ＲＴＣ１３、ディスクドライブ１４およびＡＶ−ＩＣ１５が接続される。システムＬＳＩ１１は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムＬＳＩの内部構成について後述する。揮発性の外部メインメモリ１２は、光ディスク４から読み出されたゲームプログラムや、フラッシュメモリ１７から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、ＣＰＵ１０のワーク領域やバッファ領域として用いられる。ＲＯＭ／ＲＴＣ１３は、ゲーム装置３の起動用のプログラムが組み込まれるＲＯＭ（いわゆるブートＲＯＭ）と、時間をカウントするクロック回路（ＲＴＣ：Ｒｅａｌ  Ｔｉｍｅ  Ｃｌｏｃｋ）とを有する。ディスクドライブ１４は、光ディスク４からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ１１ｅまたは外部メインメモリ１２に読み出したデータを書き込む。
【００３３】
また、システムＬＳＩ１１には、入出力プロセッサ（Ｉ／Ｏプロセッサ）１１ａ、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｏｒ  Ｕｎｉｔ）１１ｂ、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）１１ｃ、ＶＲＡ
１ｄ、および内部メインメモリ１１ｅが設けられる。図示は省略するが、これらの構成要素１１ａ〜１１ｅは内部バスによって互いに接続される。
【００３４】
ＧＰＵ１１ｂは、描画手段の一部を形成し、ＣＰＵ１０からのグラフィクスコマンド（作画命令）に従って画像を生成する。ＶＲＡＭ１１ｄは、ＧＰＵ１１ｂがグラフィクスコマンドを実行するために必要なデータ（ポリゴンデータやテクスチャデータ等のデータ）を記憶する。画像が生成される際には、ＧＰＵ１１ｂは、ＶＲＡＭ１１ｄに記憶されたデータを用いて画像データを作成する。
【００３５】
ＤＳＰ１１ｃは、オーディオプロセッサとして機能し、内部メインメモリ１１ｅや外部メインメモリ１２に記憶されるサウンドデータや音波形（音色）データを用いて、音声データを生成する。
【００３６】
上述のように生成された画像データおよび音声データは、ＡＶ−ＩＣ１５によって読み出される。ＡＶ−ＩＣ１５は、読み出した画像データをＡＶコネクタ１６を介してテレビ２に出力するとともに、読み出した音声データを、テレビ２に内蔵されるスピーカ２ａに出力する。これによって、画像がテレビ２に表示されるとともに音がスピーカ２ａから出力される。
【００３７】
入出力プロセッサ１１ａは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ１１ａは、フラッシュメモリ１７、無線通信モジュール１８、無線コントローラモジュール１９、拡張コネクタ２０、およびメモリカード用コネクタ２１に接続される。無線通信モジュール１８にはアンテナ２２が接続され、無線コントローラモジュール１９にはアンテナ２３が接続される。
【００３８】
入出力プロセッサ１１ａは、無線通信モジュール１８およびアンテナ２２を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ１１ａは、定期的にフラッシュメモリ１７にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール１８およびアンテナ２２を介してネットワークに送信する。また、入出力プロセッサ１１ａは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ２２および無線通信モジュール１８を介して受信し、受信したデータをフラッシュメモリ１７に記憶する。ＣＰＵ１０はゲームプログラムを実行することにより、フラッシュメモリ１７に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ１７には、ゲーム装置３と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置３を利用してプレイしたゲームのセーブデータ（ゲームの結果データまたは途中データ）が記憶されてもよい。
【００３９】
また、入出力プロセッサ１１ａは、コントローラ５から送信される操作データをアンテナ２３および無線コントローラモジュール１９を介して受信し、内部メインメモリ１１ｅまたは外部メインメモリ１２のバッファ領域に記憶（一時記憶）する。
【００４０】
さらに、入出力プロセッサ１１ａには、拡張コネクタ２０およびメモリカード用コネクタ２１が接続される。拡張コネクタ２０は、ＵＳＢやＳＣＳＩのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール１８に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ２１は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ１１ａは、拡張コネクタ２０やメモリカード用コネクタ２１を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
【００４１】
ゲーム装置３には、電源ボタン２４、リセットボタン２５、およびイジェクトボタン２６が設けられる。電源ボタン２４およびリセットボタン２５は、システムＬＳＩ１１に接続される。電源ボタン２４がオンされると、ゲーム装置３の各構成要素に対して、図示しないＡＣアダプタを経て電源が供給される。リセットボタン２５が押されると、システムＬＳＩ１１は、ゲーム装置３の起動プログラムを再起動する。イジェクトボタン２６は、ディスクドライブ１４に接続される。イジェクトボタン２６が押されると、ディスクドライブ１４から光ディスク４が排出される。
【００４２】
［入力装置８の構成］
次に、図３〜図６を参照して、入力装置８について説明する。図３は、入力装置８の外観構成を示す斜視図である。図４は、コントローラ５の外観構成を示す斜視図である。図３は、コントローラ５の上側後方から見た斜視図であり、図４は、コントローラ５を下側前方から見た斜視図である。
【００４３】
図３および図４において、コントローラ５は、例えばプラスチック成型によって形成されたハウジング３１を有している。ハウジング３１は、その前後方向（図３に示すＺ軸方向）を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ５に設けられたボタンを押下すること、および、コントローラ５自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
【００４４】
ハウジング３１には、複数の操作ボタンが設けられる。図３に示すように、ハウジング３１の上面には、十字ボタン３２ａ、１番ボタン３２ｂ、２番ボタン３２ｃ、Ａボタン３２ｄ、マイナスボタン３２ｅ、ホームボタン３２ｆ、プラスボタン３２ｇ、および電源ボタン３２ｈが設けられる。本明細書では、これらのボタン３２ａ〜３２ｈが設けられるハウジング３１の上面を「ボタン面」と呼ぶことがある。一方、図４に示すように、ハウジング３１の下面には凹部が形成されており、当該凹部の後面側傾斜面にはＢボタン３２ｉが設けられる。これらの各操作ボタン３２ａ〜３２ｉには、ゲーム装置３が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン３２ｈは遠隔からゲーム装置３本体の電源をオン／オフするためのものである。ホームボタン３２ｆおよび電源ボタン３２ｈは、その上面がハウジング３１の上面に埋没している。これによって、プレイヤがホームボタン３２ｆまたは電源ボタン３２ｈを誤って押下することを防止することができる。
【００４５】
ハウジング３１の後面にはコネクタ３３が設けられている。コネクタ３３は、コントローラ５に他の機器（例えば、ジャイロセンサユニット７や他のコントローラ）を接続するために利用される。また、ハウジング３１の後面におけるコネクタ３３の両側には、上記他の機器が容易に離脱することを防止するために係止穴３３ａが設けられている。
【００４６】
ハウジング３１上面の後方には複数（図３では４つ）のＬＥＤ３４ａ〜３４ｄが設けられる。ここで、コントローラ５には、他のメインコントローラと区別するためにコントローラ種別（番号）が付与される。各ＬＥＤ３４ａ〜３４ｄは、コントローラ５に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ５の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ５を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のＬＥＤ３４ａ〜３４ｄのいずれか１つが点灯する。
【００４７】
また、コントローラ５は撮像情報演算部３５（図６）を有しており、図４に示すように、ハウジング３１前面には撮像情報演算部３５の光入射面３５ａが設けられる。光入射面３５ａは、マーカ６Ｒおよび６Ｌからの赤外光を少なくとも透過する材質で構成される。
【００４８】
ハウジング３１上面における１番ボタン３２ｂとホームボタン３２ｆとの間には、コントローラ５に内蔵されるスピーカ４９（図５）からの音を外部に放出するための音抜き孔３１ａが形成されている。
【００４９】
次に、図５および図６を参照して、コントローラ５の内部構造について説明する。図５および図６は、コントローラ５の内部構造を示す図である。なお、図５は、コントローラ５の上筐体（ハウジング３１の一部）を外した状態を示す斜視図である。図６は、コントローラ５の下筐体（ハウジング３１の一部）を外した状態を示す斜視図である。図６に示す斜視図は、図５に示す基板３０を裏面から見た斜視図となっている。
【００５０】
図５において、ハウジング３１の内部には基板３０が固設されており、当該基板３０の上主面上に各操作ボタン３２ａ〜３２ｈ、各ＬＥＤ３４ａ〜３４ｄ、加速度センサ３７、アンテナ４５、およびスピーカ４９等が設けられる。これらは、基板３０等に形成された配線（図示せず）によってマイクロコンピュータ（Ｍｉｃｒｏ  Ｃｏｍｐｕｔｅｒ：マイコン）４２（図６参照）に接続される。本実施形態では、加速度センサ３７は、Ｘ軸方向に関してコントローラ５の中心からずれた位置に配置されている。これによって、コントローラ５をＺ軸回りに回転させたときのコントローラ５の動きが算出しやすくなる。また、加速度センサ３７は、長手方向（Ｚ軸方向）に関してコントローラ５の中心よりも前方に配置されている。また、無線モジュール４４（図６）およびアンテナ４５によって、コントローラ５がワイヤレスコントローラとして機能する。
【００５１】
一方、図６において、基板３０の下主面上の前端縁に撮像情報演算部３５が設けられる。撮像情報演算部３５は、コントローラ５の前方から順に赤外線フィルタ３８、レンズ３９、撮像素子４０、および画像処理回路４１を備えている。これらの部材３８〜４１はそれぞれ基板３０の下主面に取り付けられる。
【００５２】
さらに、基板３０の下主面上には、上記マイコン４２およびバイブレータ４８が設けられている。バイブレータ４８は、例えば振動モータやソレノイドであり、基板３０等に形成された配線によってマイコン４２と接続される。マイコン４２の指示によりバイブレータ４８が作動することによってコントローラ５に振動が発生する。これによって、コントローラ５を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ４８は、ハウジング３１のやや前方寄りに配置される。つまり、バイブレータ４８がコントローラ５の中心よりも端側に配置することによって、バイブレータ４８の振動によりコントローラ５全体を大きく振動させることができる。また、コネクタ３３は、基板３０の下主面上の後端縁に取り付けられる。なお、図５および図６に示す他、コントローラ５は、マイコン４２の基本クロックを生成する水晶振動子、スピーカ４９に音声信号を出力するアンプ等を備えている。
【００５３】
また、ジャイロセンサユニット７は、角速度センサの一例であり、３軸回りの角速度を検知するジャイロセンサ（図７に示すジャイロセンサ５５および５６）を有する。ジャイロセンサユニット７は、コントローラ５のコネクタ３３に着脱可能に装着される。ジャイロセンサユニット７の前端（図３に示すＺ軸正方向側の端部）には、コネクタ３３に接続可能なプラグ（図７に示すプラグ５３）が設けられる。さらに、プラグ５３の両側にはフック（図示せず）が設けられる。ジャイロセンサユニット７がコントローラ５に対して装着される状態では、プラグ５３がコネクタ３３に接続されるとともに、上記フックがコントローラ５の係止穴３３ａに係止する。これによって、コントローラ５とジャイロセンサユニット７とがしっかりと固定される。また、ジャイロセンサユニット７は側面（図３に示すＸ軸方向の面）にボタン５１を有している。ボタン５１は、それを押下すれば上記フックの係止穴３３ａに対する係止状態を解除することができるように構成されている。したがって、ボタン５１を押下しながらプラグ５３をコネクタ３３から抜くことによって、ジャイロセンサユニット７をコントローラ５から離脱することができる。
【００５４】
また、ジャイロセンサユニット７の後端には、上記コネクタ３３と同形状のコネクタが設けられる。したがって、コントローラ５（のコネクタ３３）に対して装着可能な他の機器は、ジャイロセンサユニット７のコネクタに対しても装着可能である。なお、図３においては、当該コネクタに対してカバー５２が着脱可能に装着されている。
【００５５】
なお、図３〜図６に示したコントローラ５およびジャイロセンサユニット７の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はＺ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ５における撮像情報演算部３５の位置（撮像情報演算部３５の光入射面３５ａ）は、ハウジング３１の前面でなくてもよく、ハウジング３１の外部から光を取り入れることができれば他の面に設けられてもかまわない。
【００５６】
図７は、入力装置８（コントローラ５およびジャイロセンサユニット７）の構成を示すブロック図である。コントローラ５は、操作部３２（各操作ボタン３２ａ〜３２ｉ）、コネクタ３３、撮像情報演算部３５、通信部３６、および加速度センサ３７を備えている。コントローラ５は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置３へ送信するものである。
【００５７】
操作部３２は、上述した各操作ボタン３２ａ〜３２ｉを含み、各操作ボタン３２ａ〜３２ｉに対する入力状態（各操作ボタン３２ａ〜３２ｉが押下されたか否か）を示す操作ボタンデータを通信部３６のマイコン４２へ出力する。
【００５８】
撮像情報演算部３５は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部３５は、例えば最大２００フレーム／秒程度のサンプリング周期を有するので、比較的高速なコントローラ５の動きでも追跡して解析することができる。
【００５９】
撮像情報演算部３５は、赤外線フィルタ３８、レンズ３９、撮像素子４０、および画像処理回路４１を含んでいる。赤外線フィルタ３８は、コントローラ５の前方から入射する光から赤外線のみを通過させる。レンズ３９は、赤外線フィルタ３８を透過した赤外線を集光して撮像素子４０へ入射させる。撮像素子４０は、例えばＣＭＯＳセンサやあるいはＣＣＤセンサのような固体撮像素子であり、レンズ３９が集光した赤外線を受光して画像信号を出力する。ここで、テレビ２の表示画面近傍に配置されるマーカ部６のマーカ６Ｒおよび６Ｌは、テレビ２の前方に向かって赤外光を出力する赤外ＬＥＤで構成される。したがって、赤外線フィルタ３８を設けることによって、撮像素子４０は、赤外線フィルタ３８を通過した赤外線だけを受光して画像データを生成するので、マーカ６Ｒおよび６Ｌの画像をより正確に撮像することができる。以下では、撮像素子４０によって撮像された画像を撮像画像と呼ぶ。撮像素子４０によって生成された画像データは、画像処理回路４１で処理される。画像処理回路４１は、撮像画像内における撮像対象（マーカ６Ｒおよび６Ｌ）の位置を算出する。画像処理回路４１は、算出された位置を示す座標を通信部３６のマイコン４２へ出力する。この座標のデータは、マイコン４２によって操作データとしてゲーム装置３に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ５自体の向き（傾斜角度）や位置に対応して変化するので、ゲーム装置３はこのマーカ座標を用いてコントローラ５の向きや位置を算出することができる。
【００６０】
なお、他の実施形態においては、コントローラ５は画像処理回路４１を備えていない構成であってもよく、撮像画像自体がコントローラ５からゲーム装置３へ送信されてもよい。このとき、ゲーム装置３は、画像処理回路４１と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
【００６１】
加速度センサ３７は、コントローラ５の加速度（重力加速度を含む）を検出する、すなわち、コントローラ５に加わる力（重力を含む）を検出する。加速度センサ３７は、当該加速度センサ３７の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度（直線加速度）の値を検出する。例えば、２軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、３軸または２軸の加速度センサは、アナログ・デバイセズ株式会社（Ａｎａｌｏｇ  Ｄｅｖｉｃｅｓ，  Ｉｎｃ．）またはＳＴマイクロエレクトロニクス社（ＳＴＭｉｃｒｏｅｌｅｃｔｒｏｎｉｃｓ  Ｎ．Ｖ．）から入手可能である種類のものでもよい。なお、加速度センサ３７は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
【００６２】
本実施形態では、加速度センサ３７は、コントローラ５を基準とした上下方向（図３に示すＹ軸方向）、左右方向（図３に示すＸ軸方向）および前後方向（図３に示すＺ軸方向）の３軸方向に関してそれぞれ直線加速度を検出する。加速度センサ３７は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ３７からの出力は３軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置８（コントローラ５）を基準に設定されるＸＹＺ座標系（コントローラ座標系）における３次元のベクトル（ａｘ，ａｙ，ａｚ）として表される。以下では、加速度センサ３７によって検出される３軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
【００６３】
加速度センサ３７が検出した加速度を示すデータ（加速度データ）は、通信部３６へ出力される。なお、加速度センサ３７が検出した加速度は、コントローラ５自体の向き（傾斜角度）や動きに対応して変化するので、ゲーム装置３は加速度データを用いてコントローラ５の向きや動きを算出することができる。本実施形態では、ゲーム装置３は、加速度データに基づいてコントローラ５の姿勢を判断する。
【００６４】
加速度センサ３７が検出した加速度（加速度ベクトル）を示すデータ（加速度データ）は、通信部３６へ出力される。本実施形態において、加速度センサ３７は、コントローラ５の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
【００６５】
なお、加速度センサ３７から出力される加速度の信号に基づいて、ゲーム装置３のプロセッサ（例えばＣＰＵ１０）またはコントローラ５のプロセッサ（例えばマイコン４２）等のコンピュータが処理を行うことによって、コントローラ５に関するさらなる情報を推測または算出（判定）することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ３７を搭載するコントローラ５が静止状態であることを前提としてコンピュータ側の処理が実行される場合（すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合）、コントローラ５が現実に静止状態であれば、検出された加速度に基づいてコントローラ５の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ３７の検出軸が鉛直下方向を向いている状態を基準としたとき、１Ｇ（重力加速度）がかかっているか否かによって、コントローラ５が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ３７の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ５がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ３７からの出力に基づいてコントローラ５の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ５の傾斜方向を算出するようにしてもよい。このように、加速度センサ３７をプロセッサと組み合わせて用いることによって、コントローラ５の傾斜角度または姿勢を判定することができる。
【００６６】
一方、コントローラ５が動的な状態（コントローラ５が動かされている状態）であることを前提とする場合には、加速度センサ３７は重力加速度に加えてコントローラ５の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ５の動き方向を知ることができる。また、コントローラ５が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ５の傾きを知ることが可能である。なお、他の実施例では、加速度センサ３７は、内蔵の加速度検出手段で検出された加速度信号をマイコン４２に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ３７が静的な加速度（例えば、重力加速度）を検出するために用いられる場合、加速度信号を傾斜角（あるいは、他の好ましいパラメータ）に変換するものであってもよい。
【００６７】
通信部３６は、マイコン４２、メモリ４３、無線モジュール４４、およびアンテナ４５を含んでいる。マイコン４２は、処理を行う際にメモリ４３を記憶領域として用いながら、マイコン４２が取得したデータをゲーム装置３へ無線送信する無線モジュール４４を制御する。また、マイコン４２はコネクタ３３に接続されている。ジャイロセンサユニット７から送信されてくるデータは、コネクタ３３を介してマイコン４２に入力される。以下、ジャイロセンサユニット７の構成について説明する。
【００６８】
ジャイロセンサユニット７は、プラグ５３、マイコン５４、２軸ジャイロセンサ５５、および１軸ジャイロセンサ５６を備えている。上述のように、ジャイロセンサユニット７は、３軸（本実施形態では、ＸＹＺ軸）回りの角速度を検出し、検出した角速度を示すデータ（角速度データ）をコントローラ５へ送信する。
【００６９】
２軸ジャイロセンサ５５は、Ｘ軸回りの角速度およびＹ軸回りの（単位時間あたりの）角速度を検出する。また、１軸ジャイロセンサ５６は、Ｚ軸回りの（単位時間あたりの）角速度を検出する。なお、本明細書では、コントローラ５の撮像方向（Ｚ軸正方向）を基準として、ＸＹＺ軸回りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、２軸ジャイロセンサ５５は、ロール方向（Ｘ軸回りの回転方向）およびピッチ方向（Ｙ軸回りの回転方向）の角速度を検出し、１軸ジャイロセンサ５６は、ヨー方向（Ｚ軸回りの回転方向）の角速度を検出する。
【００７０】
なお、本実施形態では、３軸回りの角速度を検出するために、２軸ジャイロセンサ５５と１軸ジャイロセンサ５６とを用いる構成としたが、他の実施形態においては、３軸回りの角速度を検出することができればよく、用いるジャイロセンサの数および組み合わせはどのようなものであってもよい。
【００７１】
また、本実施形態では、後述する姿勢算出処理における計算を容易にする目的で、各ジャイロセンサ５５および５６が角速度を検出する３つの軸は、加速度センサ３７が加速度を検出する３つの軸（ＸＹＺ軸）と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ５６および５７が角速度を検出する３つの軸と、加速度センサ３７が加速度を検出する３つの軸とは一致しなくてもよい。
【００７２】
各ジャイロセンサ５６および５７で検出された角速度を示すデータは、マイコン５４に出力される。したがって、マイコン５４には、ＸＹＺ軸の３軸回りの角度速度を示すデータが入力されることになる。マイコン５４は、上記３軸回りの角速度を示すデータを角速度データとしてプラグ５３を介してコントローラ５へ送信する。なお、マイコン５４からコントローラ５への送信は所定の周期毎に逐次行われるが、ゲームの処理は１／６０秒を単位として（１フレーム時間として）行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
【００７３】
コントローラ５の説明に戻り、操作部３２、撮像情報演算部３５、および加速度センサ３７からマイコン４２へ出力されたデータ、ならびに、ジャイロセンサユニット７からマイコン４２へ送信されてきたデータは、一時的にメモリ４３に格納される。これらのデータは、上記操作データとしてゲーム装置３へ送信される。すなわち、マイコン４２は、ゲーム装置３の無線コントローラモジュール１９への送信タイミングが到来すると、メモリ４３に格納されている操作データを無線モジュール４４へ出力する。無線モジュール４４は、例えばＢｌｕｅｔｏｏｔｈ（ブルートゥース）（登録商標）の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ４５から放射する。つまり、操作データは、無線モジュール４４で微弱電波信号に変調されてコントローラ５から送信される。微弱電波信号はゲーム装置３側の無線コントローラモジュール１９で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置３は操作データを取得することができる。そして、ゲーム装置３のＣＰＵ１０は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。なお、通信部３６から無線コントローラモジュール１９への無線送信は所定の周期毎に逐次行われるが、ゲームの処理は１／６０秒を単位として（１フレーム時間として）行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。コントローラ５の通信部３６は、例えば１／２００秒に１回の割合で各操作データをゲーム装置３の無線コントローラモジュール１９へ出力する。
【００７４】
上記コントローラ５を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ５を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ５によれば、プレイヤは、コントローラ５によって画面上の任意の位置を指示する操作、および、コントローラ５自体を動かす操作を行うこともできる。
【００７５】
［姿勢算出処理の概要］
次に、図８〜図１２を参照して、ゲーム装置３において実行される、入力装置８の姿勢を算出する姿勢算出処理の概要を説明する。本実施形態では、ゲーム装置３は、ジャイロセンサ５５および５６と、加速度センサ３７と、撮像手段（撮像素子４０）とを備えた入力装置８からデータ（操作データ）を取得し、入力装置８の姿勢を算出する。なお、本実施形態では、入力装置８は、加速度センサ３７と撮像素子４０とを両方備える構成とするが、他の実施形態においては、加速度センサ３７と撮像素子４０とのいずれか一方のみを備える構成であってもよい。
【００７６】
ゲーム装置３は、（１）姿勢算出手段と、（２）第１補正手段と、（３）第２補正手段とを備えている。本実施形態においては、これら各手段は、ゲーム装置３のコンピュータ（ＣＰＵ１０）によって実行されるゲームプログラム（姿勢算出プログラム）が、当該コンピュータを当該各手段として機能させることによって実現される。なお、他の実施形態においては、上記各手段の一部または全部は、ゲーム装置３が備える専用回路として実現されてもよい。
【００７７】
（１）姿勢算出手段
姿勢算出手段は、ジャイロセンサ５５および５６が検出する角速度に基づいて入力装置８の姿勢を算出する（後述するステップＳ４）。角速度から姿勢を算出する方法はどのような方法であってもよいが、例えば、初期姿勢に（単位時間あたりの）角速度を逐次加算する方法がある。すなわち、ジャイロセンサ５５および５６から逐次出力される角速度を積分し、初期状態からの姿勢の変化量を積分結果から算出することによって、現在の姿勢を算出することができる。なお、以下では、姿勢算出手段によって角速度から算出される入力装置８の姿勢を「第１の姿勢」と呼ぶ。ただし、第１の姿勢に補正が加えられた後の姿勢も第１の姿勢と呼ぶ。
【００７８】
ここで、ジャイロセンサ５５および５６が検出する角速度を用いて算出される上記第１の姿勢には、ジャイロセンサ５５および５６の誤検知が原因で、入力装置８の実際の姿勢との間に誤差が生じることがある。そこで、本実施形態では、ゲーム装置３は、加速度センサ３７によって検出される加速度を用いて上記第１の姿勢を補正する。また、撮像素子４０によって撮像される画像（撮像画像）を用いて上記第１の姿勢を補正する。
【００７９】
（２）第１補正手段
第１補正手段は、加速度センサ３７が検出する加速度データに基づいて上記第１の姿勢を補正する（後述するステップＳ５）。本実施形態では、第１補正手段は、上記第１の姿勢を第２の姿勢へと近づける補正を行う。ここで、第２の姿勢とは、加速度データから決まる姿勢、具体的には、加速度データが示す加速度の向きが鉛直下向きであると想定する場合における入力装置８の姿勢を指す。すなわち、加速度データが示す加速度が重力加速度であると仮定して算出された姿勢である。以下、図８〜図１０を参照して、第１補正手段による補正処理（第１補正処理）を説明する。なお、本実施形態では、第１補正手段の具体的な方法として第１および第２の処理例を記載するが、図８〜図１０では第１の処理例について説明する。
【００８０】
図８は、第２の姿勢を用いた第１の姿勢の補正を示す図である。なお、本実施形態では、実際には３次元空間における姿勢を処理しているが、図８〜図１０では、図面をわかりやすくするために２次元平面における姿勢を用いて説明する。図８（ａ）に示すベクトルＧは、入力装置８が存在する空間の所定位置を基準とした空間座標系に定義された鉛直下方向、すなわち重力方向を示す。また、図８（ａ）に示すベクトルｖ１は、コントローラ５が第１の姿勢であるときの、入力装置８の下向きのベクトル（すなわち図３−図５に示されるＹ軸負方向）の空間座標系での向きを示したものである。なお、入力装置８の姿勢が基本状態にあるときには、姿勢を示すベクトルはベクトルＧと一致することになる。したがって、ベクトルｖ１は、空間座標系における第１の姿勢に対応する。上記第１の姿勢は、ベクトルＧに対してベクトルｖ１がなす回転としても表すことができ、２次元の図８においては角度θ１として示している。第１の姿勢は角速度によって算出されるので、ベクトルｖ１は、前回の姿勢に角速度を加えて回転させることによって算出されるものである。第２の姿勢は加速度データに基づいて算出される。図８（ａ）に示すベクトルｖ２は、加速度データが示す加速度の向き（ビュー座標系における加速度の向き）を示している。ただし、加速度データは入力装置８に加えられる加速度であって、取得できるのは入力装置８を基準とした座標系におけるベクトルである。図８（ｂ）に、加速度センサの軸と加速度ベクトルとの関係を示す。図８（ｂ）のように、加速度センサから取得される加速度ベクトルｖ０と、センサのＹ軸負方向とのなす角度がθ２であるとき、図８（ａ）の空間座標系においては、ベクトルｖ１に回転θ２を加えたベクトルｖ２が空間座標系における加速度ベクトルとなる。そして、第２の姿勢は、上述したように「加速度データが示す加速度の向きが鉛直下向きとみなした場合における入力装置８の姿勢」であるので、ベクトルｖ２からベクトルｖ１へ向いた角度θ２の回転が第２の姿勢となる。第２の姿勢を、ベクトルｖ１のように空間座標系における入力装置８の下向きのベクトルで表すと、ベクトルＧをθ２だけ回転させたベクトルｖ２’として示すことができる。また、３次元の姿勢の場合には、３次元の回転行列等で表現することもできる。なお、角速度から第１の姿勢が正しく算出され、かつ、加速度データが重力方向を正確に示している場合には、加速度の向きを示すベクトルｖ２の方向は空間座標系の鉛直下方向、つまり重力方向と一致する。つまり、角速度から第１の姿勢が正しく算出されていない場合や、加速度データが正確な重力方向を示していない場合には、図８（ａ）のように、加速度の向きを示すベクトルｖ２と重力方向のベクトルＧとが異なる。そして、例えば静止状態等のように、加速度データにより示される方向が重力方向と一致すると想定される状況においては、ベクトルｖ１よりもベクトルｖ２の方が入力装置８の姿勢に対応するデータとして正確なものと考えられる。また、入力装置が静止していない場合であっても、ある程度の期間内における平均的な姿勢の精度を考慮すると、加速度ベクトルは平均的には重力方向に近いものとなるので、時間と��もに誤差の蓄積する角速度から算出される姿勢よりも信頼できるものと考えられる。一方で、前回の算出タイミングで正しい姿勢が算出されている状態であった場合には、次の算出タイミングにおける姿勢の算出には、加速度よりも角速度を用いた方が正確な姿勢が算出されると考えられる。すなわち、角速度による姿勢算出は、タイミングごとの誤差は加速度による算出よりも小さいが、時間と共に誤差が増大する一方、加速度による姿勢算出は、タイミングごとの誤差は場合よっては大きい可能性もあるが、タイミングごとに算出可能であるので誤差が蓄積しないという特徴を持つ。したがって、第１補正手段では、第１の姿勢と第２の姿勢の両方を考慮した補正を行う。
【００８１】
第１補正手段による補正は、上記第１の姿勢を第２の姿勢へと近づける補正である。つまり、第１補正手段は、上記角度θ１を上記角度θ２に近づける補正を行う。これは、ベクトルｖ１をベクトルｖ２’に近づける補正と表現してもよい。ただし、演算の過程上は、ベクトルｖ２がわかっていれば、ベクトルｖ２’自体は算出されなくとも補正は可能である。本実施形態では、上記補正は、補正量を示すベクトルｖ３を用いて行われる。図９は、補正量を示すベクトルｖ３を示す図である。図９に示すベクトルｖ３は、第１の姿勢を補正する補正量を示すベクトルである。具体的には、ベクトルｖ２に対してベクトルｖ３がなす角度Δθが、補正量となる。詳細は後述するが、ベクトルｖ３は、ベクトルＧとベクトルｖ２との間に設定される（図９参照）。ベクトルｖ１をΔθだけ回転させることで、ベクトルｖ１が上述のベクトルｖ２’に近づくことになる。
【００８２】
第１補正処理は、第１の姿勢（ベクトルｖ１）を上記補正量だけ回転させることによって行われる。図１０は、第１補正処理による補正後の第１の姿勢を示すベクトルを示す図である。図１０に示すように、補正後の第１の姿勢（ベクトルｖ１’）は、補正前の第１の姿勢（ベクトルｖ１）を角度Δθだけ回転させることによって得られる。これによって、補正後の第１の姿勢を表す角度θ１’は、角度θ１と角度θ２との間となっており、上記角度θ１を上記角度θ２に近づける補正が行われたことがわかる。
【００８３】
なお、上記第１の方法においては、第１補正手段は、第１の姿勢を第２の姿勢へと近づける補正を行い、補正後の第１の姿勢を第２の姿勢と一致させていない。これは、加速度データが誤検出や激しい操作等の原因で急激に変化する場合であっても補正後の第１の姿勢が急激に変化しないようにするためである。ただし、第１補正手段は、補正後の第１の姿勢を第２の姿勢と一致させるように補正を行ってもよい（後述する第２の方法）。また、詳細は後述するが、第１の方法においては、第１補正手段が第１の姿勢を第２の姿勢へと近づける割合は、加速度データにより示される加速度の大きさ（より具体的には、当該大きさと重力加速度の大きさとの差分）に応じて変化するように決められる。ただし、他の実施形態においては、上記割合を予め定められた固定値としてもよい。
【００８４】
（３）第２補正手段
第２補正手段は、撮像手段が撮像する所定の撮像対象の画像に基づいて第１の姿勢を補正する（後述するステップＳ６）。ここで、本実施形態においては、所定の撮像対象とは上記マーカ部６（の赤外ＬＥＤ）である。本実施形態では、第２補正手段は、上記第１の姿勢を第３の姿勢へと近づける補正を行う。第３の姿勢は、上記撮像対象の画像から算出される姿勢であり、具体的には、当該画像内での撮像対象の向きおよび／または位置から算出される入力装置８の姿勢である。以下、図１１および図１２を参照して、第２補正手段による補正処理（第２補正処理）を説明する。
【００８５】
図１１は、第３の姿勢を用いた第１の姿勢の補正を示す図である。なお、本実施形態では、実際には３次元空間における姿勢を処理しているが、図１１および図１２では、図面をわかりやすくするために２次元平面における姿勢を用いて説明する。図１１に示すベクトルｖ１は、空間座標系における第１の姿勢を示す。図１１に示すベクトルｖ４は、空間座標系における第３の姿勢を示す。マーカ部６の位置や姿勢は予め定められているので、画像内での当該マーカの姿勢や位置によって、相対的に入力装置８の姿勢を算出することができる。第３の姿勢が正しい姿勢を表していることを前提とすれば、角速度から第１の姿勢が正しく算出されている場合には、第１の姿勢を示すベクトルｖ１は、第３の姿勢を示すベクトルｖ４と一致する。つまり、角速度から第１の姿勢が正しく算出されていない場合には、図１１のように、第１の姿勢を示すベクトルｖ１と第３の姿勢を示すベクトルｖ４とが異なる。
【００８６】
第２補正処理は、第１の姿勢（ベクトルｖ１）を、第３の姿勢（ベクトルｖ４）に所定の割合で近づけることによって行われる。図１２は、第２補正処理による補正後の第１の姿勢を示す図である。図１２に示されるように、補正後の第１の姿勢（ベクトルｖ１’）は、補正前の第１の姿勢（ベクトルｖ１）を、第３の姿勢（ベクトルｖ４）に所定の割合で近づけることによって得られる。
【００８７】
ここで、入力装置８の姿勢や位置によっては撮像手段がマーカ部６を撮像することができない場合があり、この場合、第２補正手段は第２補正処理を行うことができない。したがって、仮に、第２補正手段が補正後の第１の姿勢を第３の姿勢と一致させるように補正を行うとすれば、第２補正処理を行うことができない状態から第２補正処理を行うことができる状態へと移行した際に、第１の姿勢が急激に変化してしまうおそれがある。このように第１の姿勢がプレイヤの意図に沿わずに急激に変化してしまうと、（たとえ補正後の姿勢が正確なものであったとしても）プレイヤは操作に違和感を感じてしまう。このような急激な変化を防止するために、本実施形態では、第１の姿勢を第３の姿勢に所定の割合で近づけるように補正を行っている。これによって、第１の姿勢が急激に変化することを防止することができるので、プレイヤが操作に違和感を感じることを防止することができる。ただし、撮像手段が常にマーカ部６を撮像することが可能な姿勢で入力装置８が使用されることが想定できる場合等、他の実施形態においては、第２補正手段は、補正後の第１の姿勢を第３の姿勢と一致させるように補正を行ってもよい。
【００８８】
なお、本実施形態では、ゲーム装置３は、第１補正処理と第２補正処理との両方を実行するが、他の実施形態においては、第１補正処理と第２補正処理とのいずれか一方のみを実行するようにしてもよい。また、本実施形態においては、ゲーム装置３は、第１補正処理を先に行い、第２補正処理を後に行うこととするが、第１補正処理と第２補正処理とのいずれを先に行うようにしてもよい。
【００８９】
以上のように、本実施形態によれば、ジャイロセンサ５５および５６によって検知された角速度から算出される入力装置８の姿勢を、加速度センサ３７によって検知された加速度を用いて補正し、また、撮像手段による撮像画像を用いて補正する。これによって、ジャイロセンサから算出される姿勢の誤差を減少することができ、入力装置８の姿勢をより正確に算出することができる。
【００９０】
なお、加速度センサ３７の検出結果からは、重力方向を軸とした回転（ヨー方向の回転）を検知することはできないので、第１補正手段による補正は、ヨー方向に関しては行うことができない。しかし、加速度センサ３７の検出結果を用いた補正は、入力装置８の姿勢がどのような姿勢であっても（常に加速度を検出することができるので）可能であるという特長を有する。一方、入力装置８の撮像方向にマーカ部６がなければマーカ座標が検出されないので、第２補正手段による補正は、入力装置８の姿勢によっては行うことができない。しかし、撮像画像を用いた補正は、姿勢（特にロール方向の姿勢）を正確に算出することができるという特長を有する。本実施形態においては、このように特長の異なる２種類の補正を行うことによって、入力装置８の姿勢をより正確に算出することができる。
【００９１】
［ゲーム装置３における処理の詳細］
次に、ゲーム装置３において実行される処理の詳細について説明する。まず、ゲーム装置３における処理において用いられる主なデータについて図１３を用いて説明する。図１３は、ゲーム装置３のメインメモリ（外部メインメモリ１２または内部メインメモリ１１ｅ）に記憶される主なデータを示す図である。図１３に示すように、ゲーム装置３のメインメモリには、ゲームプログラム６０、操作データ６２、およびゲーム処理用データ６７が記憶される。なお、メインメモリには、図１３に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
【００９２】
ゲームプログラム６０は、ゲーム装置３に電源が投入された後の適宜のタイミングで光ディスク４からその一部または全部が読み込まれてメインメモリに記憶される。ゲームプログラム６０には、姿勢算出プログラム６１が含まれる。姿勢算出プログラム６１は、入力装置８の姿勢を算出するための姿勢算出処理を実行するためのプログラムである。
【００９３】
操作データ６２は、コントローラ５からゲーム装置３へ送信されてくる操作データである。上述したように、コントローラ５からゲーム装置３へ１／２００秒に１回の割合で操作データが送信されるので、メインメモリに記憶される操作データ６２はこの割合で更新される。本実施形態においては、メインメモリには、最新の（最後に取得された）操作データのみが記憶されればよい。
【００９４】
操作データ６２には、角速度データ６３、加速度データ６４、マーカ座標データ６５、および操作ボタンデータ６６が含まれる。角速度データ６３は、ジャイロセンサユニット７のジャイロセンサ５５および５６によって検出された角速度を示すデータである。ここでは、角速度データ６３は、図３に示すＸＹＺの３軸回りのそれぞれの角速度を示す。また、加速度データ６４は、加速度センサ３７によって検出された加速度（加速度ベクトル）を示すデータである。ここでは、加速度データ６４は、図３に示すＸＹＺの３軸の方向に関する加速度を各成分とする３次元の加速度ベクトルＶａ１を示す。また、本実施形態においては、コントローラ５が静止している状態で加速度センサ３７が検出する加速度ベクトルＶａ１の大きさを“１”とする。つまり、加速度センサ３７によって検出される重力加速度の大きさは“１”である。
【００９５】
マーカ座標データ６５は、撮像情報演算部３５の画像処理回路４１によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための２次元座標系（図２３に示すｘ’ｙ’座標系）で表現される。なお、撮像素子４０によって２つのマーカ６Ｒおよび６Ｌが撮像される場合には、２つのマーカ座標が算出される。一方、撮像素子４０の撮像可能な範囲内にマーカ６Ｒおよび６Ｌのいずれか一方が位置しない場合には、撮像素子４０によって１つのマーカのみが撮像され、１つのマーカ座標のみが算出される。また、撮像素子４０の撮像可能な範囲内にマーカ６Ｒおよび６Ｌの両方が位置しない場合には、撮像素子４０によってマーカが撮像されず、マーカ座標は算出されない。したがって、マーカ座標データ６５は、２つのマーカ座標を示す場合もあるし、１つのマーカ座標を示す場合もあるし、マーカ座標がないことを示す場合もある。
【００９６】
操作ボタンデータ６６は、各操作ボタン３２ａ〜３２ｉに対する入力状態を示すデータである。
【００９７】
ゲーム処理用データ６７は、後述するゲーム処理（図１４）において用いられるデータである。ゲーム処理用データ６７は、第１姿勢データ６８、加速度大きさデータ６９、補正度データ７０、補正量ベクトルデータ７１、補正行列データ７２、ロール姿勢成分データ７３、ヨー姿勢成分データ７４、ピッチ姿勢成分データ７５、および第３姿勢データ７６を含む。なお、図１３に示すデータの他、ゲーム処理用データ６７は、ゲーム処理において用いられる各種データ（ゲームパラメータを示すデータ等）を含む。
【００９８】
第１姿勢データ６８は、角速度データ６３を用いて算出される上記第１の姿勢を示すデータである。本実施形態では、第１の姿勢は、以下の式（１）に示す３×３の行列Ｍ１で表現される。
【数１】
2010207331.tif 000003
上記行列Ｍ１は、所定の基準姿勢から現在の入力装置８の姿勢への回転を表す回転行列である。以下では、第１の姿勢を示す行列Ｍ１を、「第１姿勢行列Ｍ１」と呼ぶ。なお、第１姿勢行列Ｍ１により表される第１の姿勢は、入力装置８が存在する空間の所定位置を基準としたｘｙｚ座標系（上記空間座標系）における姿勢である。ここでは、ｘｙｚ座標系は、入力装置８がマーカ部６の正面に位置することを前提とし、入力装置８の位置からマーカ部６を向く方向をｚ軸正方向とし、鉛直上向き（重力方向の逆方向）をｙ軸正方向とし、入力装置８の位置からマーカ部６を向いた場合の左方向をｘ軸正方向とした座標系であるとする。ここでは、上記所定の基準姿勢は、マーカ部６の正面に位置する入力装置８の撮像方向がマーカ部６の中央を向き、かつ、コントローラ５のボタン面が鉛直上向きとなる姿勢（すなわち、入力装置８を基準としたＸ軸、Ｙ軸、Ｚ軸が、それぞれｘ軸、ｙ軸、ｚ軸の向きと一致する姿勢）であるとする。なお、本実施形態では、行列を用いて第１の姿勢を表現することとしたが、他の実施形態においては、第１の姿勢は、３次のベクトルまたは３つの角度によって表現されてもよい。
【００９９】
加速度大きさデータ６９は、加速度データ６４により示される加速度ベクトルＶａ１の大きさ（長さ）Ｌを示すデータである。
【０１００】
補正度データ７０は、第２の姿勢を用いて第１の姿勢を補正する度合（補正度Ａ）を示すデータである。補正度Ａは、０≦Ａ≦Ｃ１（Ｃ１は、０＜Ｃ１≦１の所定の定数）の範囲を取り得る値である。詳細は後述するが、補正後の第１の姿勢は、補正度Ａの値が大きいほど第２の姿勢に近くなる。
【０１０１】
補正量ベクトルデータ７１は、第１の姿勢を補正する補正量を示すベクトル（図９に示すベクトルｖ３。以下、補正量ベクトルと呼ぶ。）を示すデータである。補正量ベクトルＶｇは、上記加速度ベクトルＶａ１を上記ｘｙｚ座標系で表したベクトルＶａ２と、上記補正度Ａとに基づいて算出される。
【０１０２】
補正行列データ７２は、第１の姿勢を補正するために用いる回転行列（補正行列と呼ぶ）Ｍａを示すデータである。つまり、第１補正処理においては、第１の姿勢を表す第１姿勢行列Ｍ１に補正行列Ｍａを掛けることで第１の姿勢が補正される。補正行列Ｍａは、上記ベクトルＶａ２と上記補正量ベクトルＶｇとに基づいて算出される。
【０１０３】
ロール姿勢成分データ７３は、上記撮像対象の画像から算出される第３の姿勢に含まれる姿勢成分のうち、ロール方向に関する姿勢成分（ロール姿勢成分）Ｍ３ｒを示すデータである。また、ヨー姿勢成分データ７４は、上記第３の姿勢に含まれる姿勢成分のうち、ヨー方向に関する姿勢成分（ヨー姿勢成分）Ｍ３ｙを示すデータであり、ピッチ姿勢成分データ７５は、上記第３の姿勢に含まれる姿勢成分のうち、ピッチ方向に関する姿勢成分（ピッチ姿勢成分）Ｍ３ｐを示すデータである。なお、ここで言うロール方向、ヨー方向、およびピッチ方向とは、入力装置８の撮像方向（Ｚ軸正方向）を基準とした場合の回転方向である。本実施形態においては、各姿勢成分Ｍ３ｒ、Ｍ３ｙ、およびＭ３ｐは、第１の姿勢と同様、３×３の行列で表現される。
【０１０４】
第３姿勢データ７６は、上記撮像対象の画像から算出される第３の姿勢を示すデータである。本実施形態では、第３の姿勢は、第１の姿勢と同様、３×３の行列Ｍ３で表現される。以下では、第３の姿勢を示す行列Ｍ３を「第３姿勢行列Ｍ３」と呼ぶ。本実施形態では、入力装置８から操作データとしてマーカ座標データが送信されてくるので、第３姿勢行列Ｍ３は、マーカ座標データ６５に基づいて算出される。具体的には、第３姿勢行列Ｍ３は、上記各姿勢成分Ｍ３ｒ、Ｍ３ｙ、およびＭ３ｐを合成することによって得られる。
【０１０５】
次に、ゲーム装置３において行われる処理の詳細を、図１４〜図２３を用いて説明する。図１４は、ゲーム装置３において実行される処理の流れを示すメインフローチャートである。ゲーム装置３の電源が投入されると、ゲーム装置３のＣＰＵ１０は、図示しないブートＲＯＭに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク４に記憶されたゲームプログラムがメインメモリに読み込まれ、ＣＰＵ１０によって当該ゲームプログラムの実行が開始される。図１４に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
【０１０６】
まず、ステップＳ１において、ＣＰＵ１０は、ゲームに関する初期化処理を実行する。この初期化処理においては、ゲーム処理に用いられる各種パラメータの値が初期化されたり、仮想のゲーム空間が構築されたり、プレイヤオブジェクトや他のオブジェクトがゲーム空間の初期位置に配置されたりする。以上のステップＳ１の次にステップＳ２の処理が実行される。
【０１０７】
ステップＳ２において、ＣＰＵ１０は、初期姿勢設定処理が実行される。具体的には、プレイヤが所定の操作（例えば、Ａボタン３２ｄを押下する操作）を行ったことに応じて、入力装置８の第１の姿勢の初期姿勢として所定の値が設定される。ここでは、基準となる姿勢は、Ｚ軸が鉛直方向と平行となり、かつ、入力装置８の撮像方向がマーカ部６の中央（マーカ６Ｒおよび６Ｌの中央）を向く姿勢としているので、プレイヤは、初期姿勢が上記基準となる姿勢となるように入力装置８を把持した状態で、上記所定の操作を行うことが望ましいが、入力装置が静止状態に近く、かつマーカ部を撮像可能であれば、初期姿勢を算出することが可能である。ＣＰＵ１０は、所定の操作が行われると、上記初期姿勢を表す行列を示すデータを第１姿勢データとしてメインメモリに記憶する。以上のステップＳ２の後、ステップＳ３〜Ｓ８の処理ループが、ゲームが実行される間繰り返し実行される。なお、１回の当該処理ループは、１フレーム時間（例えば１／６０秒）に１回の割合で実行される。
【０１０８】
なお、本実施形態では、初期姿勢設定処理（ステップＳ２）は、ゲーム開始前（ステップＳ３〜Ｓ８の処理ループが実行される前）に１回実行されるのみであるとしたが、他の実施形態においては、ゲーム中における任意のタイミングで初期姿勢設定処理が実行されるようにしてもよい。すなわち、ＣＰＵ１０は、ゲーム中においてプレイヤが上記所定の操作を行ったことに応じて初期姿勢設定処理を実行するようにしてもよい。
【０１０９】
ステップＳ３において、ＣＰＵ１０は操作データを取得する。すなわち、コントローラ５から送信されてくる操作データが無線コントローラモジュール１９を介して受信される。そして、受信された操作データに含まれる角速度データ、加速度データ、マーカ座標データ、操作ボタンデータがそれぞれメインメモリに記憶される。ステップＳ３の次にステップＳ４の処理が実行される。
【０１１０】
ステップＳ４において、ＣＰＵ１０は、メインメモリに記憶されている角速度データ６３に基づいて第１の姿勢を算出する。入力装置８の姿勢を角速度から算出する方法はどのような方法であってもよいが、本実施形態においては、第１の姿勢は、前回の第１の姿勢（前回の処理ループにおいて算出された第１の姿勢）と、今回の角速度（今回の処理ループにおいて取得された角速度）とを用いて算出される。具体的には、ＣＰＵ１０は、前回の第１の姿勢を今回の角速度で単位時間分回転させた姿勢を、第１の姿勢とする。なお、前回の第１の姿勢は、メインメモリに記憶されている第１姿勢データ６８により示され、今回の角速度は、メインメモリに記憶されている角速度データ６３により示されている。ステップＳ４で算出された姿勢（３×３の行列）を示すデータが、第１姿勢データ６８としてメインメモリに新たに記憶される。上記ステップＳ４の次にステップＳ５の処理が実行される。
【０１１１】
ステップＳ５において、ＣＰＵ１０は前述した第１補正処理を実行する。第１補正処理は、加速度データを用いて第１の姿勢を補正する処理である。以下、図１５を参照して、第１補正処理における第１の処理例を説明し、図１６〜図２１を参照して、第１補正処理における第２の処理例を説明する。
【０１１２】
図１５は、図１４に示す第１補正処理（ステップＳ５）の第１の処理例の流れを示すフローチャートである。第１補正処理においては、まずステップＳ１１において、ＣＰＵ１０は、加速度センサ３７によって検出された加速度の大きさＬを算出する。すなわち、メインメモリに記憶されている加速度データ６４を読み出し、当該加速度データ６４により示される加速度ベクトルＶａ１について大きさＬを算出する。算出された大きさＬを示すデータは加速度大きさデータ６９としてメインメモリに記憶される。ステップＳ１１の次にステップＳ１２の処理が実行される。
【０１１３】
ステップＳ１２において、ＣＰＵ１０は、加速度センサ３７によって検出された加速度の大きさが０であるか否かを判定する。すなわち、メインメモリに記憶されている加速度大きさデータ６９を読み出し、当該加速度大きさデータ６９により示される大きさＬが０であるか否かを判定する。ステップＳ１２の判定結果が否定である場合、ステップＳ１３の処理が実行される。一方、ステップＳ１２の判定結果が肯定である場合、以降のステップＳ１３〜Ｓ２１の処理がスキップされて、ＣＰＵ１０は第１補正処理を終了する。このように、本実施形態においては、加速度センサ３７によって検出された加速度の大きさが０である場合には、当該加速度を用いた補正が行われない。これは、加速度の大きさが０である場合には加速度センサ３７の検出結果から重力方向を算出できないということ、および、加速度ベクトルの大きさが０であれば以降のステップＳ１３〜Ｓ２１の処理が困難であることが理由である。
【０１１４】
ステップＳ１３において、ＣＰＵ１０は、加速度センサ３７によって検出された加速度ベクトルＶａ１を正規化する。すなわち、メインメモリに記憶されている加速度データ６４を読み出し、当該加速度データ６４により示される加速度ベクトルＶａ１を、大きさが１となるように補正する。ＣＰＵ１０は、正規化された加速度ベクトルＶａ１を示すデータをメインメモリに記憶しておく。ステップＳ１３の次にステップＳ１４の処理が実行される。
【０１１５】
ステップＳ１４において、ＣＰＵ１０は、第１補正処理において第１の姿勢を補正する度合を示す上記補正度Ａを算出する。補正度Ａは、正規化される前の加速度ベクトルＶａ１の大きさＬに基づいて算出される。具体的には、ＣＰＵ１０は、メインメモリに記憶されている加速度大きさデータ６９を読み出す。そして、当該加速度大きさデータ６９により示される大きさＬを用いて、次の式（２）に従って補正度Ａを算出する。
Ａ＝｜Ｌ−１｜  …（２）
上式（２）で算出された補正度Ａを示すデータは、補正度データ７０としてメインメモリに記憶される。なお、上式（２）で算出された補正度Ａは、最終的な値ではない演算中の値であって、以降のステップＳ１６で値が変換されることによって、最終的な補正度Ａの値が得られる。ステップＳ１４の次にステップＳ１５の処理が実行される。
【０１１６】
ステップＳ１５において、ＣＰＵ１０は、ステップＳ１４で算出された補正度Ａが所定値Ｒよりも小さいか否かを判定する。所定値Ｒは、予め定められており、例えば０．４に設定される。ここで、上述したように、本実施形態においては、加速度センサ３７によって検出される重力加速度の大きさは“１”であり、また、補正度Ａは加速度ベクトルＶａ１の大きさＬと“１”との差の絶対値である（上式（２））。したがって、補正度Ａが所定値Ｒ以上である場合とは、加速度ベクトルＶａ１の大きさＬが重力加速度の大きさから所定値Ｒ以上離れている場合である。ステップＳ１５の判定結果が肯定である場合、ステップＳ１６の処理が実行される。一方、ステップＳ１５の判定結果が否定である場合、以降のステップＳ１６〜Ｓ２１の処理がスキップされて、ＣＰＵ１０は第１補正処理を終了する。
【０１１７】
上記のように、本実施形態では、加速度センサ３７によって検出される加速度の大きさＬと重力加速度の大きさ（＝１）との差が所定の基準（所定値Ｒ）よりも小さい場合にのみ補正が行われ、当該大きさＬと重力加速度の大きさとの差が所定の基準以上である場合には補正が行われない。ここで、入力装置８が動かされている状態では、重力加速度以外に、入力装置８が動かされることによって生じる慣性による加速度が加速度センサ３７によって検出されるので、検出される加速度ベクトルＶａ１の大きさＬが“１”とは異なる値となり、入力装置８が激しく動かされている場合には、大きさＬが“１”から大きく離れた値となる。したがって、上記大きさＬと重力加速度の大きさとの差が所定の基準以上である場合とは、入力装置８が激しく動かされている場合であると推測される。一方、入力装置８が激しく動かされている場合には、加速度センサ３７によって検出される加速度ベクトルＶａ１に重力加速度以外の成分（上記慣性による加速度の成分）が多く含まれているため、加速度ベクトルＶａ１の値は、重力方向を示す値としては信頼できないものと推測される。したがって、上記ステップＳ１５の判定処理は、入力装置８が激しく動かされているか否か、換言すれば、加速度ベクトルＶａ１の値が重力方向を示す値としては信頼できるものであるか否かを判定する処理である。本実施形態においては、上記ステップＳ１５の判定処理によって、加速度ベクトルＶａ１の値が重力方向を示す値としては信頼できない場合には補正を行わず、加速度ベクトルＶａ１の値が重力方向を示す値としては信頼できる場合にのみ補正を行うようにしている。これによって、重力方向を示す値としては信頼できない加速度ベクトルＶａ１を用いて第１の姿勢に対する補正が行われた結果、第１の姿勢が正しく補正されなくなることを防止することができる。
【０１１８】
ステップＳ１６において、ＣＰＵ１０は、補正度Ａの値を変換する。本実施形態では、補正度Ａを、検出された加速度ベクトルＶａ１の大きさＬが重力加速度の大きさに近いほど１に近くなるように、補正度Ａを変換する。具体的には、ＣＰＵ１０は、メインメモリに記憶されている補正度データ７０を読み出し、当該補正度データ７０により示される補正度Ａを、以下の式（３）〜（５）に従って変換する。
Ａ２＝１−（Ａ１／Ｒ）  …（３）
Ａ３＝Ａ２×Ａ２  …（４）
Ａ４＝Ａ３×Ｃ１  …（５）
上式（３）〜（５）において、変数Ａ１は変換前の補正度（メインメモリに現在記憶されている補正度データ７０により示される値）であり、変数Ａ４がステップＳ１６において最終的に変換される補正度である。上式（３）は、変換前の補正度Ａ１の大きさが重力加速度の大きさ（＝１）に近いほど１に近くなるように変換後の補正度Ａ２を得るための式である。上式（４）は、変換前の補正度Ａ２が１に近いほど大きい重みが付されるように変換後の補正度Ａ３を得るための式である。上式（５）は、補正量の大きさを調整するための式である。すなわち、定数Ｃ１は、定数Ｃ１の値が大きいほど補正量は大きくなる。定数Ｃ１は、予め定められ、０＜Ｃ１≦１の範囲（例えば０．０３）で設定される。以上の式（３）〜（５）による変換によって得られた補正度Ａ４を示すデータが、新たな補正度データ７０としてメインメモリに記憶される。上記ステップＳ１６の次にステップＳ１７の処理が実行される。
【０１１９】
なお、本実施形態においては、上式（３）〜（５）による変換を行ったが、他の実施形態においては、上式（３）〜（５）のうち一部または全部の変換を省略してもよい。ただし、上式（３）の変換を省略する場合には、後述するステップＳ１８で用いる式（７）において、加速度ベクトルＶａ２と重力方向ベクトル（０，−１，０）とを入れ替える必要がある。
【０１２０】
ステップＳ１７において、ＣＰＵ１０は、ＸＹＺ座標系で表現される加速度ベクトルＶａ１をｘｙｚ座標系の値Ｖａ２へと変換する。ｘｙｚ座標系における加速度ベクトルＶａ２は、正規化された加速度ベクトルＶａ１を、前回のフレームにおいて得られた第１の姿勢を表す第１姿勢行列Ｍ１を用いて変換することによって算出される。すなわち、ＣＰＵ１０は、ステップＳ１３においてメインメモリに記憶された（正規化された）加速度ベクトルＶａ１のデータと、第１姿勢データ６８とを読み出す。そして、当該加速度ベクトルＶａ１と当該第１姿勢データ６８により示される第１姿勢行列Ｍ１とを用いて、ｘｙｚ座標系における加速度ベクトルＶａ２を算出する。より具体的には、正規化された加速度ベクトルＶａ１＝（ｎｘ，ｎｙ，ｎｚ）とし、第１姿勢行列Ｍ１の各要素を上式（１）に示す変数とし、ｘｙｚ座標系で表現される加速度ベクトルＶａ２＝（ｖｘ，ｖｙ，ｖｚ）とすると、加速度ベクトルＶａ２は次の式（６）に従って算出される。
ｖｘ＝Ｘｘ×ｎｘ＋Ｙｘ×ｎｙ＋Ｚｘ×ｎｚ
ｖｙ＝Ｘｙ×ｎｘ＋Ｙｙ×ｎｙ＋Ｚｙ×ｎｚ
ｖｚ＝Ｘｚ×ｎｘ＋Ｙｚ×ｎｙ＋Ｚｚ×ｎｚ  …（６）
上式（６）に示されるように、加速度ベクトルＶａ２は、回転行列である第１姿勢行列Ｍ１によって加速度ベクトルＶａ１を回転させることによって得ることができる。ステップＳ１７において算出された加速度ベクトルＶａ２はメインメモリに記憶される。上記ステップＳ１７の次にステップＳ１８の処理が実行される。
【０１２１】
ステップＳ１８において、ＣＰＵ１０は、ｘｙｚ座標系で表現される加速度ベクトルＶａ２と補正度Ａとを用いて補正量ベクトルＶｇを算出する。補正量ベクトルＶｇは、上記ステップＳ１６による変換後の補正度と、ｘｙｚ座標系の鉛直下方向（重力方向）を示すベクトル（０，−１，０）とを用いて算出される。具体的には、ＣＰＵ１０は、メインメモリに記憶されている補正度データ７０を読み出し、当該補正度データ７０により示される補正度Ａを用いて、以下の式（７）に従って補正量ベクトルＶｇ＝（ｇｘ，ｇｙ，ｇｚ）を算出する。
ｇｘ＝（０−ｖｘ）×Ａ＋ｖｘ
ｇｙ＝（−１−ｖｙ）×Ａ＋ｖｙ
ｇｚ＝（０−ｖｚ）×Ａ＋ｖｚ    …（７）
上式（７）に示されるように、補正量ベクトルＶｇは、加速度ベクトルＶａ２の終点から重力方向ベクトル（０，−１，０）の終点までを結ぶ線分をＡ：（１−Ａ）に内分する点を終点とするベクトルである。したがって、補正量ベクトルＶｇは、補正度Ａの値が大きいほど、重力方向ベクトルに近づくこととなる。ＣＰＵ１０は、上式（７）によって算出された補正量ベクトルＶｇを示すデータを、補正量ベクトルデータ７１としてメインメモリに記憶する。上記ステップＳ１８の次にステップＳ１９の処理が実行される。
【０１２２】
ステップＳ１９において、ＣＰＵ１０は、上記ステップＳ１８で算出された補正量ベクトルＶｇを正規化する。すなわち、メインメモリに記憶されている補正量ベクトルデータ７１を読み出し、当該補正量ベクトルデータ７１により示されるベクトルを正規化する。そして、正規化されたベクトルを示すデータを新たな補正量ベクトルデータ７１としてメインメモリに記憶する。なお、上記ステップＳ１９で算出された補正量ベクトルＶｇが、図９に示すベクトルｖ３に相当する。上記ステップＳ１９の次にステップＳ２０の処理が実行される。
【０１２３】
ステップＳ２０において、ＣＰＵ１０は、第１の姿勢を補正するための補正行列Ｍａを算出する。補正行列Ｍａは、ｘｙｚ座標系で表現される加速度ベクトルＶａ２と、ステップＳ１９において正規化された補正量ベクトルＶｇとに基づいて算出される。具体的には、ＣＰＵ１０は、ステップＳ１７でメインメモリに記憶された加速度ベクトルＶａ２と、補正量ベクトルデータ７１を読み出す。そして、上記加速度ベクトルＶａ２を補正量ベクトルＶｇと一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Ｍａとする。つまり、補正行列Ｍａは、図９に示す角度Δθの回転を行う回転行列である。ステップＳ２０で算出された補正行列Ｍａを示すデータは、補正行列データ７２としてメインメモリに記憶される。上記ステップＳ２０の次にステップＳ２１の処理が実行される。
【０１２４】
ステップＳ２１において、ＣＰＵ１０は、第１の姿勢を示す第１姿勢行列Ｍ１を補正行列Ｍａで補正する。具体的には、ＣＰＵ１０は、メインメモリに記憶されている第１姿勢データ６８および補正行列データ７２を読み出す。そして、当該第１姿勢データ６８により示される第１姿勢行列Ｍ１を、当該補正行列データ７２により示される補正行列Ｍａによって変換する（第１姿勢行列Ｍ１と補正行列Ｍａとの積を算出する）。変換後の第１姿勢行列Ｍ１が、補正された第１の姿勢を示すこととなる。つまり、ステップＳ２１の処理は、図１０に示すベクトルｖ１を角度Δθだけ回転させる処理に相当する。ＣＰＵ１０は、変換後の第１姿勢行列Ｍ１を示すデータを、新たな第１姿勢データ６８としてメインメモリに記憶する。上記ステップＳ２１の後、ＣＰＵ１０は第１補正処理を終了する。
【０１２５】
以上のように、第１補正処理においては、加速度センサ３７によって検出された加速度ベクトルと、重力方向ベクトル（図８に示すベクトルＧ）との間に補正量ベクトルＶｇを算出し（ステップＳ１８およびＳ１９）、この補正量ベクトルＶｇにより表される補正量（補正行列Ｍａ。図９に示す角度Δθ）だけ第１の姿勢を補正した（ステップＳ２１）。これによって、ジャイロセンサ５５および５６から算出される第１の姿勢（図８に示すベクトルｖ１または角度θ１）を、加速度センサ３７によって決められる第２の姿勢（図８に示す角度θ２）に近づける補正を行うことができる。かかる補正を行うことにより、より正確な値となるように第１の姿勢を補正することができる。
【０１２６】
また、第１補正処理においては、加速度ベクトルＶａ１が信頼できる場合ほど（加速度ベクトルＶａ１の大きさＬと重力加速度の大きさとの差が小さいほど）、補正度Ａの値が大きくなり、その結果、第１の姿勢は第２の姿勢により近づくように補正される。つまり、加速度ベクトルＶａ１が信頼できる場合ほど、補正量が大きくなり、補正後の第１の姿勢に第２の姿勢が強く反映されることとなる。このように、本実施形態によれば、加速度センサベクトルＶａ１の信頼度に応じて第１補正処理における補正量が決まるので、補正量を当該信頼度に応じて適切に決定することができ、ひいては入力装置８の姿勢をより正確に算出することができる。
【０１２７】
なお、本実施形態においては、上記ステップＳ１８で算出される補正量ベクトルＶｇは、加速度ベクトルＶａ２の終点から重力方向ベクトルの終点までを結ぶ線分をＡ：（１−Ａ）に内分する点を終点とするベクトルであって、補正度Ａの値が大きいほど重力方向ベクトルに近づくベクトルであった。ここで、他の実施形態において、補正度Ａの算出方法によっては、補正量ベクトルＶｇは、重力方向ベクトルの終点と加速度ベクトルＶａ２の終点とを（１−Ａ）：Ａに内分する点を終点とするベクトルであって、補正度Ａの値が小さいほど重力方向ベクトルに近づくベクトルとしてもよい。このとき、上記ステップＳ２０においては、上記補正量ベクトルＶｇを重力方向と一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Ｍａとすればよい。これによっても、本実施形態と同様に補正を行うことができる。
【０１２８】
次に、第１補正処理の第２の処理例について説明する。本実施形態においては、ゲーム装置３は、第１補正処理として上記第１の処理例を採用してもよいし、下記の第２の処理例を採用してもよい。
【０１２９】
上述のように、本実施形態では、加速度ベクトルの向きが鉛直下向きとなる場合における入力装置８の姿勢を第２の姿勢とし、第１の姿勢を第２の姿勢へと近づける補正を行っている（図８〜図１０、図１５）。つまり、第１の姿勢を第２の姿勢へと近づける（または一致させる）ために、加速度ベクトルと重力方向ベクトルとを近づける（一致させる）ように、第１の姿勢を回転させる補正を行っている。ここで、第１の姿勢を回転させる方法の一例として、図１６および図１７を参照して、加速度ベクトルを単純に回転させて重力方向ベクトルと一致させる方法、すなわち、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第１の姿勢を回転させる方法を考える。
【０１３０】
図１６は、空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図である。図１６においては、重力ベクトルＧ（＝（０，−１，０））が重力方向（鉛直下方向）を表し、Ｚ軸ベクトルＭ１Ｚは、入力装置８が第１の姿勢である場合における入力装置８のＺ軸の向きを表し、加速度ベクトルＶａ（上記ベクトルＶａ２に相当）が入力装置８に加えられる加速度を表している。また、図１７は、図１６に示す状態から、加速度ベクトルＶａを最短距離で回転させる方法によって第１の姿勢（Ｚ軸ベクトルＭ１Ｚ）を回転させた状態を示す図である。図１６に示す場合において、上記方法によって第１の姿勢（Ｚ軸ベクトルＭ１Ｚ）を回転させると、図１７に示すように、Ｚ軸ベクトルＭ１Ｚが補正前後において大きく変化する。このように、加速度ベクトルを単純に重力方向ベクトルと一致させる方法では、入力装置８の姿勢を表す所定軸（図１６ではＺ軸）が、補正前後において大きく変化してしまうことがある。
【０１３１】
入力装置８の姿勢を表す所定軸が補正前後において大きく変化することは、例えば、仮想空間内におけるオブジェクトの姿勢を入力装置８の姿勢に応じて制御する場合に問題となる。一例として、仮想のゲーム空間内における剣オブジェクトの姿勢を入力装置８の姿勢に応じて変化させることによって、入力装置８を振る操作によって剣オブジェクトを振ることを可能とするゲーム処理を考える。このようなゲーム処理において、例えば剣オブジェクトの長手方向が入力装置８のＺ軸方向に対応しているとすると、入力装置８のＺ軸が補正によって大きく変化することによって、剣オブジェクトの長手方向の向きが大きく変化することになる。このように、オブジェクトの長手方向が大きく変化すると、（たとえ補正後の姿勢が正確なものであったとしても）プレイヤは操作に違和感を感じてしまう。したがって、入力装置８の姿勢を表す軸のうち、オブジェクトの長手方向に対応する軸については、補正による変化をできるだけ小さくすることが好ましい。また、オブジェクトの長手方向に対応する軸でなくても、他の軸よりもプレイヤが注意を向ける軸（例えば、他の軸よりもゲーム上重要な意味を持つ軸）については、補正による変化をできるだけ小さくすることが好ましい。
【０１３２】
そこで、本実施形態の第１補正処理の第２の処理例では、入力装置８の姿勢を表す所定軸に関して、補正前後における変化ができるだけ小さくなるように、上記第１の姿勢の補正を行う。以下、図１８−図２１を参照して、第１補正処理の第２の処理例について説明する。なお、以下では、補正前後における変化をできるだけ小さくする上記所定軸が入力装置８のＺ軸である場合を例として説明を行う。
【０１３３】
図１８は、図１４に示す第１補正処理（ステップＳ５）の第２の処理例の流れを示すフローチャートである。第１補正処理の第２の処理例においては、まずステップＳ１１において、ＣＰＵ１０は、加速度センサ３７によって検出された加速度の大きさＬを算出する。ステップＳ３０において、ＣＰＵ１０は、加速度センサ３７によって検出された加速度の大きさがＬと重力加速度の大きさ（ここでは１とする）との差を算出し、その差の大きさが所定値Ｋより小さいか否かを判定する。すなわち、加速度の大きさが重力加速度の大きさから大きく外れている場合には、少なくとも入力装置８の姿勢（加速度から推測される姿勢）が安定しておらず、加速度方向を重力加速度とみなすことが妥当でないと考えられるので、加速度の大きさが重力加速度の大きさに近いときだけ補正の処理を行うようにする。ステップＳ３０を行う理由は第１の処理例におけるステップＳ１５と同様の理由である。ステップＳ３０の判定結果が肯定である場合、ステップＳ３１の処理が実行される。一方、ステップＳ３０の判定結果が否定である場合、以降のステップＳ３１〜Ｓ３７の処理がスキップされて、ＣＰＵ１０は第１補正処理を終了する。
【０１３４】
ステップＳ３１において、ＣＰＵ１０は、投影加速度ベクトルＶａｐを算出する。図１９は、投影加速度ベクトルおよび投影重力ベクトル（後述）を示す図である。図１９に示すように、投影加速度ベクトルＶａｐは、空間座標系（ｘｙｚ座標系）において、入力装置８のＺ軸（Ｚ軸ベクトルＭ１Ｚ）に垂直な平面ＸＹに対して、加速度ベクトルＶａを投影したベクトルである。
【０１３５】
上記投影加速度ベクトルＶａｐは、第１姿勢行列Ｍ１と、加速度センサ３７によって検出された加速度ベクトル（加速度データ６４により示される加速度ベクトル）Ｖａ１とを用いて算出することができる。具体的には、ステップＳ３１においてＣＰＵ１０は、メインメモリに記憶されている加速度データ６４および第１姿勢データ６８を読み出す。そして、加速度データ６４により示される加速度ベクトルＶａ１および第１姿勢データ６８により示される第１姿勢行列Ｍ１を用いて、次の式（８）に従って投影加速度ベクトルＶａｐ＝（Ｖａｘ，Ｖａｙ，Ｖａｚ）を算出する。すなわち、加速度ベクトルＶａ１＝（ＶＸ，ＶＹ，ＶＺ）とし、第１姿勢行列Ｍ１の各要素を上式（１）に示す変数とし、投影加速度ベクトルＶａｐ＝（Ｖａｘ，Ｖａｙ，Ｖａｚ）とすると、投影加速度ベクトルＶａｐは次の式（８）に従って算出される。
Ｖａｘ＝Ｘｘ・ＶＸ＋Ｙｘ・ＶＹ
Ｖａｙ＝Ｘｙ・ＶＸ＋Ｙｙ・ＶＹ
Ｖａｚ＝Ｘｚ・ＶＸ＋Ｙｚ・ＶＹ  …（８）
上式（８）は、コントローラ座標系（ＸＹＺ座標系）で表現される加速度ベクトルＶａ１のＸＹ成分を、ｘｙｚ座標系に変換する（第１姿勢行列Ｍ１で回転させる）処理を意味している。投影加速度ベクトルＶａｐは、ｘｙｚ座標系で表現される、ＸＹ平面上のベクトルである。したがって、投影加速度ベクトルＶａｐは、上式（８）のとおり、加速度ベクトルＶａ１をからＺ成分を除いたベクトル（ＶＸ，ＶＹ，０）を、ｘｙｚ座標系に変換することによって得ることができる。ＣＰＵ１０は、上式（８）によって算出された投影加速度ベクトルＶａｐを正規化し、正規化された投影加速度ベクトルＶａｐを示すデータ（投影加速度データ）はメインメモリに記憶される。上記ステップＳ３１の次にステップＳ３２の処理が実行される。
【０１３６】
ステップＳ３２において、ＣＰＵ１０は、投影重力ベクトルＧｐを算出する。図１９に示すように、投影重力ベクトルＧｐは、空間座標系（ｘｙｚ座標系）において、入力装置８のＺ軸（Ｚ軸ベクトルＭ１Ｚ）に垂直な平面ＸＹに対して、重力ベクトルＧを投影したベクトルである。
【０１３７】
上記投影重力ベクトルＧｐは、上記投影加速度ベクトルＶａｐと同様の方法で算出することができる。すなわち、投影重力ベクトルＧｐは、第１姿勢行列Ｍ１と、重力ベクトルとを用いて算出することができる。ここで、空間座標系（ｘｙｚ座標系）における重力ベクトルＧ＝（０，−１，０）は、コントローラ座標系（ＸＹＺ座標系）では（−Ｘｙ，−Ｙｙ，−Ｚｙ）と表すことができる。以上より、ステップＳ３１においてＣＰＵ１０は、メインメモリに記憶されている第１姿勢データ６８を読み出す。そして、第１姿勢データ６８により示される第１姿勢行列Ｍ１と、ＸＹＺ座標系における重力ベクトルＧ＝（−Ｘｙ，−Ｙｙ，−Ｚｙ）とを用いて、次の式（９）に従って投影重力ベクトルＧｐ＝（Ｇｘ，Ｇｙ，Ｇｚ）を算出する。
Ｇｘ＝−Ｘｘ・Ｘｙ−Ｙｘ・Ｙｙ
Ｇｙ＝−Ｘｙ・Ｘｙ−Ｙｙ・Ｙｙ
Ｇｚ＝−Ｘｚ・Ｘｙ−Ｙｚ・Ｙｙ  …（９）
上式（８）と同様の考え方により、投影重力ベクトルＶｐは、ＸＹＺ座標系における重力ベクトルＧからＺ成分を除いたベクトルを、ｘｙｚ座標系に変換することによって得ることができる。したがって、上式（９）のように、ＸＹＺ座標系で表現される重力ベクトルＧのＸＹ成分を、第１姿勢行列Ｍ１で回転させることによって、投影重力ベクトルＶｐを得ることができる。ＣＰＵ１０は、上式（９）によって算出された投影重力ベクトルＧｐを正規化し、正規化された投影重力ベクトルＧｐを示すデータ（投影重力データ）はメインメモリに記憶される。上記ステップＳ３２の次にステップＳ３３の処理が実行される。
【０１３８】
ステップＳ３３において、ＣＰＵ１０は、第１の姿勢に対して第１の変換を行うための第１変換行列ｍｔｘ１を算出する。第１変換行列ｍｔｘ１は、投影加速度ベクトルＶａｐを投影重力ベクトルＧｐと一致させるように、Ｚ軸回りの回転を行う回転行列である（図１９に示す矢印参照）。具体的には、ＣＰＵ１０は、メインメモリに記憶されている上記投影加速度データおよび上記投影重力データを読み出す。そして、投影加速度ベクトルＶａｐを投影重力ベクトルＧｐと一致するように回転させる回転行列を算出し、算出された回転行列を第１変換行列ｍｔｘ１とする。ステップＳ３３で算出された第１変換行列ｍｔｘ１を示すデータ（第１変換行列データ）はメインメモリに記憶される。上記ステップＳ３３の次にステップＳ３４の処理が実行される。
【０１３９】
ステップＳ３４において、ＣＰＵ１０は、第１の姿勢を示す第１姿勢行列Ｍ１を第１変換行列ｍｔｘ１で変換する。具体的には、ＣＰＵ１０は、メインメモリに記憶されている第１姿勢データ６８および上記第１変換行列データを読み出す。そして、当該第１姿勢データ６８により示される第１姿勢行列Ｍ１を、当該第１変換行列データにより示される第１変換行列ｍｔｘ１によって変換する（第１姿勢行列Ｍ１に対して右側から第１変換行列ｍｔｘ１を掛ける）。これによって、第１の姿勢に対して第１の変換が行われたこととなる。ＣＰＵ１０は、変換後の第１姿勢行列Ｍ１を示すデータを、新たな第１姿勢データ６８としてメインメモリに記憶する。上記ステップＳ３４の次にステップＳ３５の処理が実行される。
【０１４０】
上記ステップＳ３４によって、第１の姿勢に対して第１変換行列によって変換が行われたこととなる。図２０は、図１９に示す状態から第１の変換を行った状態を示す図である。ここで、第１変換行列による第１の変換はＺ軸回りの回転であるので、図２０に示されるように、入力装置８のＺ軸を表すＺ軸ベクトルＭ１Ｚは第１の変換によっては向きが変わらない。ただし、図２０には示していないが、入力装置８のＸ軸およびＹ軸は第１の変換によってＺ軸回りに回転しており、第１の姿勢は変化している。
【０１４１】
ステップＳ３５において、ＣＰＵ１０は、上記ステップＳ３４によって変換された後の入力装置８の姿勢に対応する（入力装置８に加えられる）加速度を示すように、加速度ベクトルＶａを修正する。修正後の加速度ベクトルＶａ’は、上記ステップＳ３４によって変換された後の第１の姿勢（第１姿勢行列Ｍ１）と、ＸＹＺ座標系における加速度ベクトルＶａ１とを用いて算出することができる。具体的には、ＣＰＵ１０は、メインメモリに記憶されている第１姿勢データ６８および加速度データ６４を読み出し、第１姿勢行列Ｍ１と加速度ベクトルＶａ１と用いて、次の式（１０）に従って修正後の加速度ベクトルＶａ’＝（Ｃｘ，Ｃｙ，Ｃｚ）を算出する。
Ｃｘ＝Ｘｘ・ＶＸ＋Ｙｘ・ＶＹ＋Ｚｘ・ＶＺ
Ｃｙ＝Ｘｙ・ＶＸ＋Ｙｙ・ＶＹ＋Ｚｙ・ＶＺ
Ｃｚ＝Ｘｚ・ＶＸ＋Ｙｚ・ＶＹ＋Ｚｚ・ＶＺ  …（１０）
上式（１０）に示されるように、修正後の加速度ベクトルＶａ’は、ＸＹＺ座標系における加速度ベクトルＶａ１を、上記ステップＳ３４によって変換された後の第１姿勢行列Ｍ１で回転させることによって得ることができる。なお、図２０に示されるように、修正後の加速度ベクトルＶａ’は、ｘｙｚ座標系における加速度ベクトルＶａ２を、上記第１変換行列ｍｔｘ１で回転させたものである。つまり、修正後の加速度ベクトルＶａ’は、加速度ベクトルＶａ２と、上記第１変換行列ｍｔｘ１とを用いて算出することも可能である。なお、第２の処理例では、加速度ベクトルＶａ２を算出する処理を省くために、加速度ベクトルＶａ１が用いられる上式（１０）によってベクトルＶａ’を算出している。ＣＰＵ１０は、上式（１０）で算出された加速度ベクトルＶａ’を正規化し、正規化された加速度ベクトルＶａ’を示すデータ（修正加速度データ）をメインメモリに記憶する。上記ステップＳ３５の次にステップＳ３６の処理が実行される。
【０１４２】
ステップＳ３６において、ＣＰＵ１０は、第１の姿勢に対して第２の変換を行うための第２変換行列ｍｔｘ２を算出する。図２１は、図２０に示す状態から第２の変換を行った状態を示す図である。第２変換行列ｍｔｘ２は、ステップＳ３５における修正後の加速度ベクトルＶａ’を重力ベクトルＧと一致させるように回転を行う回転行列である（図２０に示す矢印参照）。具体的には、ＣＰＵ１０は、メインメモリに記憶されている上記修正加速度データを読み出す。そして、修正後の加速度ベクトルＶａ’を重力ベクトルＧ＝（０，−１，０）と一致するように回転させる回転行列を算出し、算出された回転行列を第２変換行列ｍｔｘ２とする。ステップＳ３６で算出された第２変換行列ｍｔｘ２を示すデータ（第２変換行列データ）はメインメモリに記憶される。上記ステップＳ３６の次にステップＳ３７の処理が実行される。
【０１４３】
ステップＳ３７において、ＣＰＵ１０は、第１の姿勢を示す第１姿勢行列Ｍ１を第２変換行列ｍｔｘ２で変換する。具体的には、ＣＰＵ１０は、メインメモリに記憶されている第１姿勢データ６８および上記第２変換行列データを読み出す。そして、当該第１姿勢データ６８により示される第１姿勢行列Ｍ１を、当該第２変換行列データにより示される第２変換行列ｍｔｘ２によって変換する（第１姿勢行列Ｍ１と第２変換行列ｍｔｘ２との積を算出する）。これによって、第１の姿勢に対して第２の変換が行われたこととなる。このとき、図２１に示されるように、Ｚ軸ベクトルＭ１Ｚは第２の変換によって向きが変更される。ＣＰＵ１０は、変換後の第１姿勢行列Ｍ１を示すデータを、新たな第１姿勢データ６８としてメインメモリに記憶する。上記ステップＳ３７の後、ＣＰＵ１０は第１補正処理を終了する。
【０１４４】
以上のように、第１補正処理の第２の処理例によれば、まず、第１の姿勢に対して、Ｚ軸に垂直な平面ＸＹに加速度ベクトルＶａを投影した方向（投影加速度ベクトルＶａｐ）と、当該平面ＸＹに鉛直下方向（重力方向）を投影した方向（投影重力ベクトルＧｐ）とを一致させるＺ軸回りの回転を行う第１の変換によって変換される（ステップＳ３４、図２０）。そしてさらに、第１の姿勢に対して、上記第１の変換が行われた加速度ベクトル（加速度ベクトルＶａ’）の方向と鉛直下方向とを一致させる回転を行う第２の変換が行われる（ステップＳ３７、図２１）。このように、第１の変換を行ってから第２の変換を行うことによって、補正前後におけるＺ軸の変化は最小となる。したがって、第２の処理例によれば、加速度ベクトルを単純に（最短距離で）回転させて重力方向ベクトルと一致させる方法（図１７）に比べて、Ｚ軸の変化を小さくすることができる。これによれば、入力装置８の姿勢によってオブジェクトの姿勢を操作する場合であって、例えば入力装置８のＺ軸を仮想空間のオブジェクトの長手方向に対応させる場合において、第１補正処理による補正が行われてもオブジェクトの長手方向の向きがあまり変化しない。そのため、当該補正をプレイヤにとって目立ちにくくする（プレイヤが補正に気づきにくくする）ことができ、当該補正によってプレイヤが違和感を感じることを防止することができるので、その結果操作性の良いゲーム操作を提供することができる。
【０１４５】
なお、上記実施形態においては、ＣＰＵ１０は、第１の変換処理（ステップＳ３４）と第２の変換処理（ステップＳ３５）とを別々に実行したが、他の実施形態においては、第１および第２の変換処理をまとめて１回の処理で実行するようにしてもよい。すなわち、図１８に示す処理において、ＣＰＵ１０は、ステップＳ３４の処理を実行しない代わりに、ステップＳ３７において、第１変換行列ｍｔｘ１と第２変換行列ｍｔｘ２とを合成し、合成した回転行列で第１の姿勢を回転させるようにしてもよい。この場合でも、第１の変換と第２の変換とからなる変換によって入力装置８の姿勢を補正することができ、上記実施形態と同様の効果を得ることができる。
【０１４６】
また、上記第２の処理例は、上記第１および第２の変換からなる変換によって、入力装置８の姿勢を表す所定軸（Ｚ軸）に関して補正前後の向きの変化が最も小さくなるように、第１の姿勢を補正するものであった。ここで、他の実施形態においては、ＣＰＵ１０は、入力装置８の姿勢を表す所定軸に関して補正前後の向きの変化が最も小さくなるようにすればよく、例えば次の処理によって第１の姿勢を補正するようにしてもよい。すなわち、ＣＰＵ１０は、まず、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第１の姿勢を回転させ（図１７）、次に、補正前後で所定軸の向きの変化が最小となるように、鉛直下方向回りに第１の姿勢を回転させるようにしてもよい。これによっても、上記実施形態と同様の効果を得ることができる。
【０１４７】
また、上記第２の処理例においては、上記第１の処理例で用いた補正度Ａを用いず、加速度ベクトルＶａと重力ベクトルＧとを一致させるように補正を行った。ここで、他の実施形態においては、第２の処理例においても補正度Ａを用いるようにしてもよい。具体的には、ステップＳ３３において、ＣＰＵ１０は、投影加速度ベクトルＶａｐの終点から投影重力ベクトルＧｐの終点までを結ぶ線分をＡ：（１−Ａ）に内分する点を終点とするベクトルを算出し、投影加速度ベクトルＶａｐを当該ベクトルと一致させるようにＺ軸回りの回転を行う回転行列を上記第１変換行列として算出すればよい。また、ステップＳ３６においては、修正後の加速度ベクトルＶａ’の終点から重力ベクトルＧの終点までを結ぶ線分をＡ：（１−Ａ）に内分する点を終点とするベクトルを算出し、加速度ベクトルＶａ’を当該ベクトルと一致させるように回転を行う回転行列を上記第２変換行列として算出すればよい。なお、第２の処理例において補正度Ａを用いる場合、第１の変換による補正と第２の変換による補正とで補正度Ａとして同じ値を用いてもよいし、異なる値を用いてもよい。
【０１４８】
また、上記第２の処理例においては、ＸＹ平面と加速度ベクトルＶａとが垂直になる場合、または、ＸＹ平面と重力方向ベクトルＧとが垂直になる場合、正しく補正が行われない可能性がある。投影加速度ベクトルＶａｐまたは投影重力ベクトルＧｐが０になってしまうからである。したがって、上記の場合には、ＣＰＵ１０は、第２の処理例による補正を実行せずに、第１の補正処理を終了してもよい（つまり、第１の補正処理は実行されない）。あるいは、上記の場合には、ＣＰＵ１０は、上記第１の処理例による補正を実行するようにしてもよい。
【０１４９】
図１４の説明に戻り、ステップＳ５の次のステップＳ６において、ＣＰＵ１０は、前述した第２補正処理を実行する。第２補正処理は、マーカ座標データを用いて第１の姿勢を補正する処理である。以下、図２２を参照して、第２補正処理の詳細を説明する。
【０１５０】
図２２は、図１４に示す第２補正処理（ステップＳ６）の流れを示すフローチャートである。第１補正処理においては、まずステップＳ４１において、ＣＰＵ１０は、入力装置８の撮像手段（撮像素子４０）によってマーカ部６が撮像されているか否かを判定する。ステップＳ４１の判定は、メインメモリに記憶されているマーカ座標データ６５を参照することによって行うことができる。ここでは、マーカ座標データ６５が２つのマーカ座標を示す場合、マーカ部６が撮像されていると判定し、マーカ座標データ６５が１つのマーカ座標のみを示す場合、または、マーカ座標がないことを示す場合、マーカ部６が撮像されていないと判定する。ステップＳ４１の判定結果が肯定である場合、以降のステップＳ４２〜Ｓ４７の処理が実行される。一方、ステップＳ４１の判定結果が否定である場合、以降のステップＳ４２〜Ｓ４７の処理がスキップされ、ＣＰＵ１０は、第２補正処理を終了する。このように、撮像素子４０によってマーカ部６が撮像されていない場合には、撮像素子４０から得られるデータを用いて入力装置８の姿勢を算出することができないので、この場合には第２補正処理において補正は行われない。
【０１５１】
ステップＳ４２において、ＣＰＵ１０は、マーカ座標データに基づいてロール姿勢成分Ｍ３ｒを算出する。ロール姿勢成分Ｍ３ｒは、撮像画像内でのマーカ部６の向きに基づいて、すなわち、マーカ座標データ６５により示される２つのマーカ座標を結ぶ線の傾きに基づいて算出される。以下、図２３を参照して、ロール姿勢成分Ｍ３ｒの算出方法の例を説明する。
【０１５２】
図２３は、撮像画像に対応する２次元座標を示す図である。図２３に示されるように、本実施形態においては、撮像画像における位置を表すための２次元座標系（ｘ’ｙ’座標系）は、撮像画像の範囲を−１≦ｘ’≦１、−１≦ｙ’≦１で表すものとする。ｘ’ｙ’座標系は、入力装置８が基準姿勢（入力装置８の撮像方向がマーカ部６の中央を向き、かつ、コントローラ５のボタン面が鉛直上向きとなる姿勢）にある場合に、撮像画像において鉛直下向きがｙ’軸正方向となり、右向きがｘ’軸正方向となるように設定されるものとする。また、図２３に示す点Ｐ１および点Ｐ２はマーカ座標の位置を示し、点Ｐ３は点Ｐ１と点Ｐ２との中点である。図２３に示すベクトルｖ１０は、点Ｐ１を始点とし、点Ｐ２を終点とするベクトルである。
【０１５３】
ロール姿勢成分Ｍ３ｒを算出するために、ＣＰＵ１０はまず、マーカ座標データ６５を読み出し、当該マーカ座標データ６５により示される２つのマーカ座標から上記ベクトルｖ１０を算出する。さらに、ベクトルｖ１０を正規化したベクトル（ｈｘ，ｈｙ）を算出する。このベクトル（ｈｘ，ｈｙ）は、入力装置８が上記基準姿勢にある場合にｘ軸正方向を向き、入力装置８のロール方向の回転に応じて向きが変化する。ベクトル（ｈｘ，ｈｙ）がロール方向の姿勢に対応しているので、ロール姿勢成分Ｍ３ｒは、このベクトル（ｈｘ，ｈｙ）に基づいて算出することができる。具体的には、ＣＰＵ１０は、次の式（１１）に従ってロール姿勢成分Ｍ３ｒを算出する。
【数２】
2010207331.tif 000004
上式（１１）によって算出された行列を示すデータは、ロール姿勢成分データ７３としてメインメモリに記憶される。ステップＳ４２の次にステップＳ４３の処理が実行される。
【０１５４】
ステップＳ４３において、ＣＰＵ１０は、マーカ座標データに基づいてヨー姿勢成分Ｍ３ｙを算出する。ヨー姿勢成分Ｍ３ｙは、撮像画像内でのマーカ部６の向きおよび位置に基づいて算出される。以下、図２３を参照して、ヨー姿勢成分Ｍ３ｙの算出方法の例を説明する。
【０１５５】
まず、ＣＰＵ１０は、マーカ座標データ６５を読み出し、当該マーカ座標データ６５により示される２つのマーカ座標の中点を算出する。本実施形態では、マーカ部６の位置として当該中点の位置を用いる。さらに、ＣＰＵ１０は、算出された中点の座標を、ｘ’ｙ’座標系の原点を中心として、入力装置８のロール方向に関する回転角度だけ（入力装置８の回転方向とは逆方向に）回転させた座標（ｐｘ，ｐｙ）を算出する。換言すれば、中点の座標は、原点を中心として、上記ベクトル（ｈｘ，ｈｙ）がｘ軸正方向を向くように回転される。入力装置８が水平方向（ｘ軸方向）に関してマーカ部６と同じ位置（すなわち、マーカ部６の正面の位置）にあるとすれば、上記のようにして得られた回転後の座標（ｐｘ，ｐｙ）から、ヨー方向に関する姿勢を算出することができる。
【０１５６】
次に、ＣＰＵ１０は、上記中点の回転後の座標（ｐｘ，ｐｙ）と、マーカ部６がｘ’軸方向の端に位置する場合のヨー方向の角度（限界角度）θｙ’とに基づいて、ヨー方向に関する回転角度θｙを算出する。ここで、上記限界角度θｙ’と、上記限界角度θｙ１となる場合における上記中点の回転後のｘ座標値ｐｘ’とは予め求めておくことができる。したがって、ｐｘとｐｘ’との比が、θｙとθｙ’との比に等しくなることを用いて、ヨー方向に関する回転角度θｙを算出することができる。具体的には、ヨー方向に関する回転角度θｙは、次の式（１２）によって算出することができる。
θｙ＝ｐｘ×θｙ’／ｐｘ’  …（１２）
なお、マーカ部６の水平方向の長さを無視する場合、上記限界角度θｙ’は、コントローラ５の画角の１／２とし、上記ｐｘ’の値は“１”とすることができる。
【０１５７】
最後に、ＣＰＵ１０は、上式（１２）により算出された角度θｙの回転を行う回転行列をヨー姿勢成分Ｍ３ｙとして算出する。具体的には、ヨー姿勢成分Ｍ３ｙは次の式（１３）によって算出される。
【数３】
2010207331.tif 000005
上式（１３）によって算出された行列を示すデータが、ヨー姿勢成分データ７４としてメインメモリに記憶される。以上のステップＳ４３の次にステップＳ４４の処理が実行される。
【０１５８】
ステップＳ４４において、ＣＰＵ１０は、ロール姿勢成分Ｍ３ｒとヨー姿勢成分Ｍ３ｙとを合成する。すなわち、メインメモリからロール姿勢成分データ７３およびヨー姿勢成分データ７４を読み出し、各データ７３および７４により示されるロール姿勢成分Ｍ３ｒとヨー姿勢成分Ｍ３ｙとを積算する。ステップＳ４４の次にステップＳ４５の処理が実行される。
【０１５９】
ステップＳ４５において、ＣＰＵ１０は、第１の姿勢に基づいてピッチ姿勢成分Ｍ３ｐを算出する。なお、本実施形態の処理とは異なるが、ピッチ姿勢成分Ｍ３ｐについても、ヨー姿勢成分Ｍ３ｙと同様の方法で、上記座標（ｐｘ，ｐｙ）のｙ座標値に基づいて算出することが可能である。ただし、上記座標（ｐｘ，ｐｙ）を用いてヨー方向（ピッチ方向）の姿勢を算出する方法は、入力装置８が水平方向（ピッチ方向の場合は鉛直方向）に関してマーカ部６と同じ位置にあることを前提として成り立つ方法である。本実施形態のゲームシステム１においては、プレイヤは、水平方向に関してマーカ部６（テレビ２）のほぼ正面の位置で入力装置８を操作すると考えられるので、「入力装置８が水平方向に関してマーカ部６と同じ位置にある」ことを前提して、上記ステップＳ４３の方法によってヨー方向の姿勢を算出することが可能である。一方、プレイヤは、立って入力装置８を操作することも座って入力装置８を操作することも考えられ、また、マーカ部６の位置もテレビ２の画面の上側に配置されることも下側に配置されることも考えられる。そのため、本実施形態のゲームシステム１においては、「入力装置８が鉛直方向に関してマーカ部６と同じ位置にある」ことを必ずしも前提にできないため、上記座標（ｐｘ，ｐｙ）を用いてピッチ方向の姿勢を算出することを行わないようにしてもよい。
【０１６０】
そこで、本実施形態においては、ピッチ姿勢成分Ｍ３ｐについては、第１の姿勢をそのまま用いることとする（したがって、第２補正処理においては、ピッチ方向に関しては補正が行われない）。具体的には、ＣＰＵ１０は、メインメモリから第１姿勢データ６８を読み出す。そして、第１姿勢データ６８により示される第１姿勢行列Ｍ１の各要素を用いて、ピッチ方向に関する回転角度θｐを、次の式（１４）に従って算出する。
ｃｏｓ（θｐ）＝（Ｚｘ×Ｚｘ＋Ｚｚ×Ｚｚ）1/2
ｓｉｎ（θｐ）＝Ｚｙ …（１４）
上式（１４）における変数Ｚｘ，Ｚｙ，Ｚｚは、上式（１）において示した第１姿勢行列Ｍ１の要素である。なお、ここで用いられる第１姿勢行列Ｍ１は、今回の処理ループにおいて第１補正処理が行われた後の第１姿勢行列Ｍ１である。さらに、ＣＰＵ１０は、上式（１４）で算出したｃｏｓ（θｐ）およびｓｉｎ（θｐ）を用いて、次の式（１５）に従ってピッチ姿勢成分Ｍ３ｐの行列を算出する。
【数４】
2010207331.tif 000006
上式（１５）によって算出された行列を示すデータが、ピッチ姿勢成分データ７５としてメインメモリに記憶される。以上のステップＳ４５の次にステップＳ４６の処理が実行される。
【０１６１】
ステップＳ４６において、ＣＰＵ１０は、ロール方向、ヨー方向、およびピッチ方向の各姿勢成分に基づいて第３の姿勢を算出する。第３の姿勢は、ロール姿勢成分Ｍ３ｒとヨー姿勢成分Ｍ３ｙとの合成結果に、ピッチ姿勢成分Ｍ３ｐをさらに合成することによって得られる。具体的には、ＣＰＵ１０は、メインメモリからピッチ姿勢成分データ７５を読み出し、当該ピッチ姿勢成分データ７５により示されるピッチ姿勢成分Ｍ３ｐを、ステップＳ４４で算出された行列に積算する。算出された行列を示すデータは、第３姿勢データ７６としてメインメモリに記憶される。ステップＳ４６の次にステップＳ４７の処理が実行される。
【０１６２】
ステップＳ４７において、ＣＰＵ１０は、第３の姿勢を用いて第１の姿勢を補正する。ステップＳ４７における補正は、第１姿勢行列Ｍ１を第３姿勢行列Ｍ３に所定の割合（下記の定数Ｃ２）で近づけることによって行われる。ＣＰＵ１０は、メインメモリから第１姿勢データ６８および第３姿勢データ７６を読み出す。そして、第１姿勢データ６８により示される第１姿勢行列Ｍ１と、第３姿勢データ７６により示される第３姿勢行列Ｍ３とを用いて、次の式（１６）に従って補正を行う。
Ｍ１＝（Ｍ３−Ｍ１’）×Ｃ２＋Ｍ１’  …（１６）
上式（１６）において、変数Ｍ１’は補正前の第１姿勢行列である。また、定数Ｃ２は、０＜Ｃ２≦１の範囲で予め設定され、例えば０．１に設定される。上式（１６）によって算出された補正後の第１姿勢行列Ｍ１を示すデータが、新たな第１姿勢データ６８としてメインメモリに記憶される。上記ステップＳ４７の後、ＣＰＵ１０は第２補正処理を終了する。
【０１６３】
以上のように、第２補正処理においては、撮像画像（マーカ座標）から第３の姿勢を算出し、第１の姿勢を第３の姿勢に近づけるように補正することとした。この補正によって、より正確な値となるように第１の姿勢を補正することができる。なお、本実施形態においては、ロール方向およびヨー方向の姿勢についてのみ撮像画像から第３の姿勢を算出したが、上述のように、ピッチ方向についても撮像画像から第３の姿勢を算出することは可能であり、他の実施形態においては、ロール方向、ヨー方向、およびピッチ方向について撮像画像から第３の姿勢を算出してもよい。また、第２補正処理においては、ロール方向、ヨー方向、およびピッチ方向のうち少なくとも１方向について第３の姿勢を算出すればよい。特に、第１補正処理（ステップＳ７）において第２の処理例を採用する場合には、第２補正処理においては、ロール方向のみについて第３の姿勢を算出し、ロール方向にのみ第１の姿勢を補正（回転）するようにしてもよい。つまり、ヨー方向およびピッチ方向について補正を行うと、Ｚ軸の向きが変化し、補正前後でのＺ軸の向きの変化が大きくなってしまう可能性があるので、Ｚ軸の向きをあまり変化させない目的で第２の処理例を採用する場合には、ロールに関する補正のみ行えばよい。
【０１６４】
図１４の説明に戻り、ステップＳ６の次のステップＳ７において、ＣＰＵ１０は、補正後の第１の姿勢を用いたゲーム処理を実行する。このゲーム処理は、補正後の第１の姿勢を表す第１姿勢行列Ｍ１を入力値としてゲーム結果に反映させる処理であればどのような処理であってもよい。例えば、仮想のゲーム空間内のオブジェクトを、第１姿勢行列Ｍ１により示される姿勢となるように制御して表示する処理であってもよいし、第１姿勢行列Ｍ１により示される姿勢と所定の姿勢との角度に応じた速度で上記オブジェクトを移動させるように制御して表示する処理であってもよい。ステップＳ７の次にステップＳ８の処理が実行される。
【０１６５】
ステップＳ８において、ＣＰＵ１０は、ゲームを終了するか否かを判定する。ステップＳ８の判定は、例えば、ゲームがクリアされたか否か、ゲームオーバーとなったか否か、プレイヤがゲームを中止する指示を行ったか否か等によって行われる。ステップＳ８の判定結果が否定である場合、ステップＳ３の処理が再度実行される。以降、ステップＳ８でゲームを終了すると判定されるまで、ステップＳ３〜Ｓ８の処理ループが繰り返し実行される。一方、ステップＳ８の判定結果が肯定である場合、ＣＰＵ１０は、図１４に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
【０１６６】
以上のように、本実施形態においては、ジャイロセンサ５５および５６によって検出された角速度から入力装置８の第１の姿勢を算出し（ステップＳ４）、第１の姿勢を第１補正処理（Ｓ５）および第２補正処理（Ｓ６）によって補正した。そして、補正後の第１の姿勢を用いてゲーム処理を実行する（ステップＳ７）ので、ＣＰＵ１０は、入力装置８の正確な姿勢に基づいたゲーム処理を実行することができる。これによれば、例えば、入力装置８の姿勢をゲーム空間内のオブジェクトの姿勢に対して正確に反映させることができるので、ゲーム操作の操作性を向上することができる。
【０１６７】
［変形例］
なお、上記実施形態においては、３軸回りの角速度を検出するジャイロセンサを用いて、３次元の姿勢を算出する場合を例として説明したが、図８〜図１２にも示したように、２次元平面上における姿勢（回転角度）を算出する場合においても本発明を適用することが可能である。なお、２次元平面上における姿勢は、２軸回りの角速度を２軸ジャイロセンサで検出することによって算出してもよいし、所定の１軸回りの角速度を１軸ジャイロセンサで検出することによって算出してもよい。
【０１６８】
また、他の実施形態においては、第２補正処理は、入力装置８がマーカ部６を撮像していると推測される場合にのみ、実行されるようにしてもよい。具体的には、ＣＰＵ１０は、第２補正処理を実行する前に、入力装置８（撮像手段）がマーカ部６を撮像可能な向きを向いているか否かを判定する。この判定は、第１の姿勢あるいは第２の姿勢を用いて行うことができる。例えば、第１の姿勢（または第２の姿勢）が、入力装置８の撮像方向が入力装置８からマーカ部６への向きに対して同じ向きかそれとも逆向きかを判定するようにしてもよい。また、上記の判定に用いられる第１の姿勢は、前回の処理ループにおいて第１および第２補正処理が行われた第１の姿勢であってもよいし、今回の処理ループにおいて算出されて第１補正処理が行われた第１の姿勢であってもよい。
【０１６９】
上記の判定の結果、ＣＰＵ１０は、入力装置８がマーカ部６を撮像可能な向きを向いていると判定される場合、第２補正処理を実行し、マーカ部６を撮像可能な向きを向いていないと判定される場合、第２補正処理をスキップする。なお、マーカ部６でない物（例えば、部屋の電灯や窓の外の太陽光等）がマーカ部６と誤検出されることがあり、誤検出によって得られたマーカ座標を用いて第３の姿勢が算出される場合、かかる第３の姿勢を用いて第２補正処理を行っても正確に補正を行うことができない。これに対して、上記の判定処理を行うことにより、誤検出によって得られたマーカ座標から算出される第３の姿勢を用いて第２補正処理が行われることを防止することができる。これによって、第２補正処理をより正確に行うことができる。
【産業上の利用可能性】
【０１７０】
以上のように、本発明は、ジャイロセンサを用いて入力装置の姿勢を正確に算出すること等を目的として、例えば入力装置の姿勢に応じたゲーム処理を行うゲーム装置またはゲームプログラム等として利用することが可能である。
【符号の説明】
【０１７１】
１    ゲームシステム
２    テレビ
３    ゲーム装置
４    光ディスク
５    コントローラ
６    マーカ部
７    ジャイロセンサユニット
８    入力装置
１０    ＣＰＵ
１１ｃ  ＧＰＵ
１１ｅ  内部メインメモリ
１２    外部メインメモリ
６３    角速度データ
６４    加速度データ
６５    マーカ座標データ
６８    第１姿勢データ
７６    第３姿勢データ
【図１】
2010207331.tif 000007
【図２】
2010207331.tif 000008
【図３】
2010207331.tif 000009
【図４】
2010207331.tif 000010
【図５】
2010207331.tif 000011
【図６】
2010207331.tif 000012
【図７】
2010207331.tif 000013
【図８】
2010207331.tif 000014
【図９】
2010207331.tif 000015
【図１０】
2010207331.tif 000016
【図１１】
2010207331.tif 000017
【図１２】
2010207331.tif 000018
【図１３】
2010207331.tif 000019
【図１４】
2010207331.tif 000020
【図１５】
2010207331.tif 000021
【図１６】
2010207331.tif 000022
【図１７】
2010207331.tif 000023
【図１８】
2010207331.tif 000024
【図１９】
2010207331.tif 000025
【図２０】
2010207331.tif 000026
【図２１】
2010207331.tif 000027
【図２２】
2010207331.tif 000028
【図２３】
2010207331.tif 000029
【手続補正書】
【提出日】平成21年5月13日(2009.5.13)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する姿勢算出装置であって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第１補正手段とを備え、
前記第１補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出装置。
【請求項２】
前記第１補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第１の変換と、前記第１の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第２の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項１に記載の姿勢算出装置。
【請求項３】
前記第１補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項１または請求項２に記載の姿勢算出装置。
【請求項４】
前記第１補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項１から請求項３のいずれか１項に記載の姿勢算出装置。
【請求項５】
前記第１補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項１から請求項４のいずれか１項に記載の姿勢算出装置。
【請求項６】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第２補正手段をさらに備える、請求項１から請求項５のいずれか１項に記載の姿勢算出装置。
【請求項７】
前記第２補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項６に記載の姿勢算出装置。
【請求項８】
請求項１から請求項７のいずれか１項に記載の姿勢算出装置によって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲーム装置。
【請求項９】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、３次元の空間における当該入力装置の姿勢を算出する姿勢算出装置のコンピュータで実行される姿勢算出プログラムあって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第１補正手段として前記コンピュータを機能させ、
前記第１補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出プログラム。
【請求項１０】
前記第１補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第１の変換と、前記第１の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第２の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項９に記載の姿勢算出プログラム。
【請求項１１】
前記第１補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項９または請求項１０に記載の姿勢算出プログラム。
【請求項１２】
前記第１補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項９から請求項１１のいずれか１項に記載の姿勢算出プログラム。
【請求項１３】
前記第１補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項９から請求項１２のいずれか１項に記載の姿勢算出プログラム。
【請求項１４】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第２補正手段として前記コンピュータをさらに機能させる、請求項９から請求項１３のいずれか１項に記載の姿勢算出プログラム。
【請求項１５】
前記第２補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項１４記載の姿勢算出プログラム。
【請求項１６】
請求項９から請求項１５のいずれか１項に記載の姿勢算出プログラムによって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲームプログラム。