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