姿勢算出装置、姿勢算出プログラム、ゲーム装置、およびゲームプログラム
【課題】ジャイロセンサを用いて入力装置の姿勢を正確に算出する。
【解決手段】姿勢算出装置は、ジャイロセンサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する。姿勢算出手段は、ジャイロセンサが検出する角速度に基づいて入力装置の姿勢を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データに基づいて入力装置の加速度を示す加速度ベクトルを算出する。補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、補正手段は、入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。
【解決手段】姿勢算出装置は、ジャイロセンサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する。姿勢算出手段は、ジャイロセンサが検出する角速度に基づいて入力装置の姿勢を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データに基づいて入力装置の加速度を示す加速度ベクトルを算出する。補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、補正手段は、入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、姿勢算出装置または姿勢算出プログラムに関し、より特定的には、入力装置の姿勢を算出する姿勢算出装置または姿勢算出プログラムに関する。
【背景技術】
【0002】
従来、加速度センサおよびジャイロセンサを用いて入力装置の姿勢を算出する技術が考えられている。例えば、特許文献1には、加速度センサおよびジャイロセンサを備えた入力制御装置を使用するゲーム装置が記載されている。このゲーム装置は、ゲームキャラクタが持つ刀を入力制御装置の動きに応じて制御するものである。具体的には、加速度センサの出力に基づいて刀を振る動作のデータが作成され、ジャイロセンサの出力に基づいて刀の姿勢のデータが作成される。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2000−308756号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
上記特許文献1のようにジャイロセンサを用いて姿勢を算出する場合、算出される姿勢と入力制御装置の実際の姿勢との間に誤差が生じる。入力制御装置の動きが遅い場合に入力制御装置の角速度がジャイロセンサによって検知されなかったり、逆に、入力制御装置の動きが激しい場合に入力制御装置の角速度がジャイロセンサの検知可能な範囲を超えてしまったりすること等が生じる場合があるからである。また、角速度データの出力の間隔よりも短い期間中に角速度が急激に変化するような場合にも、誤差が発生する可能性がある。そして、角速度から算出される姿勢には、時間とともに角速度の誤差が蓄積されていくことになるので姿勢の誤差が大きくなっていくことになる。特許文献1では、ジャイロセンサから算出される姿勢の誤差を想定していないために、姿勢を正確に算出することができないおそれがある。
【0005】
それ故、本発明の目的は、角速度センサを用いて入力装置の姿勢を正確に算出することができる姿勢算出装置または姿勢算出プログラムを提供することである。
【課題を解決するための手段】
【0006】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、本欄における括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【0007】
本発明は、角速度センサ(ジャイロセンサ55,56)と、加速度センサ(37)とを少なくとも備えた入力装置(8)からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置である。姿勢算出装置は、姿勢算出手段(ステップS4を実行するCPU10。以下、単にステップ番号のみを記載する。)と、加速度ベクトル算出手段(S2)と、第1補正手段(S5)とを備える。姿勢算出手段は、角速度センサが検出する角速度に基づいて入力装置の姿勢(第1姿勢データ68)を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データ(64)に基づいて入力装置の加速度を示す加速度ベクトル(Va1またはVa2)を算出する。第1補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、第1補正手段は、入力装置の姿勢に関して、所定軸(図19に示すZ軸ベクトルM1Z)の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。
【0008】
本発明によれば、角速度センサを用いて算出される姿勢は、加速度データに基づいて補正されるので、角速度センサから算出される姿勢の誤差を補正することができ、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【0009】
また、本発明によれば、姿勢の補正は、姿勢を表す所定軸に関して、補正前の向きと補正後の向きとの変化が最も小さくなるように行われる。そのため、仮想のゲーム空間内におけるオブジェクトの姿勢を入力装置の姿勢に応じて変化させるゲーム処理においては、上記所定軸に対応するオブジェクトの向きは、補正に起因する変化が最小となる。つまり、上記姿勢の補正が行われても、上記所定軸に対応するオブジェクトの向きの変化をできるだけ小さくすることができる。したがって、本発明によれば、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなり、当該補正によってプレイヤが違和感を感じることを防止することができる。その結果、操作性の良いゲーム操作を提供することができる。
【0010】
また、第1補正手段は、所定軸に垂直な平面(図19に示す平面XY)に加速度ベクトルを投影した方向(投影加速度ベクトルVap)と、当該平面に鉛直下方向を投影した方向(投影重力ベクトルGp)とを近づけるように所定軸回りの回転を行う第1の変換(第1変換行列mtx1)と、第1の変換が行われた加速度ベクトル(図20に示す加速度ベクトルVa’)の方向と鉛直下方向とを近づける回転を行う第2の変換(第2変換行列mtx2)とからなる変換によって入力装置の姿勢を補正してもよい。
【0011】
上記によれば、所定軸回りの回転を行う第1の変換と、第1の変換が行われた加速度ベクトルの方向と鉛直下方向とを近づける回転を行う第2の変換とによって入力装置の姿勢を補正するので、当該補正による所定軸の向きの変化を容易かつ確実に最小とすることができる。
【0012】
また、第1補正手段は、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正してもよい(S31−S37)。
【0013】
上記によれば、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正することによって、姿勢を迅速に補正することができる。特に、本発明では、補正による所定軸の変化を小さくしているので、姿勢を迅速に補正する場合であっても、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなる。
【0014】
また、第1補正手段は、加速度ベクトルの大きさが重力加速度の大きさに近いほど、加速度ベクトルの方向と空間における鉛直下方向とが近づくように、入力装置の姿勢の補正量を制御してもよい。
【0015】
上記によれば、加速度センサによって検出された加速度の大きさが重力加速度の大きさに近いほど、入力装置の姿勢がより大きく補正されることになる。ここで、加速度センサの検出結果は、加速度の大きさが重力加速度の大きさが近いほど、重力加速度の方向をより正確に示していると推測され、重力加速度の方向が正確に得られていると推測される。上記によれば、重力加速度の方向が正確に得られている場合ほど、当該重力加速度を基準とした補正が強く反映され、重力加速度の方向があまり正確に得られていない場合には、当該重力加速度を基準とした補正があまり反映されないこととなる。これによって、補正後の姿勢をより正確に算出することができる。
【0016】
また、第1補正手段は、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ入力装置の姿勢を補正してもよい。
【0017】
上記によれば、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準以上である場合には、第1補正手段は補正を行わない。つまり、加速度ベクトルが重力加速度の方向を正確に示していないと推測される場合には(不正確な)加速度ベクトルを用いた補正を行わないようにすることによって、結果的に、姿勢をより正確に算出することができる。
【0018】
また、入力装置は、撮像手段(撮像素子40)をさらに備えていてもよい。このとき、姿勢算出装置は、撮像手段が撮像する所定の撮像対象の画像(撮像画像)に基づいて、入力装置の姿勢をさらに補正する第2補正手段(S6)をさらに備える。
【0019】
上記によれば、撮像手段の画像に基づいて入力装置の姿勢をさらに補正することによって、入力装置の姿勢をより正確に算出することができる。
【0020】
また、第2補正手段は、入力装置の姿勢に所定軸(Z軸)回りの回転を加えることによって入力装置の姿勢を補正してもよい。
【0021】
上記によれば、撮像手段の画像に基づく補正は、所定軸回りの回転に関して行われることとなる。所定軸回りの回転であれば、補正がプレイヤに気づかれにくいので、入力装置の操作性を維持しながら、入力装置の姿勢をより正確に算出することができる。
【0022】
また、本発明は、上記の姿勢算出装置によって補正された姿勢を入力装置の姿勢として用いてゲーム処理(S7)を行うゲーム装置として提供されてもよい。
【0023】
上記によれば、ゲームのプレイヤは、加速度データおよび撮像対象の画像に基づいて補正された正確な入力装置の姿勢をゲーム入力として用いてゲーム操作を行うことができるので、入力装置の姿勢に応じたゲーム操作の操作性を向上することができる。
【0024】
また、本発明は、情報処理装置のコンピュータを上記各手段として機能させる姿勢算出プログラムあるいはゲームプログラムの形態で実施されてもよい。
【発明の効果】
【0025】
本発明によれば、角速度センサを用いて算出される姿勢は加速度データに基づいて補正される。これによって、角速度センサから算出される姿勢の誤差を補正することができるので、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【図面の簡単な説明】
【0026】
【図1】ゲームシステムの外観図
【図2】ゲーム装置の機能ブロック図
【図3】入力装置の外観構成を示す斜視図
【図4】コントローラの外観構成を示す斜視図
【図5】コントローラの内部構造を示す図
【図6】コントローラの内部構造を示す図
【図7】入力装置の構成を示すブロック図
【図8】第1の姿勢および第2の姿勢を示すベクトルを示す図
【図9】補正量を示すベクトルv3を示す図
【図10】第1補正処理による補正後の第1の姿勢を示すベクトルを示す図
【図11】第1の姿勢および第3の姿勢を示すベクトルを示す図
【図12】第2補正処理による補正後の第1の姿勢を示す図
【図13】ゲーム装置のメインメモリに記憶される主なデータを示す図
【図14】ゲーム装置において実行される処理の流れを示すメインフローチャート
【図15】図14に示す第1補正処理(ステップS5)の第1の処理例の流れを示すフローチャート
【図16】空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図
【図17】図16に示す状態から、加速度ベクトルVaを最短距離で回転させる方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させた状態を示す図
【図18】図14に示す第1補正処理(ステップS5)の第2の処理例の流れを示すフローチャート
【図19】投影加速度ベクトルおよび投影重力ベクトルを示す図
【図20】図19に示す状態から第1の変換を行った状態を示す図
【図21】図20に示す状態から第2の変換を行った状態を示す図
【図22】図14に示す第2補正処理(ステップS6)の流れを示すフローチャート
【図23】撮像画像に対応する2次元座標を示す図
【発明を実施するための形態】
【0027】
[ゲームシステムの全体構成]
図1を参照して、本発明の一実施形態に係る姿勢算出装置の一例であるゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、入力装置8、およびマーカ部6を含む。本システムは、入力装置8を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
【0028】
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【0029】
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
【0030】
入力装置8は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与えるものである。本実施形態では、入力装置8はコントローラ5とジャイロセンサユニット7とを含む。詳細は後述するが、入力装置8は、コントローラ5に対してジャイロセンサユニット7が着脱可能に接続されている構成である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
【0031】
[ゲーム装置3の内部構成]
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
【0032】
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14およびAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSIの内部構成について後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11eまたは外部メインメモリ12に読み出したデータを書き込む。
【0033】
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRA
1d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
【0034】
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
【0035】
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
【0036】
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
【0037】
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
【0038】
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
【0039】
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
【0040】
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
【0041】
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
【0042】
[入力装置8の構成]
次に、図3〜図6を参照して、入力装置8について説明する。図3は、入力装置8の外観構成を示す斜視図である。図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
【0043】
図3および図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、および、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
【0044】
ハウジング31には、複数の操作ボタンが設けられる。図3に示すように、ハウジング31の上面には、十字ボタン32a、1番ボタン32b、2番ボタン32c、Aボタン32d、マイナスボタン32e、ホームボタン32f、プラスボタン32g、および電源ボタン32hが設けられる。本明細書では、これらのボタン32a〜32hが設けられるハウジング31の上面を「ボタン面」と呼ぶことがある。一方、図4に示すように、ハウジング31の下面には凹部が形成されており、当該凹部の後面側傾斜面にはBボタン32iが設けられる。これらの各操作ボタン32a〜32iには、ゲーム装置3が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン32hは遠隔からゲーム装置3本体の電源をオン/オフするためのものである。ホームボタン32fおよび電源ボタン32hは、その上面がハウジング31の上面に埋没している。これによって、プレイヤがホームボタン32fまたは電源ボタン32hを誤って押下することを防止することができる。
【0045】
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、ジャイロセンサユニット7や他のコントローラ)を接続するために利用される。また、ハウジング31の後面におけるコネクタ33の両側には、上記他の機器が容易に離脱することを防止するために係止穴33aが設けられている。
【0046】
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
【0047】
また、コントローラ5は撮像情報演算部35(図6)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6Rおよび6Lからの赤外光を少なくとも透過する材質で構成される。
【0048】
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5)からの音を外部に放出するための音抜き孔31aが形成されている。
【0049】
次に、図5および図6を参照して、コントローラ5の内部構造について説明する。図5および図6は、コントローラ5の内部構造を示す図である。なお、図5は、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6は、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6に示す斜視図は、図5に示す基板30を裏面から見た斜視図となっている。
【0050】
図5において、ハウジング31の内部には基板30が固設されており、当該基板30の上主面上に各操作ボタン32a〜32h、各LED34a〜34d、加速度センサ37、アンテナ45、およびスピーカ49等が設けられる。これらは、基板30等に形成された配線(図示せず)によってマイクロコンピュータ(Micro Computer:マイコン)42(図6参照)に接続される。本実施形態では、加速度センサ37は、X軸方向に関してコントローラ5の中心からずれた位置に配置されている。これによって、コントローラ5をZ軸回りに回転させたときのコントローラ5の動きが算出しやすくなる。また、加速度センサ37は、長手方向(Z軸方向)に関してコントローラ5の中心よりも前方に配置されている。また、無線モジュール44(図6)およびアンテナ45によって、コントローラ5がワイヤレスコントローラとして機能する。
【0051】
一方、図6において、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
【0052】
さらに、基板30の下主面上には、上記マイコン42およびバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5および図6に示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
【0053】
また、ジャイロセンサユニット7は、角速度センサの一例であり、3軸回りの角速度を検知するジャイロセンサ(図7に示すジャイロセンサ55および56)を有する。ジャイロセンサユニット7は、コントローラ5のコネクタ33に着脱可能に装着される。ジャイロセンサユニット7の前端(図3に示すZ軸正方向側の端部)には、コネクタ33に接続可能なプラグ(図7に示すプラグ53)が設けられる。さらに、プラグ53の両側にはフック(図示せず)が設けられる。ジャイロセンサユニット7がコントローラ5に対して装着される状態では、プラグ53がコネクタ33に接続されるとともに、上記フックがコントローラ5の係止穴33aに係止する。これによって、コントローラ5とジャイロセンサユニット7とがしっかりと固定される。また、ジャイロセンサユニット7は側面(図3に示すX軸方向の面)にボタン51を有している。ボタン51は、それを押下すれば上記フックの係止穴33aに対する係止状態を解除することができるように構成されている。したがって、ボタン51を押下しながらプラグ53をコネクタ33から抜くことによって、ジャイロセンサユニット7をコントローラ5から離脱することができる。
【0054】
また、ジャイロセンサユニット7の後端には、上記コネクタ33と同形状のコネクタが設けられる。したがって、コントローラ5(のコネクタ33)に対して装着可能な他の機器は、ジャイロセンサユニット7のコネクタに対しても装着可能である。なお、図3においては、当該コネクタに対してカバー52が着脱可能に装着されている。
【0055】
なお、図3〜図6に示したコントローラ5およびジャイロセンサユニット7の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
【0056】
図7は、入力装置8(コントローラ5およびジャイロセンサユニット7)の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、および加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
【0057】
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
【0058】
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
【0059】
撮像情報演算部35は、赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を含んでいる。赤外線フィルタ38は、コントローラ5の前方から入射する光から赤外線のみを通過させる。レンズ39は、赤外線フィルタ38を透過した赤外線を集光して撮像素子40へ入射させる。撮像素子40は、例えばCMOSセンサやあるいはCCDセンサのような固体撮像素子であり、レンズ39が集光した赤外線を受光して画像信号を出力する。ここで、テレビ2の表示画面近傍に配置されるマーカ部6のマーカ6Rおよび6Lは、テレビ2の前方に向かって赤外光を出力する赤外LEDで構成される。したがって、赤外線フィルタ38を設けることによって、撮像素子40は、赤外線フィルタ38を通過した赤外線だけを受光して画像データを生成するので、マーカ6Rおよび6Lの画像をより正確に撮像することができる。以下では、撮像素子40によって撮像された画像を撮像画像と呼ぶ。撮像素子40によって生成された画像データは、画像処理回路41で処理される。画像処理回路41は、撮像画像内における撮像対象(マーカ6Rおよび6L)の位置を算出する。画像処理回路41は、算出された位置を示す座標を通信部36のマイコン42へ出力する。この座標のデータは、マイコン42によって操作データとしてゲーム装置3に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ5自体の向き(傾斜角度)や位置に対応して変化するので、ゲーム装置3はこのマーカ座標を用いてコントローラ5の向きや位置を算出することができる。
【0060】
なお、他の実施形態においては、コントローラ5は画像処理回路41を備えていない構成であってもよく、撮像画像自体がコントローラ5からゲーム装置3へ送信されてもよい。このとき、ゲーム装置3は、画像処理回路41と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
【0061】
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸または2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
【0062】
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置8(コントローラ5)を基準に設定されるXYZ座標系(コントローラ座標系)における3次元のベクトル(ax,ay,az)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
【0063】
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(傾斜角度)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データに基づいてコントローラ5の姿勢を判断する。
【0064】
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
【0065】
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)またはコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かによって、コントローラ5が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ5がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ5の傾斜方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾斜角度または姿勢を判定することができる。
【0066】
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
【0067】
通信部36は、マイコン42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。また、マイコン42はコネクタ33に接続されている。ジャイロセンサユニット7から送信されてくるデータは、コネクタ33を介してマイコン42に入力される。以下、ジャイロセンサユニット7の構成について説明する。
【0068】
ジャイロセンサユニット7は、プラグ53、マイコン54、2軸ジャイロセンサ55、および1軸ジャイロセンサ56を備えている。上述のように、ジャイロセンサユニット7は、3軸(本実施形態では、XYZ軸)回りの角速度を検出し、検出した角速度を示すデータ(角速度データ)をコントローラ5へ送信する。
【0069】
2軸ジャイロセンサ55は、X軸回りの角速度およびY軸回りの(単位時間あたりの)角速度を検出する。また、1軸ジャイロセンサ56は、Z軸回りの(単位時間あたりの)角速度を検出する。なお、本明細書では、コントローラ5の撮像方向(Z軸正方向)を基準として、XYZ軸回りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、2軸ジャイロセンサ55は、ロール方向(X軸回りの回転方向)およびピッチ方向(Y軸回りの回転方向)の角速度を検出し、1軸ジャイロセンサ56は、ヨー方向(Z軸回りの回転方向)の角速度を検出する。
【0070】
なお、本実施形態では、3軸回りの角速度を検出するために、2軸ジャイロセンサ55と1軸ジャイロセンサ56とを用いる構成としたが、他の実施形態においては、3軸回りの角速度を検出することができればよく、用いるジャイロセンサの数および組み合わせはどのようなものであってもよい。
【0071】
また、本実施形態では、後述する姿勢算出処理における計算を容易にする目的で、各ジャイロセンサ55および56が角速度を検出する3つの軸は、加速度センサ37が加速度を検出する3つの軸(XYZ軸)と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ56および57が角速度を検出する3つの軸と、加速度センサ37が加速度を検出する3つの軸とは一致しなくてもよい。
【0072】
各ジャイロセンサ56および57で検出された角速度を示すデータは、マイコン54に出力される。したがって、マイコン54には、XYZ軸の3軸回りの角度速度を示すデータが入力されることになる。マイコン54は、上記3軸回りの角速度を示すデータを角速度データとしてプラグ53を介してコントローラ5へ送信する。なお、マイコン54からコントローラ5への送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
【0073】
コントローラ5の説明に戻り、操作部32、撮像情報演算部35、および加速度センサ37からマイコン42へ出力されたデータ、ならびに、ジャイロセンサユニット7からマイコン42へ送信されてきたデータは、一時的にメモリ43に格納される。これらのデータは、上記操作データとしてゲーム装置3へ送信される。すなわち、マイコン42は、ゲーム装置3の無線コントローラモジュール19への送信タイミングが到来すると、メモリ43に格納されている操作データを無線モジュール44へ出力する。無線モジュール44は、例えばBluetooth(ブルートゥース)(登録商標)の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ45から放射する。つまり、操作データは、無線モジュール44で微弱電波信号に変調されてコントローラ5から送信される。微弱電波信号はゲーム装置3側の無線コントローラモジュール19で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置3は操作データを取得することができる。そして、ゲーム装置3のCPU10は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。なお、通信部36から無線コントローラモジュール19への無線送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。コントローラ5の通信部36は、例えば1/200秒に1回の割合で各操作データをゲーム装置3の無線コントローラモジュール19へ出力する。
【0074】
上記コントローラ5を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ5を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ5によれば、プレイヤは、コントローラ5によって画面上の任意の位置を指示する操作、および、コントローラ5自体を動かす操作を行うこともできる。
【0075】
[姿勢算出処理の概要]
次に、図8〜図12を参照して、ゲーム装置3において実行される、入力装置8の姿勢を算出する姿勢算出処理の概要を説明する。本実施形態では、ゲーム装置3は、ジャイロセンサ55および56と、加速度センサ37と、撮像手段(撮像素子40)とを備えた入力装置8からデータ(操作データ)を取得し、入力装置8の姿勢を算出する。なお、本実施形態では、入力装置8は、加速度センサ37と撮像素子40とを両方備える構成とするが、他の実施形態においては、加速度センサ37と撮像素子40とのいずれか一方のみを備える構成であってもよい。
【0076】
ゲーム装置3は、(1)姿勢算出手段と、(2)第1補正手段と、(3)第2補正手段とを備えている。本実施形態においては、これら各手段は、ゲーム装置3のコンピュータ(CPU10)によって実行されるゲームプログラム(姿勢算出プログラム)が、当該コンピュータを当該各手段として機能させることによって実現される。なお、他の実施形態においては、上記各手段の一部または全部は、ゲーム装置3が備える専用回路として実現されてもよい。
【0077】
(1)姿勢算出手段
姿勢算出手段は、ジャイロセンサ55および56が検出する角速度に基づいて入力装置8の姿勢を算出する(後述するステップS4)。角速度から姿勢を算出する方法はどのような方法であってもよいが、例えば、初期姿勢に(単位時間あたりの)角速度を逐次加算する方法がある。すなわち、ジャイロセンサ55および56から逐次出力される角速度を積分し、初期状態からの姿勢の変化量を積分結果から算出することによって、現在の姿勢を算出することができる。なお、以下では、姿勢算出手段によって角速度から算出される入力装置8の姿勢を「第1の姿勢」と呼ぶ。ただし、第1の姿勢に補正が加えられた後の姿勢も第1の姿勢と呼ぶ。
【0078】
ここで、ジャイロセンサ55および56が検出する角速度を用いて算出される上記第1の姿勢には、ジャイロセンサ55および56の誤検知が原因で、入力装置8の実際の姿勢との間に誤差が生じることがある。そこで、本実施形態では、ゲーム装置3は、加速度センサ37によって検出される加速度を用いて上記第1の姿勢を補正する。また、撮像素子40によって撮像される画像(撮像画像)を用いて上記第1の姿勢を補正する。
【0079】
(2)第1補正手段
第1補正手段は、加速度センサ37が検出する加速度データに基づいて上記第1の姿勢を補正する(後述するステップS5)。本実施形態では、第1補正手段は、上記第1の姿勢を第2の姿勢へと近づける補正を行う。ここで、第2の姿勢とは、加速度データから決まる姿勢、具体的には、加速度データが示す加速度の向きが鉛直下向きであると想定する場合における入力装置8の姿勢を指す。すなわち、加速度データが示す加速度が重力加速度であると仮定して算出された姿勢である。以下、図8〜図10を参照して、第1補正手段による補正処理(第1補正処理)を説明する。なお、本実施形態では、第1補正手段の具体的な方法として第1および第2の処理例を記載するが、図8〜図10では第1の処理例について説明する。
【0080】
図8は、第2の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図8〜図10では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図8(a)に示すベクトルGは、入力装置8が存在する空間の所定位置を基準とした空間座標系に定義された鉛直下方向、すなわち重力方向を示す。また、図8(a)に示すベクトルv1は、コントローラ5が第1の姿勢であるときの、入力装置8の下向きのベクトル(すなわち図3−図5に示されるY軸負方向)の空間座標系での向きを示したものである。なお、入力装置8の姿勢が基本状態にあるときには、姿勢を示すベクトルはベクトルGと一致することになる。したがって、ベクトルv1は、空間座標系における第1の姿勢に対応する。上記第1の姿勢は、ベクトルGに対してベクトルv1がなす回転としても表すことができ、2次元の図8においては角度θ1として示している。第1の姿勢は角速度によって算出されるので、ベクトルv1は、前回の姿勢に角速度を加えて回転させることによって算出されるものである。第2の姿勢は加速度データに基づいて算出される。図8(a)に示すベクトルv2は、加速度データが示す加速度の向き(ビュー座標系における加速度の向き)を示している。ただし、加速度データは入力装置8に加えられる加速度であって、取得できるのは入力装置8を基準とした座標系におけるベクトルである。図8(b)に、加速度センサの軸と加速度ベクトルとの関係を示す。図8(b)のように、加速度センサから取得される加速度ベクトルv0と、センサのY軸負方向とのなす角度がθ2であるとき、図8(a)の空間座標系においては、ベクトルv1に回転θ2を加えたベクトルv2が空間座標系における加速度ベクトルとなる。そして、第2の姿勢は、上述したように「加速度データが示す加速度の向きが鉛直下向きとみなした場合における入力装置8の姿勢」であるので、ベクトルv2からベクトルv1へ向いた角度θ2の回転が第2の姿勢となる。第2の姿勢を、ベクトルv1のように空間座標系における入力装置8の下向きのベクトルで表すと、ベクトルGをθ2だけ回転させたベクトルv2’として示すことができる。また、3次元の姿勢の場合には、3次元の回転行列等で表現することもできる。なお、角速度から第1の姿勢が正しく算出され、かつ、加速度データが重力方向を正確に示している場合には、加速度の向きを示すベクトルv2の方向は空間座標系の鉛直下方向、つまり重力方向と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合や、加速度データが正確な重力方向を示していない場合には、図8(a)のように、加速度の向きを示すベクトルv2と重力方向のベクトルGとが異なる。そして、例えば静止状態等のように、加速度データにより示される方向が重力方向と一致すると想定される状況においては、ベクトルv1よりもベクトルv2の方が入力装置8の姿勢に対応するデータとして正確なものと考えられる。また、入力装置が静止していない場合であっても、ある程度の期間内における平均的な姿勢の精度を考慮すると、加速度ベクトルは平均的には重力方向に近いものとなるので、時間とともに誤差の蓄積する角速度から算出される姿勢よりも信頼できるものと考えられる。一方で、前回の算出タイミングで正しい姿勢が算出されている状態であった場合には、次の算出タイミングにおける姿勢の算出には、加速度よりも角速度を用いた方が正確な姿勢が算出されると考えられる。すなわち、角速度による姿勢算出は、タイミングごとの誤差は加速度による算出よりも小さいが、時間と共に誤差が増大する一方、加速度による姿勢算出は、タイミングごとの誤差は場合よっては大きい可能性もあるが、タイミングごとに算出可能であるので誤差が蓄積しないという特徴を持つ。したがって、第1補正手段では、第1の姿勢と第2の姿勢の両方を考慮した補正を行う。
【0081】
第1補正手段による補正は、上記第1の姿勢を第2の姿勢へと近づける補正である。つまり、第1補正手段は、上記角度θ1を上記角度θ2に近づける補正を行う。これは、ベクトルv1をベクトルv2’に近づける補正と表現してもよい。ただし、演算の過程上は、ベクトルv2がわかっていれば、ベクトルv2’自体は算出されなくとも補正は可能である。本実施形態では、上記補正は、補正量を示すベクトルv3を用いて行われる。図9は、補正量を示すベクトルv3を示す図である。図9に示すベクトルv3は、第1の姿勢を補正する補正量を示すベクトルである。具体的には、ベクトルv2に対してベクトルv3がなす角度Δθが、補正量となる。詳細は後述するが、ベクトルv3は、ベクトルGとベクトルv2との間に設定される(図9参照)。ベクトルv1をΔθだけ回転させることで、ベクトルv1が上述のベクトルv2’に近づくことになる。
【0082】
第1補正処理は、第1の姿勢(ベクトルv1)を上記補正量だけ回転させることによって行われる。図10は、第1補正処理による補正後の第1の姿勢を示すベクトルを示す図である。図10に示すように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を角度Δθだけ回転させることによって得られる。これによって、補正後の第1の姿勢を表す角度θ1’は、角度θ1と角度θ2との間となっており、上記角度θ1を上記角度θ2に近づける補正が行われたことがわかる。
【0083】
なお、上記第1の方法においては、第1補正手段は、第1の姿勢を第2の姿勢へと近づける補正を行い、補正後の第1の姿勢を第2の姿勢と一致させていない。これは、加速度データが誤検出や激しい操作等の原因で急激に変化する場合であっても補正後の第1の姿勢が急激に変化しないようにするためである。ただし、第1補正手段は、補正後の第1の姿勢を第2の姿勢と一致させるように補正を行ってもよい(後述する第2の方法)。また、詳細は後述するが、第1の方法においては、第1補正手段が第1の姿勢を第2の姿勢へと近づける割合は、加速度データにより示される加速度の大きさ(より具体的には、当該大きさと重力加速度の大きさとの差分)に応じて変化するように決められる。ただし、他の実施形態においては、上記割合を予め定められた固定値としてもよい。
【0084】
(3)第2補正手段
第2補正手段は、撮像手段が撮像する所定の撮像対象の画像に基づいて第1の姿勢を補正する(後述するステップS6)。ここで、本実施形態においては、所定の撮像対象とは上記マーカ部6(の赤外LED)である。本実施形態では、第2補正手段は、上記第1の姿勢を第3の姿勢へと近づける補正を行う。第3の姿勢は、上記撮像対象の画像から算出される姿勢であり、具体的には、当該画像内での撮像対象の向きおよび/または位置から算出される入力装置8の姿勢である。以下、図11および図12を参照して、第2補正手段による補正処理(第2補正処理)を説明する。
【0085】
図11は、第3の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図11および図12では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図11に示すベクトルv1は、空間座標系における第1の姿勢を示す。図11に示すベクトルv4は、空間座標系における第3の姿勢を示す。マーカ部6の位置や姿勢は予め定められているので、画像内での当該マーカの姿勢や位置によって、相対的に入力装置8の姿勢を算出することができる。第3の姿勢が正しい姿勢を表していることを前提とすれば、角速度から第1の姿勢が正しく算出されている場合には、第1の姿勢を示すベクトルv1は、第3の姿勢を示すベクトルv4と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合には、図11のように、第1の姿勢を示すベクトルv1と第3の姿勢を示すベクトルv4とが異なる。
【0086】
第2補正処理は、第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって行われる。図12は、第2補正処理による補正後の第1の姿勢を示す図である。図12に示されるように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって得られる。
【0087】
ここで、入力装置8の姿勢や位置によっては撮像手段がマーカ部6を撮像することができない場合があり、この場合、第2補正手段は第2補正処理を行うことができない。したがって、仮に、第2補正手段が補正後の第1の姿勢を第3の姿勢と一致させるように補正を行うとすれば、第2補正処理を行うことができない状態から第2補正処理を行うことができる状態へと移行した際に、第1の姿勢が急激に変化してしまうおそれがある。このように第1の姿勢がプレイヤの意図に沿わずに急激に変化してしまうと、(たとえ補正後の姿勢が正確なものであったとしても)プレイヤは操作に違和感を感じてしまう。このような急激な変化を防止するために、本実施形態では、第1の姿勢を第3の姿勢に所定の割合で近づけるように補正を行っている。これによって、第1の姿勢が急激に変化することを防止することができるので、プレイヤが操作に違和感を感じることを防止することができる。ただし、撮像手段が常にマーカ部6を撮像することが可能な姿勢で入力装置8が使用されることが想定できる場合等、他の実施形態においては、第2補正手段は、補正後の第1の姿勢を第3の姿勢と一致させるように補正を行ってもよい。
【0088】
なお、本実施形態では、ゲーム装置3は、第1補正処理と第2補正処理との両方を実行するが、他の実施形態においては、第1補正処理と第2補正処理とのいずれか一方のみを実行するようにしてもよい。また、本実施形態においては、ゲーム装置3は、第1補正処理を先に行い、第2補正処理を後に行うこととするが、第1補正処理と第2補正処理とのいずれを先に行うようにしてもよい。
【0089】
以上のように、本実施形態によれば、ジャイロセンサ55および56によって検知された角速度から算出される入力装置8の姿勢を、加速度センサ37によって検知された加速度を用いて補正し、また、撮像手段による撮像画像を用いて補正する。これによって、ジャイロセンサから算出される姿勢の誤差を減少することができ、入力装置8の姿勢をより正確に算出することができる。
【0090】
なお、加速度センサ37の検出結果からは、重力方向を軸とした回転(ヨー方向の回転)を検知することはできないので、第1補正手段による補正は、ヨー方向に関しては行うことができない。しかし、加速度センサ37の検出結果を用いた補正は、入力装置8の姿勢がどのような姿勢であっても(常に加速度を検出することができるので)可能であるという特長を有する。一方、入力装置8の撮像方向にマーカ部6がなければマーカ座標が検出されないので、第2補正手段による補正は、入力装置8の姿勢によっては行うことができない。しかし、撮像画像を用いた補正は、姿勢(特にロール方向の姿勢)を正確に算出することができるという特長を有する。本実施形態においては、このように特長の異なる2種類の補正を行うことによって、入力装置8の姿勢をより正確に算出することができる。
【0091】
[ゲーム装置3における処理の詳細]
次に、ゲーム装置3において実行される処理の詳細について説明する。まず、ゲーム装置3における処理において用いられる主なデータについて図13を用いて説明する。図13は、ゲーム装置3のメインメモリ(外部メインメモリ12または内部メインメモリ11e)に記憶される主なデータを示す図である。図13に示すように、ゲーム装置3のメインメモリには、ゲームプログラム60、操作データ62、およびゲーム処理用データ67が記憶される。なお、メインメモリには、図13に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
【0092】
ゲームプログラム60は、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部または全部が読み込まれてメインメモリに記憶される。ゲームプログラム60には、姿勢算出プログラム61が含まれる。姿勢算出プログラム61は、入力装置8の姿勢を算出するための姿勢算出処理を実行するためのプログラムである。
【0093】
操作データ62は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、メインメモリに記憶される操作データ62はこの割合で更新される。本実施形態においては、メインメモリには、最新の(最後に取得された)操作データのみが記憶されればよい。
【0094】
操作データ62には、角速度データ63、加速度データ64、マーカ座標データ65、および操作ボタンデータ66が含まれる。角速度データ63は、ジャイロセンサユニット7のジャイロセンサ55および56によって検出された角速度を示すデータである。ここでは、角速度データ63は、図3に示すXYZの3軸回りのそれぞれの角速度を示す。また、加速度データ64は、加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータである。ここでは、加速度データ64は、図3に示すXYZの3軸の方向に関する加速度を各成分とする3次元の加速度ベクトルVa1を示す。また、本実施形態においては、コントローラ5が静止している状態で加速度センサ37が検出する加速度ベクトルVa1の大きさを“1”とする。つまり、加速度センサ37によって検出される重力加速度の大きさは“1”である。
【0095】
マーカ座標データ65は、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系(図23に示すx’y’座標系)で表現される。なお、撮像素子40によって2つのマーカ6Rおよび6Lが撮像される場合には、2つのマーカ座標が算出される。一方、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lのいずれか一方が位置しない場合には、撮像素子40によって1つのマーカのみが撮像され、1つのマーカ座標のみが算出される。また、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lの両方が位置しない場合には、撮像素子40によってマーカが撮像されず、マーカ座標は算出されない。したがって、マーカ座標データ65は、2つのマーカ座標を示す場合もあるし、1つのマーカ座標を示す場合もあるし、マーカ座標がないことを示す場合もある。
【0096】
操作ボタンデータ66は、各操作ボタン32a〜32iに対する入力状態を示すデータである。
【0097】
ゲーム処理用データ67は、後述するゲーム処理(図14)において用いられるデータである。ゲーム処理用データ67は、第1姿勢データ68、加速度大きさデータ69、補正度データ70、補正量ベクトルデータ71、補正行列データ72、ロール姿勢成分データ73、ヨー姿勢成分データ74、ピッチ姿勢成分データ75、および第3姿勢データ76を含む。なお、図13に示すデータの他、ゲーム処理用データ67は、ゲーム処理において用いられる各種データ(ゲームパラメータを示すデータ等)を含む。
【0098】
第1姿勢データ68は、角速度データ63を用いて算出される上記第1の姿勢を示すデータである。本実施形態では、第1の姿勢は、以下の式(1)に示す3×3の行列M1で表現される。
【数1】
上記行列M1は、所定の基準姿勢から現在の入力装置8の姿勢への回転を表す回転行列である。以下では、第1の姿勢を示す行列M1を、「第1姿勢行列M1」と呼ぶ。なお、第1姿勢行列M1により表される第1の姿勢は、入力装置8が存在する空間の所定位置を基準としたxyz座標系(上記空間座標系)における姿勢である。ここでは、xyz座標系は、入力装置8がマーカ部6の正面に位置することを前提とし、入力装置8の位置からマーカ部6を向く方向をz軸正方向とし、鉛直上向き(重力方向の逆方向)をy軸正方向とし、入力装置8の位置からマーカ部6を向いた場合の左方向をx軸正方向とした座標系であるとする。ここでは、上記所定の基準姿勢は、マーカ部6の正面に位置する入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢(すなわち、入力装置8を基準としたX軸、Y軸、Z軸が、それぞれx軸、y軸、z軸の向きと一致する姿勢)であるとする。なお、本実施形態では、行列を用いて第1の姿勢を表現することとしたが、他の実施形態においては、第1の姿勢は、3次のベクトルまたは3つの角度によって表現されてもよい。
【0099】
加速度大きさデータ69は、加速度データ64により示される加速度ベクトルVa1の大きさ(長さ)Lを示すデータである。
【0100】
補正度データ70は、第2の姿勢を用いて第1の姿勢を補正する度合(補正度A)を示すデータである。補正度Aは、0≦A≦C1(C1は、0<C1≦1の所定の定数)の範囲を取り得る値である。詳細は後述するが、補正後の第1の姿勢は、補正度Aの値が大きいほど第2の姿勢に近くなる。
【0101】
補正量ベクトルデータ71は、第1の姿勢を補正する補正量を示すベクトル(図9に示すベクトルv3。以下、補正量ベクトルと呼ぶ。)を示すデータである。補正量ベクトルVgは、上記加速度ベクトルVa1を上記xyz座標系で表したベクトルVa2と、上記補正度Aとに基づいて算出される。
【0102】
補正行列データ72は、第1の姿勢を補正するために用いる回転行列(補正行列と呼ぶ)Maを示すデータである。つまり、第1補正処理においては、第1の姿勢を表す第1姿勢行列M1に補正行列Maを掛けることで第1の姿勢が補正される。補正行列Maは、上記ベクトルVa2と上記補正量ベクトルVgとに基づいて算出される。
【0103】
ロール姿勢成分データ73は、上記撮像対象の画像から算出される第3の姿勢に含まれる姿勢成分のうち、ロール方向に関する姿勢成分(ロール姿勢成分)M3rを示すデータである。また、ヨー姿勢成分データ74は、上記第3の姿勢に含まれる姿勢成分のうち、ヨー方向に関する姿勢成分(ヨー姿勢成分)M3yを示すデータであり、ピッチ姿勢成分データ75は、上記第3の姿勢に含まれる姿勢成分のうち、ピッチ方向に関する姿勢成分(ピッチ姿勢成分)M3pを示すデータである。なお、ここで言うロール方向、ヨー方向、およびピッチ方向とは、入力装置8の撮像方向(Z軸正方向)を基準とした場合の回転方向である。本実施形態においては、各姿勢成分M3r、M3y、およびM3pは、第1の姿勢と同様、3×3の行列で表現される。
【0104】
第3姿勢データ76は、上記撮像対象の画像から算出される第3の姿勢を示すデータである。本実施形態では、第3の姿勢は、第1の姿勢と同様、3×3の行列M3で表現される。以下では、第3の姿勢を示す行列M3を「第3姿勢行列M3」と呼ぶ。本実施形態では、入力装置8から操作データとしてマーカ座標データが送信されてくるので、第3姿勢行列M3は、マーカ座標データ65に基づいて算出される。具体的には、第3姿勢行列M3は、上記各姿勢成分M3r、M3y、およびM3pを合成することによって得られる。
【0105】
次に、ゲーム装置3において行われる処理の詳細を、図14〜図23を用いて説明する。図14は、ゲーム装置3において実行される処理の流れを示すメインフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリに読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。図14に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
【0106】
まず、ステップS1において、CPU10は、ゲームに関する初期化処理を実行する。この初期化処理においては、ゲーム処理に用いられる各種パラメータの値が初期化されたり、仮想のゲーム空間が構築されたり、プレイヤオブジェクトや他のオブジェクトがゲーム空間の初期位置に配置されたりする。以上のステップS1の次にステップS2の処理が実行される。
【0107】
ステップS2において、CPU10は、初期姿勢設定処理が実行される。具体的には、プレイヤが所定の操作(例えば、Aボタン32dを押下する操作)を行ったことに応じて、入力装置8の第1の姿勢の初期姿勢として所定の値が設定される。ここでは、基準となる姿勢は、Z軸が鉛直方向と平行となり、かつ、入力装置8の撮像方向がマーカ部6の中央(マーカ6Rおよび6Lの中央)を向く姿勢としているので、プレイヤは、初期姿勢が上記基準となる姿勢となるように入力装置8を把持した状態で、上記所定の操作を行うことが望ましいが、入力装置が静止状態に近く、かつマーカ部を撮像可能であれば、初期姿勢を算出することが可能である。CPU10は、所定の操作が行われると、上記初期姿勢を表す行列を示すデータを第1姿勢データとしてメインメモリに記憶する。以上のステップS2の後、ステップS3〜S8の処理ループが、ゲームが実行される間繰り返し実行される。なお、1回の当該処理ループは、1フレーム時間(例えば1/60秒)に1回の割合で実行される。
【0108】
なお、本実施形態では、初期姿勢設定処理(ステップS2)は、ゲーム開始前(ステップS3〜S8の処理ループが実行される前)に1回実行されるのみであるとしたが、他の実施形態においては、ゲーム中における任意のタイミングで初期姿勢設定処理が実行されるようにしてもよい。すなわち、CPU10は、ゲーム中においてプレイヤが上記所定の操作を行ったことに応じて初期姿勢設定処理を実行するようにしてもよい。
【0109】
ステップS3において、CPU10は操作データを取得する。すなわち、コントローラ5から送信されてくる操作データが無線コントローラモジュール19を介して受信される。そして、受信された操作データに含まれる角速度データ、加速度データ、マーカ座標データ、操作ボタンデータがそれぞれメインメモリに記憶される。ステップS3の次にステップS4の処理が実行される。
【0110】
ステップS4において、CPU10は、メインメモリに記憶されている角速度データ63に基づいて第1の姿勢を算出する。入力装置8の姿勢を角速度から算出する方法はどのような方法であってもよいが、本実施形態においては、第1の姿勢は、前回の第1の姿勢(前回の処理ループにおいて算出された第1の姿勢)と、今回の角速度(今回の処理ループにおいて取得された角速度)とを用いて算出される。具体的には、CPU10は、前回の第1の姿勢を今回の角速度で単位時間分回転させた姿勢を、第1の姿勢とする。なお、前回の第1の姿勢は、メインメモリに記憶されている第1姿勢データ68により示され、今回の角速度は、メインメモリに記憶されている角速度データ63により示されている。ステップS4で算出された姿勢(3×3の行列)を示すデータが、第1姿勢データ68としてメインメモリに新たに記憶される。上記ステップS4の次にステップS5の処理が実行される。
【0111】
ステップS5において、CPU10は前述した第1補正処理を実行する。第1補正処理は、加速度データを用いて第1の姿勢を補正する処理である。以下、図15を参照して、第1補正処理における第1の処理例を説明し、図16〜図21を参照して、第1補正処理における第2の処理例を説明する。
【0112】
図15は、図14に示す第1補正処理(ステップS5)の第1の処理例の流れを示すフローチャートである。第1補正処理においては、まずステップS11において、CPU10は、加速度センサ37によって検出された加速度の大きさLを算出する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1について大きさLを算出する。算出された大きさLを示すデータは加速度大きさデータ69としてメインメモリに記憶される。ステップS11の次にステップS12の処理が実行される。
【0113】
ステップS12において、CPU10は、加速度センサ37によって検出された加速度の大きさが0であるか否かを判定する。すなわち、メインメモリに記憶されている加速度大きさデータ69を読み出し、当該加速度大きさデータ69により示される大きさLが0であるか否かを判定する。ステップS12の判定結果が否定である場合、ステップS13の処理が実行される。一方、ステップS12の判定結果が肯定である場合、以降のステップS13〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。このように、本実施形態においては、加速度センサ37によって検出された加速度の大きさが0である場合には、当該加速度を用いた補正が行われない。これは、加速度の大きさが0である場合には加速度センサ37の検出結果から重力方向を算出できないということ、および、加速度ベクトルの大きさが0であれば以降のステップS13〜S21の処理が困難であることが理由である。
【0114】
ステップS13において、CPU10は、加速度センサ37によって検出された加速度ベクトルVa1を正規化する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1を、大きさが1となるように補正する。CPU10は、正規化された加速度ベクトルVa1を示すデータをメインメモリに記憶しておく。ステップS13の次にステップS14の処理が実行される。
【0115】
ステップS14において、CPU10は、第1補正処理において第1の姿勢を補正する度合を示す上記補正度Aを算出する。補正度Aは、正規化される前の加速度ベクトルVa1の大きさLに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている加速度大きさデータ69を読み出す。そして、当該加速度大きさデータ69により示される大きさLを用いて、次の式(2)に従って補正度Aを算出する。
A=|L−1| …(2)
上式(2)で算出された補正度Aを示すデータは、補正度データ70としてメインメモリに記憶される。なお、上式(2)で算出された補正度Aは、最終的な値ではない演算中の値であって、以降のステップS16で値が変換されることによって、最終的な補正度Aの値が得られる。ステップS14の次にステップS15の処理が実行される。
【0116】
ステップS15において、CPU10は、ステップS14で算出された補正度Aが所定値Rよりも小さいか否かを判定する。所定値Rは、予め定められており、例えば0.4に設定される。ここで、上述したように、本実施形態においては、加速度センサ37によって検出される重力加速度の大きさは“1”であり、また、補正度Aは加速度ベクトルVa1の大きさLと“1”との差の絶対値である(上式(2))。したがって、補正度Aが所定値R以上である場合とは、加速度ベクトルVa1の大きさLが重力加速度の大きさから所定値R以上離れている場合である。ステップS15の判定結果が肯定である場合、ステップS16の処理が実行される。一方、ステップS15の判定結果が否定である場合、以降のステップS16〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。
【0117】
上記のように、本実施形態では、加速度センサ37によって検出される加速度の大きさLと重力加速度の大きさ(=1)との差が所定の基準(所定値R)よりも小さい場合にのみ補正が行われ、当該大きさLと重力加速度の大きさとの差が所定の基準以上である場合には補正が行われない。ここで、入力装置8が動かされている状態では、重力加速度以外に、入力装置8が動かされることによって生じる慣性による加速度が加速度センサ37によって検出されるので、検出される加速度ベクトルVa1の大きさLが“1”とは異なる値となり、入力装置8が激しく動かされている場合には、大きさLが“1”から大きく離れた値となる。したがって、上記大きさLと重力加速度の大きさとの差が所定の基準以上である場合とは、入力装置8が激しく動かされている場合であると推測される。一方、入力装置8が激しく動かされている場合には、加速度センサ37によって検出される加速度ベクトルVa1に重力加速度以外の成分(上記慣性による加速度の成分)が多く含まれているため、加速度ベクトルVa1の値は、重力方向を示す値としては信頼できないものと推測される。したがって、上記ステップS15の判定処理は、入力装置8が激しく動かされているか否か、換言すれば、加速度ベクトルVa1の値が重力方向を示す値としては信頼できるものであるか否かを判定する処理である。本実施形態においては、上記ステップS15の判定処理によって、加速度ベクトルVa1の値が重力方向を示す値としては信頼できない場合には補正を行わず、加速度ベクトルVa1の値が重力方向を示す値としては信頼できる場合にのみ補正を行うようにしている。これによって、重力方向を示す値としては信頼できない加速度ベクトルVa1を用いて第1の姿勢に対する補正が行われた結果、第1の姿勢が正しく補正されなくなることを防止することができる。
【0118】
ステップS16において、CPU10は、補正度Aの値を変換する。本実施形態では、補正度Aを、検出された加速度ベクトルVa1の大きさLが重力加速度の大きさに近いほど1に近くなるように、補正度Aを変換する。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを、以下の式(3)〜(5)に従って変換する。
A2=1−(A1/R) …(3)
A3=A2×A2 …(4)
A4=A3×C1 …(5)
上式(3)〜(5)において、変数A1は変換前の補正度(メインメモリに現在記憶されている補正度データ70により示される値)であり、変数A4がステップS16において最終的に変換される補正度である。上式(3)は、変換前の補正度A1の大きさが重力加速度の大きさ(=1)に近いほど1に近くなるように変換後の補正度A2を得るための式である。上式(4)は、変換前の補正度A2が1に近いほど大きい重みが付されるように変換後の補正度A3を得るための式である。上式(5)は、補正量の大きさを調整するための式である。すなわち、定数C1は、定数C1の値が大きいほど補正量は大きくなる。定数C1は、予め定められ、0<C1≦1の範囲(例えば0.03)で設定される。以上の式(3)〜(5)による変換によって得られた補正度A4を示すデータが、新たな補正度データ70としてメインメモリに記憶される。上記ステップS16の次にステップS17の処理が実行される。
【0119】
なお、本実施形態においては、上式(3)〜(5)による変換を行ったが、他の実施形態においては、上式(3)〜(5)のうち一部または全部の変換を省略してもよい。ただし、上式(3)の変換を省略する場合には、後述するステップS18で用いる式(7)において、加速度ベクトルVa2と重力方向ベクトル(0,−1,0)とを入れ替える必要がある。
【0120】
ステップS17において、CPU10は、XYZ座標系で表現される加速度ベクトルVa1をxyz座標系の値Va2へと変換する。xyz座標系における加速度ベクトルVa2は、正規化された加速度ベクトルVa1を、前回のフレームにおいて得られた第1の姿勢を表す第1姿勢行列M1を用いて変換することによって算出される。すなわち、CPU10は、ステップS13においてメインメモリに記憶された(正規化された)加速度ベクトルVa1のデータと、第1姿勢データ68とを読み出す。そして、当該加速度ベクトルVa1と当該第1姿勢データ68により示される第1姿勢行列M1とを用いて、xyz座標系における加速度ベクトルVa2を算出する。より具体的には、正規化された加速度ベクトルVa1=(nx,ny,nz)とし、第1姿勢行列M1の各要素を上式(1)に示す変数とし、xyz座標系で表現される加速度ベクトルVa2=(vx,vy,vz)とすると、加速度ベクトルVa2は次の式(6)に従って算出される。
vx=Xx×nx+Yx×ny+Zx×nz
vy=Xy×nx+Yy×ny+Zy×nz
vz=Xz×nx+Yz×ny+Zz×nz …(6)
上式(6)に示されるように、加速度ベクトルVa2は、回転行列である第1姿勢行列M1によって加速度ベクトルVa1を回転させることによって得ることができる。ステップS17において算出された加速度ベクトルVa2はメインメモリに記憶される。上記ステップS17の次にステップS18の処理が実行される。
【0121】
ステップS18において、CPU10は、xyz座標系で表現される加速度ベクトルVa2と補正度Aとを用いて補正量ベクトルVgを算出する。補正量ベクトルVgは、上記ステップS16による変換後の補正度と、xyz座標系の鉛直下方向(重力方向)を示すベクトル(0,−1,0)とを用いて算出される。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを用いて、以下の式(7)に従って補正量ベクトルVg=(gx,gy,gz)を算出する。
gx=(0−vx)×A+vx
gy=(−1−vy)×A+vy
gz=(0−vz)×A+vz …(7)
上式(7)に示されるように、補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトル(0,−1,0)の終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルである。したがって、補正量ベクトルVgは、補正度Aの値が大きいほど、重力方向ベクトルに近づくこととなる。CPU10は、上式(7)によって算出された補正量ベクトルVgを示すデータを、補正量ベクトルデータ71としてメインメモリに記憶する。上記ステップS18の次にステップS19の処理が実行される。
【0122】
ステップS19において、CPU10は、上記ステップS18で算出された補正量ベクトルVgを正規化する。すなわち、メインメモリに記憶されている補正量ベクトルデータ71を読み出し、当該補正量ベクトルデータ71により示されるベクトルを正規化する。そして、正規化されたベクトルを示すデータを新たな補正量ベクトルデータ71としてメインメモリに記憶する。なお、上記ステップS19で算出された補正量ベクトルVgが、図9に示すベクトルv3に相当する。上記ステップS19の次にステップS20の処理が実行される。
【0123】
ステップS20において、CPU10は、第1の姿勢を補正するための補正行列Maを算出する。補正行列Maは、xyz座標系で表現される加速度ベクトルVa2と、ステップS19において正規化された補正量ベクトルVgとに基づいて算出される。具体的には、CPU10は、ステップS17でメインメモリに記憶された加速度ベクトルVa2と、補正量ベクトルデータ71を読み出す。そして、上記加速度ベクトルVa2を補正量ベクトルVgと一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとする。つまり、補正行列Maは、図9に示す角度Δθの回転を行う回転行列である。ステップS20で算出された補正行列Maを示すデータは、補正行列データ72としてメインメモリに記憶される。上記ステップS20の次にステップS21の処理が実行される。
【0124】
ステップS21において、CPU10は、第1の姿勢を示す第1姿勢行列M1を補正行列Maで補正する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および補正行列データ72を読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該補正行列データ72により示される補正行列Maによって変換する(第1姿勢行列M1と補正行列Maとの積を算出する)。変換後の第1姿勢行列M1が、補正された第1の姿勢を示すこととなる。つまり、ステップS21の処理は、図10に示すベクトルv1を角度Δθだけ回転させる処理に相当する。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS21の後、CPU10は第1補正処理を終了する。
【0125】
以上のように、第1補正処理においては、加速度センサ37によって検出された加速度ベクトルと、重力方向ベクトル(図8に示すベクトルG)との間に補正量ベクトルVgを算出し(ステップS18およびS19)、この補正量ベクトルVgにより表される補正量(補正行列Ma。図9に示す角度Δθ)だけ第1の姿勢を補正した(ステップS21)。これによって、ジャイロセンサ55および56から算出される第1の姿勢(図8に示すベクトルv1または角度θ1)を、加速度センサ37によって決められる第2の姿勢(図8に示す角度θ2)に近づける補正を行うことができる。かかる補正を行うことにより、より正確な値となるように第1の姿勢を補正することができる。
【0126】
また、第1補正処理においては、加速度ベクトルVa1が信頼できる場合ほど(加速度ベクトルVa1の大きさLと重力加速度の大きさとの差が小さいほど)、補正度Aの値が大きくなり、その結果、第1の姿勢は第2の姿勢により近づくように補正される。つまり、加速度ベクトルVa1が信頼できる場合ほど、補正量が大きくなり、補正後の第1の姿勢に第2の姿勢が強く反映されることとなる。このように、本実施形態によれば、加速度センサベクトルVa1の信頼度に応じて第1補正処理における補正量が決まるので、補正量を当該信頼度に応じて適切に決定することができ、ひいては入力装置8の姿勢をより正確に算出することができる。
【0127】
なお、本実施形態においては、上記ステップS18で算出される補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトルの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルであって、補正度Aの値が大きいほど重力方向ベクトルに近づくベクトルであった。ここで、他の実施形態において、補正度Aの算出方法によっては、補正量ベクトルVgは、重力方向ベクトルの終点と加速度ベクトルVa2の終点とを(1−A):Aに内分する点を終点とするベクトルであって、補正度Aの値が小さいほど重力方向ベクトルに近づくベクトルとしてもよい。このとき、上記ステップS20においては、上記補正量ベクトルVgを重力方向と一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとすればよい。これによっても、本実施形態と同様に補正を行うことができる。
【0128】
次に、第1補正処理の第2の処理例について説明する。本実施形態においては、ゲーム装置3は、第1補正処理として上記第1の処理例を採用してもよいし、下記の第2の処理例を採用してもよい。
【0129】
上述のように、本実施形態では、加速度ベクトルの向きが鉛直下向きとなる場合における入力装置8の姿勢を第2の姿勢とし、第1の姿勢を第2の姿勢へと近づける補正を行っている(図8〜図10、図15)。つまり、第1の姿勢を第2の姿勢へと近づける(または一致させる)ために、加速度ベクトルと重力方向ベクトルとを近づける(一致させる)ように、第1の姿勢を回転させる補正を行っている。ここで、第1の姿勢を回転させる方法の一例として、図16および図17を参照して、加速度ベクトルを単純に回転させて重力方向ベクトルと一致させる方法、すなわち、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第1の姿勢を回転させる方法を考える。
【0130】
図16は、空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図である。図16においては、重力ベクトルG(=(0,−1,0))が重力方向(鉛直下方向)を表し、Z軸ベクトルM1Zは、入力装置8が第1の姿勢である場合における入力装置8のZ軸の向きを表し、加速度ベクトルVa(上記ベクトルVa2に相当)が入力装置8に加えられる加速度を表している。また、図17は、図16に示す状態から、加速度ベクトルVaを最短距離で回転させる方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させた状態を示す図である。図16に示す場合において、上記方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させると、図17に示すように、Z軸ベクトルM1Zが補正前後において大きく変化する。このように、加速度ベクトルを単純に重力方向ベクトルと一致させる方法では、入力装置8の姿勢を表す所定軸(図16ではZ軸)が、補正前後において大きく変化してしまうことがある。
【0131】
入力装置8の姿勢を表す所定軸が補正前後において大きく変化することは、例えば、仮想空間内におけるオブジェクトの姿勢を入力装置8の姿勢に応じて制御する場合に問題となる。一例として、仮想のゲーム空間内における剣オブジェクトの姿勢を入力装置8の姿勢に応じて変化させることによって、入力装置8を振る操作によって剣オブジェクトを振ることを可能とするゲーム処理を考える。このようなゲーム処理において、例えば剣オブジェクトの長手方向が入力装置8のZ軸方向に対応しているとすると、入力装置8のZ軸が補正によって大きく変化することによって、剣オブジェクトの長手方向の向きが大きく変化することになる。このように、オブジェクトの長手方向が大きく変化すると、(たとえ補正後の姿勢が正確なものであったとしても)プレイヤは操作に違和感を感じてしまう。したがって、入力装置8の姿勢を表す軸のうち、オブジェクトの長手方向に対応する軸については、補正による変化をできるだけ小さくすることが好ましい。また、オブジェクトの長手方向に対応する軸でなくても、他の軸よりもプレイヤが注意を向ける軸(例えば、他の軸よりもゲーム上重要な意味を持つ軸)については、補正による変化をできるだけ小さくすることが好ましい。
【0132】
そこで、本実施形態の第1補正処理の第2の処理例では、入力装置8の姿勢を表す所定軸に関して、補正前後における変化ができるだけ小さくなるように、上記第1の姿勢の補正を行う。以下、図18−図21を参照して、第1補正処理の第2の処理例について説明する。なお、以下では、補正前後における変化をできるだけ小さくする上記所定軸が入力装置8のZ軸である場合を例として説明を行う。
【0133】
図18は、図14に示す第1補正処理(ステップS5)の第2の処理例の流れを示すフローチャートである。第1補正処理の第2の処理例においては、まずステップS11において、CPU10は、加速度センサ37によって検出された加速度の大きさLを算出する。ステップS30において、CPU10は、加速度センサ37によって検出された加速度の大きさがLと重力加速度の大きさ(ここでは1とする)との差を算出し、その差の大きさが所定値Kより小さいか否かを判定する。すなわち、加速度の大きさが重力加速度の大きさから大きく外れている場合には、少なくとも入力装置8の姿勢(加速度から推測される姿勢)が安定しておらず、加速度方向を重力加速度とみなすことが妥当でないと考えられるので、加速度の大きさが重力加速度の大きさに近いときだけ補正の処理を行うようにする。ステップS30を行う理由は第1の処理例におけるステップS15と同様の理由である。ステップS30の判定結果が肯定である場合、ステップS31の処理が実行される。一方、ステップS30の判定結果が否定である場合、以降のステップS31〜S37の処理がスキップされて、CPU10は第1補正処理を終了する。
【0134】
ステップS31において、CPU10は、投影加速度ベクトルVapを算出する。図19は、投影加速度ベクトルおよび投影重力ベクトル(後述)を示す図である。図19に示すように、投影加速度ベクトルVapは、空間座標系(xyz座標系)において、入力装置8のZ軸(Z軸ベクトルM1Z)に垂直な平面XYに対して、加速度ベクトルVaを投影したベクトルである。
【0135】
上記投影加速度ベクトルVapは、第1姿勢行列M1と、加速度センサ37によって検出された加速度ベクトル(加速度データ64により示される加速度ベクトル)Va1とを用いて算出することができる。具体的には、ステップS31においてCPU10は、メインメモリに記憶されている加速度データ64および第1姿勢データ68を読み出す。そして、加速度データ64により示される加速度ベクトルVa1および第1姿勢データ68により示される第1姿勢行列M1を用いて、次の式(8)に従って投影加速度ベクトルVap=(Vax,Vay,Vaz)を算出する。すなわち、加速度ベクトルVa1=(VX,VY,VZ)とし、第1姿勢行列M1の各要素を上式(1)に示す変数とし、投影加速度ベクトルVap=(Vax,Vay,Vaz)とすると、投影加速度ベクトルVapは次の式(8)に従って算出される。
Vax=Xx・VX+Yx・VY
Vay=Xy・VX+Yy・VY
Vaz=Xz・VX+Yz・VY …(8)
上式(8)は、コントローラ座標系(XYZ座標系)で表現される加速度ベクトルVa1のXY成分を、xyz座標系に変換する(第1姿勢行列M1で回転させる)処理を意味している。投影加速度ベクトルVapは、xyz座標系で表現される、XY平面上のベクトルである。したがって、投影加速度ベクトルVapは、上式(8)のとおり、加速度ベクトルVa1をからZ成分を除いたベクトル(VX,VY,0)を、xyz座標系に変換することによって得ることができる。CPU10は、上式(8)によって算出された投影加速度ベクトルVapを正規化し、正規化された投影加速度ベクトルVapを示すデータ(投影加速度データ)はメインメモリに記憶される。上記ステップS31の次にステップS32の処理が実行される。
【0136】
ステップS32において、CPU10は、投影重力ベクトルGpを算出する。図19に示すように、投影重力ベクトルGpは、空間座標系(xyz座標系)において、入力装置8のZ軸(Z軸ベクトルM1Z)に垂直な平面XYに対して、重力ベクトルGを投影したベクトルである。
【0137】
上記投影重力ベクトルGpは、上記投影加速度ベクトルVapと同様の方法で算出することができる。すなわち、投影重力ベクトルGpは、第1姿勢行列M1と、重力ベクトルとを用いて算出することができる。ここで、空間座標系(xyz座標系)における重力ベクトルG=(0,−1,0)は、コントローラ座標系(XYZ座標系)では(−Xy,−Yy,−Zy)と表すことができる。以上より、ステップS31においてCPU10は、メインメモリに記憶されている第1姿勢データ68を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1と、XYZ座標系における重力ベクトルG=(−Xy,−Yy,−Zy)とを用いて、次の式(9)に従って投影重力ベクトルGp=(Gx,Gy,Gz)を算出する。
Gx=−Xx・Xy−Yx・Yy
Gy=−Xy・Xy−Yy・Yy
Gz=−Xz・Xy−Yz・Yy …(9)
上式(8)と同様の考え方により、投影重力ベクトルVpは、XYZ座標系における重力ベクトルGからZ成分を除いたベクトルを、xyz座標系に変換することによって得ることができる。したがって、上式(9)のように、XYZ座標系で表現される重力ベクトルGのXY成分を、第1姿勢行列M1で回転させることによって、投影重力ベクトルVpを得ることができる。CPU10は、上式(9)によって算出された投影重力ベクトルGpを正規化し、正規化された投影重力ベクトルGpを示すデータ(投影重力データ)はメインメモリに記憶される。上記ステップS32の次にステップS33の処理が実行される。
【0138】
ステップS33において、CPU10は、第1の姿勢に対して第1の変換を行うための第1変換行列mtx1を算出する。第1変換行列mtx1は、投影加速度ベクトルVapを投影重力ベクトルGpと一致させるように、Z軸回りの回転を行う回転行列である(図19に示す矢印参照)。具体的には、CPU10は、メインメモリに記憶されている上記投影加速度データおよび上記投影重力データを読み出す。そして、投影加速度ベクトルVapを投影重力ベクトルGpと一致するように回転させる回転行列を算出し、算出された回転行列を第1変換行列mtx1とする。ステップS33で算出された第1変換行列mtx1を示すデータ(第1変換行列データ)はメインメモリに記憶される。上記ステップS33の次にステップS34の処理が実行される。
【0139】
ステップS34において、CPU10は、第1の姿勢を示す第1姿勢行列M1を第1変換行列mtx1で変換する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および上記第1変換行列データを読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該第1変換行列データにより示される第1変換行列mtx1によって変換する(第1姿勢行列M1に対して右側から第1変換行列mtx1を掛ける)。これによって、第1の姿勢に対して第1の変換が行われたこととなる。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS34の次にステップS35の処理が実行される。
【0140】
上記ステップS34によって、第1の姿勢に対して第1変換行列によって変換が行われたこととなる。図20は、図19に示す状態から第1の変換を行った状態を示す図である。ここで、第1変換行列による第1の変換はZ軸回りの回転であるので、図20に示されるように、入力装置8のZ軸を表すZ軸ベクトルM1Zは第1の変換によっては向きが変わらない。ただし、図20には示していないが、入力装置8のX軸およびY軸は第1の変換によってZ軸回りに回転しており、第1の姿勢は変化している。
【0141】
ステップS35において、CPU10は、上記ステップS34によって変換された後の入力装置8の姿勢に対応する(入力装置8に加えられる)加速度を示すように、加速度ベクトルVaを修正する。修正後の加速度ベクトルVa’は、上記ステップS34によって変換された後の第1の姿勢(第1姿勢行列M1)と、XYZ座標系における加速度ベクトルVa1とを用いて算出することができる。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および加速度データ64を読み出し、第1姿勢行列M1と加速度ベクトルVa1と用いて、次の式(10)に従って修正後の加速度ベクトルVa’=(Cx,Cy,Cz)を算出する。
Cx=Xx・VX+Yx・VY+Zx・VZ
Cy=Xy・VX+Yy・VY+Zy・VZ
Cz=Xz・VX+Yz・VY+Zz・VZ …(10)
上式(10)に示されるように、修正後の加速度ベクトルVa’は、XYZ座標系における加速度ベクトルVa1を、上記ステップS34によって変換された後の第1姿勢行列M1で回転させることによって得ることができる。なお、図20に示されるように、修正後の加速度ベクトルVa’は、xyz座標系における加速度ベクトルVa2を、上記第1変換行列mtx1で回転させたものである。つまり、修正後の加速度ベクトルVa’は、加速度ベクトルVa2と、上記第1変換行列mtx1とを用いて算出することも可能である。なお、第2の処理例では、加速度ベクトルVa2を算出する処理を省くために、加速度ベクトルVa1が用いられる上式(10)によってベクトルVa’を算出している。CPU10は、上式(10)で算出された加速度ベクトルVa’を正規化し、正規化された加速度ベクトルVa’を示すデータ(修正加速度データ)をメインメモリに記憶する。上記ステップS35の次にステップS36の処理が実行される。
【0142】
ステップS36において、CPU10は、第1の姿勢に対して第2の変換を行うための第2変換行列mtx2を算出する。図21は、図20に示す状態から第2の変換を行った状態を示す図である。第2変換行列mtx2は、ステップS35における修正後の加速度ベクトルVa’を重力ベクトルGと一致させるように回転を行う回転行列である(図20に示す矢印参照)。具体的には、CPU10は、メインメモリに記憶されている上記修正加速度データを読み出す。そして、修正後の加速度ベクトルVa’を重力ベクトルG=(0,−1,0)と一致するように回転させる回転行列を算出し、算出された回転行列を第2変換行列mtx2とする。ステップS36で算出された第2変換行列mtx2を示すデータ(第2変換行列データ)はメインメモリに記憶される。上記ステップS36の次にステップS37の処理が実行される。
【0143】
ステップS37において、CPU10は、第1の姿勢を示す第1姿勢行列M1を第2変換行列mtx2で変換する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および上記第2変換行列データを読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該第2変換行列データにより示される第2変換行列mtx2によって変換する(第1姿勢行列M1と第2変換行列mtx2との積を算出する)。これによって、第1の姿勢に対して第2の変換が行われたこととなる。このとき、図21に示されるように、Z軸ベクトルM1Zは第2の変換によって向きが変更される。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS37の後、CPU10は第1補正処理を終了する。
【0144】
以上のように、第1補正処理の第2の処理例によれば、まず、第1の姿勢に対して、Z軸に垂直な平面XYに加速度ベクトルVaを投影した方向(投影加速度ベクトルVap)と、当該平面XYに鉛直下方向(重力方向)を投影した方向(投影重力ベクトルGp)とを一致させるZ軸回りの回転を行う第1の変換によって変換される(ステップS34、図20)。そしてさらに、第1の姿勢に対して、上記第1の変換が行われた加速度ベクトル(加速度ベクトルVa’)の方向と鉛直下方向とを一致させる回転を行う第2の変換が行われる(ステップS37、図21)。このように、第1の変換を行ってから第2の変換を行うことによって、補正前後におけるZ軸の変化は最小となる。したがって、第2の処理例によれば、加速度ベクトルを単純に(最短距離で)回転させて重力方向ベクトルと一致させる方法(図17)に比べて、Z軸の変化を小さくすることができる。これによれば、入力装置8の姿勢によってオブジェクトの姿勢を操作する場合であって、例えば入力装置8のZ軸を仮想空間のオブジェクトの長手方向に対応させる場合において、第1補正処理による補正が行われてもオブジェクトの長手方向の向きがあまり変化しない。そのため、当該補正をプレイヤにとって目立ちにくくする(プレイヤが補正に気づきにくくする)ことができ、当該補正によってプレイヤが違和感を感じることを防止することができるので、その結果操作性の良いゲーム操作を提供することができる。
【0145】
なお、上記実施形態においては、CPU10は、第1の変換処理(ステップS34)と第2の変換処理(ステップS35)とを別々に実行したが、他の実施形態においては、第1および第2の変換処理をまとめて1回の処理で実行するようにしてもよい。すなわち、図18に示す処理において、CPU10は、ステップS34の処理を実行しない代わりに、ステップS37において、第1変換行列mtx1と第2変換行列mtx2とを合成し、合成した回転行列で第1の姿勢を回転させるようにしてもよい。この場合でも、第1の変換と第2の変換とからなる変換によって入力装置8の姿勢を補正することができ、上記実施形態と同様の効果を得ることができる。
【0146】
また、上記第2の処理例は、上記第1および第2の変換からなる変換によって、入力装置8の姿勢を表す所定軸(Z軸)に関して補正前後の向きの変化が最も小さくなるように、第1の姿勢を補正するものであった。ここで、他の実施形態においては、CPU10は、入力装置8の姿勢を表す所定軸に関して補正前後の向きの変化が最も小さくなるようにすればよく、例えば次の処理によって第1の姿勢を補正するようにしてもよい。すなわち、CPU10は、まず、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第1の姿勢を回転させ(図17)、次に、補正前後で所定軸の向きの変化が最小となるように、鉛直下方向回りに第1の姿勢を回転させるようにしてもよい。これによっても、上記実施形態と同様の効果を得ることができる。
【0147】
また、上記第2の処理例においては、上記第1の処理例で用いた補正度Aを用いず、加速度ベクトルVaと重力ベクトルGとを一致させるように補正を行った。ここで、他の実施形態においては、第2の処理例においても補正度Aを用いるようにしてもよい。具体的には、ステップS33において、CPU10は、投影加速度ベクトルVapの終点から投影重力ベクトルGpの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルを算出し、投影加速度ベクトルVapを当該ベクトルと一致させるようにZ軸回りの回転を行う回転行列を上記第1変換行列として算出すればよい。また、ステップS36においては、修正後の加速度ベクトルVa’の終点から重力ベクトルGの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルを算出し、加速度ベクトルVa’を当該ベクトルと一致させるように回転を行う回転行列を上記第2変換行列として算出すればよい。なお、第2の処理例において補正度Aを用いる場合、第1の変換による補正と第2の変換による補正とで補正度Aとして同じ値を用いてもよいし、異なる値を用いてもよい。
【0148】
また、上記第2の処理例においては、XY平面と加速度ベクトルVaとが垂直になる場合、または、XY平面と重力方向ベクトルGとが垂直になる場合、正しく補正が行われない可能性がある。投影加速度ベクトルVapまたは投影重力ベクトルGpが0になってしまうからである。したがって、上記の場合には、CPU10は、第2の処理例による補正を実行せずに、第1の補正処理を終了してもよい(つまり、第1の補正処理は実行されない)。あるいは、上記の場合には、CPU10は、上記第1の処理例による補正を実行するようにしてもよい。
【0149】
図14の説明に戻り、ステップS5の次のステップS6において、CPU10は、前述した第2補正処理を実行する。第2補正処理は、マーカ座標データを用いて第1の姿勢を補正する処理である。以下、図22を参照して、第2補正処理の詳細を説明する。
【0150】
図22は、図14に示す第2補正処理(ステップS6)の流れを示すフローチャートである。第1補正処理においては、まずステップS41において、CPU10は、入力装置8の撮像手段(撮像素子40)によってマーカ部6が撮像されているか否かを判定する。ステップS41の判定は、メインメモリに記憶されているマーカ座標データ65を参照することによって行うことができる。ここでは、マーカ座標データ65が2つのマーカ座標を示す場合、マーカ部6が撮像されていると判定し、マーカ座標データ65が1つのマーカ座標のみを示す場合、または、マーカ座標がないことを示す場合、マーカ部6が撮像されていないと判定する。ステップS41の判定結果が肯定である場合、以降のステップS42〜S47の処理が実行される。一方、ステップS41の判定結果が否定である場合、以降のステップS42〜S47の処理がスキップされ、CPU10は、第2補正処理を終了する。このように、撮像素子40によってマーカ部6が撮像されていない場合には、撮像素子40から得られるデータを用いて入力装置8の姿勢を算出することができないので、この場合には第2補正処理において補正は行われない。
【0151】
ステップS42において、CPU10は、マーカ座標データに基づいてロール姿勢成分M3rを算出する。ロール姿勢成分M3rは、撮像画像内でのマーカ部6の向きに基づいて、すなわち、マーカ座標データ65により示される2つのマーカ座標を結ぶ線の傾きに基づいて算出される。以下、図23を参照して、ロール姿勢成分M3rの算出方法の例を説明する。
【0152】
図23は、撮像画像に対応する2次元座標を示す図である。図23に示されるように、本実施形態においては、撮像画像における位置を表すための2次元座標系(x’y’座標系)は、撮像画像の範囲を−1≦x’≦1、−1≦y’≦1で表すものとする。x’y’座標系は、入力装置8が基準姿勢(入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢)にある場合に、撮像画像において鉛直下向きがy’軸正方向となり、右向きがx’軸正方向となるように設定されるものとする。また、図23に示す点P1および点P2はマーカ座標の位置を示し、点P3は点P1と点P2との中点である。図23に示すベクトルv10は、点P1を始点とし、点P2を終点とするベクトルである。
【0153】
ロール姿勢成分M3rを算出するために、CPU10はまず、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標から上記ベクトルv10を算出する。さらに、ベクトルv10を正規化したベクトル(hx,hy)を算出する。このベクトル(hx,hy)は、入力装置8が上記基準姿勢にある場合にx軸正方向を向き、入力装置8のロール方向の回転に応じて向きが変化する。ベクトル(hx,hy)がロール方向の姿勢に対応しているので、ロール姿勢成分M3rは、このベクトル(hx,hy)に基づいて算出することができる。具体的には、CPU10は、次の式(11)に従ってロール姿勢成分M3rを算出する。
【数2】
上式(11)によって算出された行列を示すデータは、ロール姿勢成分データ73としてメインメモリに記憶される。ステップS42の次にステップS43の処理が実行される。
【0154】
ステップS43において、CPU10は、マーカ座標データに基づいてヨー姿勢成分M3yを算出する。ヨー姿勢成分M3yは、撮像画像内でのマーカ部6の向きおよび位置に基づいて算出される。以下、図23を参照して、ヨー姿勢成分M3yの算出方法の例を説明する。
【0155】
まず、CPU10は、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標の中点を算出する。本実施形態では、マーカ部6の位置として当該中点の位置を用いる。さらに、CPU10は、算出された中点の座標を、x’y’座標系の原点を中心として、入力装置8のロール方向に関する回転角度だけ(入力装置8の回転方向とは逆方向に)回転させた座標(px,py)を算出する。換言すれば、中点の座標は、原点を中心として、上記ベクトル(hx,hy)がx軸正方向を向くように回転される。入力装置8が水平方向(x軸方向)に関してマーカ部6と同じ位置(すなわち、マーカ部6の正面の位置)にあるとすれば、上記のようにして得られた回転後の座標(px,py)から、ヨー方向に関する姿勢を算出することができる。
【0156】
次に、CPU10は、上記中点の回転後の座標(px,py)と、マーカ部6がx’軸方向の端に位置する場合のヨー方向の角度(限界角度)θy’とに基づいて、ヨー方向に関する回転角度θyを算出する。ここで、上記限界角度θy’と、上記限界角度θy1となる場合における上記中点の回転後のx座標値px’とは予め求めておくことができる。したがって、pxとpx’との比が、θyとθy’との比に等しくなることを用いて、ヨー方向に関する回転角度θyを算出することができる。具体的には、ヨー方向に関する回転角度θyは、次の式(12)によって算出することができる。
θy=px×θy’/px’ …(12)
なお、マーカ部6の水平方向の長さを無視する場合、上記限界角度θy’は、コントローラ5の画角の1/2とし、上記px’の値は“1”とすることができる。
【0157】
最後に、CPU10は、上式(12)により算出された角度θyの回転を行う回転行列をヨー姿勢成分M3yとして算出する。具体的には、ヨー姿勢成分M3yは次の式(13)によって算出される。
【数3】
上式(13)によって算出された行列を示すデータが、ヨー姿勢成分データ74としてメインメモリに記憶される。以上のステップS43の次にステップS44の処理が実行される。
【0158】
ステップS44において、CPU10は、ロール姿勢成分M3rとヨー姿勢成分M3yとを合成する。すなわち、メインメモリからロール姿勢成分データ73およびヨー姿勢成分データ74を読み出し、各データ73および74により示されるロール姿勢成分M3rとヨー姿勢成分M3yとを積算する。ステップS44の次にステップS45の処理が実行される。
【0159】
ステップS45において、CPU10は、第1の姿勢に基づいてピッチ姿勢成分M3pを算出する。なお、本実施形態の処理とは異なるが、ピッチ姿勢成分M3pについても、ヨー姿勢成分M3yと同様の方法で、上記座標(px,py)のy座標値に基づいて算出することが可能である。ただし、上記座標(px,py)を用いてヨー方向(ピッチ方向)の姿勢を算出する方法は、入力装置8が水平方向(ピッチ方向の場合は鉛直方向)に関してマーカ部6と同じ位置にあることを前提として成り立つ方法である。本実施形態のゲームシステム1においては、プレイヤは、水平方向に関してマーカ部6(テレビ2)のほぼ正面の位置で入力装置8を操作すると考えられるので、「入力装置8が水平方向に関してマーカ部6と同じ位置にある」ことを前提して、上記ステップS43の方法によってヨー方向の姿勢を算出することが可能である。一方、プレイヤは、立って入力装置8を操作することも座って入力装置8を操作することも考えられ、また、マーカ部6の位置もテレビ2の画面の上側に配置されることも下側に配置されることも考えられる。そのため、本実施形態のゲームシステム1においては、「入力装置8が鉛直方向に関してマーカ部6と同じ位置にある」ことを必ずしも前提にできないため、上記座標(px,py)を用いてピッチ方向の姿勢を算出することを行わないようにしてもよい。
【0160】
そこで、本実施形態においては、ピッチ姿勢成分M3pについては、第1の姿勢をそのまま用いることとする(したがって、第2補正処理においては、ピッチ方向に関しては補正が行われない)。具体的には、CPU10は、メインメモリから第1姿勢データ68を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1の各要素を用いて、ピッチ方向に関する回転角度θpを、次の式(14)に従って算出する。
cos(θp)=(Zx×Zx+Zz×Zz)1/2
sin(θp)=Zy …(14)
上式(14)における変数Zx,Zy,Zzは、上式(1)において示した第1姿勢行列M1の要素である。なお、ここで用いられる第1姿勢行列M1は、今回の処理ループにおいて第1補正処理が行われた後の第1姿勢行列M1である。さらに、CPU10は、上式(14)で算出したcos(θp)およびsin(θp)を用いて、次の式(15)に従ってピッチ姿勢成分M3pの行列を算出する。
【数4】
上式(15)によって算出された行列を示すデータが、ピッチ姿勢成分データ75としてメインメモリに記憶される。以上のステップS45の次にステップS46の処理が実行される。
【0161】
ステップS46において、CPU10は、ロール方向、ヨー方向、およびピッチ方向の各姿勢成分に基づいて第3の姿勢を算出する。第3の姿勢は、ロール姿勢成分M3rとヨー姿勢成分M3yとの合成結果に、ピッチ姿勢成分M3pをさらに合成することによって得られる。具体的には、CPU10は、メインメモリからピッチ姿勢成分データ75を読み出し、当該ピッチ姿勢成分データ75により示されるピッチ姿勢成分M3pを、ステップS44で算出された行列に積算する。算出された行列を示すデータは、第3姿勢データ76としてメインメモリに記憶される。ステップS46の次にステップS47の処理が実行される。
【0162】
ステップS47において、CPU10は、第3の姿勢を用いて第1の姿勢を補正する。ステップS47における補正は、第1姿勢行列M1を第3姿勢行列M3に所定の割合(下記の定数C2)で近づけることによって行われる。CPU10は、メインメモリから第1姿勢データ68および第3姿勢データ76を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1と、第3姿勢データ76により示される第3姿勢行列M3とを用いて、次の式(16)に従って補正を行う。
M1=(M3−M1’)×C2+M1’ …(16)
上式(16)において、変数M1’は補正前の第1姿勢行列である。また、定数C2は、0<C2≦1の範囲で予め設定され、例えば0.1に設定される。上式(16)によって算出された補正後の第1姿勢行列M1を示すデータが、新たな第1姿勢データ68としてメインメモリに記憶される。上記ステップS47の後、CPU10は第2補正処理を終了する。
【0163】
以上のように、第2補正処理においては、撮像画像(マーカ座標)から第3の姿勢を算出し、第1の姿勢を第3の姿勢に近づけるように補正することとした。この補正によって、より正確な値となるように第1の姿勢を補正することができる。なお、本実施形態においては、ロール方向およびヨー方向の姿勢についてのみ撮像画像から第3の姿勢を算出したが、上述のように、ピッチ方向についても撮像画像から第3の姿勢を算出することは可能であり、他の実施形態においては、ロール方向、ヨー方向、およびピッチ方向について撮像画像から第3の姿勢を算出してもよい。また、第2補正処理においては、ロール方向、ヨー方向、およびピッチ方向のうち少なくとも1方向について第3の姿勢を算出すればよい。特に、第1補正処理(ステップS7)において第2の処理例を採用する場合には、第2補正処理においては、ロール方向のみについて第3の姿勢を算出し、ロール方向にのみ第1の姿勢を補正(回転)するようにしてもよい。つまり、ヨー方向およびピッチ方向について補正を行うと、Z軸の向きが変化し、補正前後でのZ軸の向きの変化が大きくなってしまう可能性があるので、Z軸の向きをあまり変化させない目的で第2の処理例を採用する場合には、ロールに関する補正のみ行えばよい。
【0164】
図14の説明に戻り、ステップS6の次のステップS7において、CPU10は、補正後の第1の姿勢を用いたゲーム処理を実行する。このゲーム処理は、補正後の第1の姿勢を表す第1姿勢行列M1を入力値としてゲーム結果に反映させる処理であればどのような処理であってもよい。例えば、仮想のゲーム空間内のオブジェクトを、第1姿勢行列M1により示される姿勢となるように制御して表示する処理であってもよいし、第1姿勢行列M1により示される姿勢と所定の姿勢との角度に応じた速度で上記オブジェクトを移動させるように制御して表示する処理であってもよい。ステップS7の次にステップS8の処理が実行される。
【0165】
ステップS8において、CPU10は、ゲームを終了するか否かを判定する。ステップS8の判定は、例えば、ゲームがクリアされたか否か、ゲームオーバーとなったか否か、プレイヤがゲームを中止する指示を行ったか否か等によって行われる。ステップS8の判定結果が否定である場合、ステップS3の処理が再度実行される。以降、ステップS8でゲームを終了すると判定されるまで、ステップS3〜S8の処理ループが繰り返し実行される。一方、ステップS8の判定結果が肯定である場合、CPU10は、図14に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
【0166】
以上のように、本実施形態においては、ジャイロセンサ55および56によって検出された角速度から入力装置8の第1の姿勢を算出し(ステップS4)、第1の姿勢を第1補正処理(S5)および第2補正処理(S6)によって補正した。そして、補正後の第1の姿勢を用いてゲーム処理を実行する(ステップS7)ので、CPU10は、入力装置8の正確な姿勢に基づいたゲーム処理を実行することができる。これによれば、例えば、入力装置8の姿勢をゲーム空間内のオブジェクトの姿勢に対して正確に反映させることができるので、ゲーム操作の操作性を向上することができる。
【0167】
[変形例]
なお、上記実施形態においては、3軸回りの角速度を検出するジャイロセンサを用いて、3次元の姿勢を算出する場合を例として説明したが、図8〜図12にも示したように、2次元平面上における姿勢(回転角度)を算出する場合においても本発明を適用することが可能である。なお、2次元平面上における姿勢は、2軸回りの角速度を2軸ジャイロセンサで検出することによって算出してもよいし、所定の1軸回りの角速度を1軸ジャイロセンサで検出することによって算出してもよい。
【0168】
また、他の実施形態においては、第2補正処理は、入力装置8がマーカ部6を撮像していると推測される場合にのみ、実行されるようにしてもよい。具体的には、CPU10は、第2補正処理を実行する前に、入力装置8(撮像手段)がマーカ部6を撮像可能な向きを向いているか否かを判定する。この判定は、第1の姿勢あるいは第2の姿勢を用いて行うことができる。例えば、第1の姿勢(または第2の姿勢)が、入力装置8の撮像方向が入力装置8からマーカ部6への向きに対して同じ向きかそれとも逆向きかを判定するようにしてもよい。また、上記の判定に用いられる第1の姿勢は、前回の処理ループにおいて第1および第2補正処理が行われた第1の姿勢であってもよいし、今回の処理ループにおいて算出されて第1補正処理が行われた第1の姿勢であってもよい。
【0169】
上記の判定の結果、CPU10は、入力装置8がマーカ部6を撮像可能な向きを向いていると判定される場合、第2補正処理を実行し、マーカ部6を撮像可能な向きを向いていないと判定される場合、第2補正処理をスキップする。なお、マーカ部6でない物(例えば、部屋の電灯や窓の外の太陽光等)がマーカ部6と誤検出されることがあり、誤検出によって得られたマーカ座標を用いて第3の姿勢が算出される場合、かかる第3の姿勢を用いて第2補正処理を行っても正確に補正を行うことができない。これに対して、上記の判定処理を行うことにより、誤検出によって得られたマーカ座標から算出される第3の姿勢を用いて第2補正処理が行われることを防止することができる。これによって、第2補正処理をより正確に行うことができる。
【産業上の利用可能性】
【0170】
以上のように、本発明は、ジャイロセンサを用いて入力装置の姿勢を正確に算出すること等を目的として、例えば入力装置の姿勢に応じたゲーム処理を行うゲーム装置またはゲームプログラム等として利用することが可能である。
【符号の説明】
【0171】
1 ゲームシステム
2 テレビ
3 ゲーム装置
4 光ディスク
5 コントローラ
6 マーカ部
7 ジャイロセンサユニット
8 入力装置
10 CPU
11c GPU
11e 内部メインメモリ
12 外部メインメモリ
63 角速度データ
64 加速度データ
65 マーカ座標データ
68 第1姿勢データ
76 第3姿勢データ
【技術分野】
【0001】
本発明は、姿勢算出装置または姿勢算出プログラムに関し、より特定的には、入力装置の姿勢を算出する姿勢算出装置または姿勢算出プログラムに関する。
【背景技術】
【0002】
従来、加速度センサおよびジャイロセンサを用いて入力装置の姿勢を算出する技術が考えられている。例えば、特許文献1には、加速度センサおよびジャイロセンサを備えた入力制御装置を使用するゲーム装置が記載されている。このゲーム装置は、ゲームキャラクタが持つ刀を入力制御装置の動きに応じて制御するものである。具体的には、加速度センサの出力に基づいて刀を振る動作のデータが作成され、ジャイロセンサの出力に基づいて刀の姿勢のデータが作成される。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2000−308756号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
上記特許文献1のようにジャイロセンサを用いて姿勢を算出する場合、算出される姿勢と入力制御装置の実際の姿勢との間に誤差が生じる。入力制御装置の動きが遅い場合に入力制御装置の角速度がジャイロセンサによって検知されなかったり、逆に、入力制御装置の動きが激しい場合に入力制御装置の角速度がジャイロセンサの検知可能な範囲を超えてしまったりすること等が生じる場合があるからである。また、角速度データの出力の間隔よりも短い期間中に角速度が急激に変化するような場合にも、誤差が発生する可能性がある。そして、角速度から算出される姿勢には、時間とともに角速度の誤差が蓄積されていくことになるので姿勢の誤差が大きくなっていくことになる。特許文献1では、ジャイロセンサから算出される姿勢の誤差を想定していないために、姿勢を正確に算出することができないおそれがある。
【0005】
それ故、本発明の目的は、角速度センサを用いて入力装置の姿勢を正確に算出することができる姿勢算出装置または姿勢算出プログラムを提供することである。
【課題を解決するための手段】
【0006】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、本欄における括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【0007】
本発明は、角速度センサ(ジャイロセンサ55,56)と、加速度センサ(37)とを少なくとも備えた入力装置(8)からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置である。姿勢算出装置は、姿勢算出手段(ステップS4を実行するCPU10。以下、単にステップ番号のみを記載する。)と、加速度ベクトル算出手段(S2)と、第1補正手段(S5)とを備える。姿勢算出手段は、角速度センサが検出する角速度に基づいて入力装置の姿勢(第1姿勢データ68)を算出する。加速度ベクトル算出手段は、加速度センサからの加速度データ(64)に基づいて入力装置の加速度を示す加速度ベクトル(Va1またはVa2)を算出する。第1補正手段は、空間における加速度ベクトルの方向と空間における鉛直下方向とを近づけるように入力装置の姿勢を補正する。また、第1補正手段は、入力装置の姿勢に関して、所定軸(図19に示すZ軸ベクトルM1Z)の補正前の向きと補正後の向きとの変化が最も小さくなるように、入力装置の姿勢を補正する。
【0008】
本発明によれば、角速度センサを用いて算出される姿勢は、加速度データに基づいて補正されるので、角速度センサから算出される姿勢の誤差を補正することができ、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【0009】
また、本発明によれば、姿勢の補正は、姿勢を表す所定軸に関して、補正前の向きと補正後の向きとの変化が最も小さくなるように行われる。そのため、仮想のゲーム空間内におけるオブジェクトの姿勢を入力装置の姿勢に応じて変化させるゲーム処理においては、上記所定軸に対応するオブジェクトの向きは、補正に起因する変化が最小となる。つまり、上記姿勢の補正が行われても、上記所定軸に対応するオブジェクトの向きの変化をできるだけ小さくすることができる。したがって、本発明によれば、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなり、当該補正によってプレイヤが違和感を感じることを防止することができる。その結果、操作性の良いゲーム操作を提供することができる。
【0010】
また、第1補正手段は、所定軸に垂直な平面(図19に示す平面XY)に加速度ベクトルを投影した方向(投影加速度ベクトルVap)と、当該平面に鉛直下方向を投影した方向(投影重力ベクトルGp)とを近づけるように所定軸回りの回転を行う第1の変換(第1変換行列mtx1)と、第1の変換が行われた加速度ベクトル(図20に示す加速度ベクトルVa’)の方向と鉛直下方向とを近づける回転を行う第2の変換(第2変換行列mtx2)とからなる変換によって入力装置の姿勢を補正してもよい。
【0011】
上記によれば、所定軸回りの回転を行う第1の変換と、第1の変換が行われた加速度ベクトルの方向と鉛直下方向とを近づける回転を行う第2の変換とによって入力装置の姿勢を補正するので、当該補正による所定軸の向きの変化を容易かつ確実に最小とすることができる。
【0012】
また、第1補正手段は、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正してもよい(S31−S37)。
【0013】
上記によれば、加速度ベクトルの方向と鉛直下方向とが一致するように入力装置の姿勢を補正することによって、姿勢を迅速に補正することができる。特に、本発明では、補正による所定軸の変化を小さくしているので、姿勢を迅速に補正する場合であっても、姿勢の補正によるオブジェクトの姿勢の変化をプレイヤが気づきにくくなる。
【0014】
また、第1補正手段は、加速度ベクトルの大きさが重力加速度の大きさに近いほど、加速度ベクトルの方向と空間における鉛直下方向とが近づくように、入力装置の姿勢の補正量を制御してもよい。
【0015】
上記によれば、加速度センサによって検出された加速度の大きさが重力加速度の大きさに近いほど、入力装置の姿勢がより大きく補正されることになる。ここで、加速度センサの検出結果は、加速度の大きさが重力加速度の大きさが近いほど、重力加速度の方向をより正確に示していると推測され、重力加速度の方向が正確に得られていると推測される。上記によれば、重力加速度の方向が正確に得られている場合ほど、当該重力加速度を基準とした補正が強く反映され、重力加速度の方向があまり正確に得られていない場合には、当該重力加速度を基準とした補正があまり反映されないこととなる。これによって、補正後の姿勢をより正確に算出することができる。
【0016】
また、第1補正手段は、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ入力装置の姿勢を補正してもよい。
【0017】
上記によれば、加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準以上である場合には、第1補正手段は補正を行わない。つまり、加速度ベクトルが重力加速度の方向を正確に示していないと推測される場合には(不正確な)加速度ベクトルを用いた補正を行わないようにすることによって、結果的に、姿勢をより正確に算出することができる。
【0018】
また、入力装置は、撮像手段(撮像素子40)をさらに備えていてもよい。このとき、姿勢算出装置は、撮像手段が撮像する所定の撮像対象の画像(撮像画像)に基づいて、入力装置の姿勢をさらに補正する第2補正手段(S6)をさらに備える。
【0019】
上記によれば、撮像手段の画像に基づいて入力装置の姿勢をさらに補正することによって、入力装置の姿勢をより正確に算出することができる。
【0020】
また、第2補正手段は、入力装置の姿勢に所定軸(Z軸)回りの回転を加えることによって入力装置の姿勢を補正してもよい。
【0021】
上記によれば、撮像手段の画像に基づく補正は、所定軸回りの回転に関して行われることとなる。所定軸回りの回転であれば、補正がプレイヤに気づかれにくいので、入力装置の操作性を維持しながら、入力装置の姿勢をより正確に算出することができる。
【0022】
また、本発明は、上記の姿勢算出装置によって補正された姿勢を入力装置の姿勢として用いてゲーム処理(S7)を行うゲーム装置として提供されてもよい。
【0023】
上記によれば、ゲームのプレイヤは、加速度データおよび撮像対象の画像に基づいて補正された正確な入力装置の姿勢をゲーム入力として用いてゲーム操作を行うことができるので、入力装置の姿勢に応じたゲーム操作の操作性を向上することができる。
【0024】
また、本発明は、情報処理装置のコンピュータを上記各手段として機能させる姿勢算出プログラムあるいはゲームプログラムの形態で実施されてもよい。
【発明の効果】
【0025】
本発明によれば、角速度センサを用いて算出される姿勢は加速度データに基づいて補正される。これによって、角速度センサから算出される姿勢の誤差を補正することができるので、角速度センサを用いて入力装置の姿勢を正確に算出することができる。
【図面の簡単な説明】
【0026】
【図1】ゲームシステムの外観図
【図2】ゲーム装置の機能ブロック図
【図3】入力装置の外観構成を示す斜視図
【図4】コントローラの外観構成を示す斜視図
【図5】コントローラの内部構造を示す図
【図6】コントローラの内部構造を示す図
【図7】入力装置の構成を示すブロック図
【図8】第1の姿勢および第2の姿勢を示すベクトルを示す図
【図9】補正量を示すベクトルv3を示す図
【図10】第1補正処理による補正後の第1の姿勢を示すベクトルを示す図
【図11】第1の姿勢および第3の姿勢を示すベクトルを示す図
【図12】第2補正処理による補正後の第1の姿勢を示す図
【図13】ゲーム装置のメインメモリに記憶される主なデータを示す図
【図14】ゲーム装置において実行される処理の流れを示すメインフローチャート
【図15】図14に示す第1補正処理(ステップS5)の第1の処理例の流れを示すフローチャート
【図16】空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図
【図17】図16に示す状態から、加速度ベクトルVaを最短距離で回転させる方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させた状態を示す図
【図18】図14に示す第1補正処理(ステップS5)の第2の処理例の流れを示すフローチャート
【図19】投影加速度ベクトルおよび投影重力ベクトルを示す図
【図20】図19に示す状態から第1の変換を行った状態を示す図
【図21】図20に示す状態から第2の変換を行った状態を示す図
【図22】図14に示す第2補正処理(ステップS6)の流れを示すフローチャート
【図23】撮像画像に対応する2次元座標を示す図
【発明を実施するための形態】
【0027】
[ゲームシステムの全体構成]
図1を参照して、本発明の一実施形態に係る姿勢算出装置の一例であるゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、入力装置8、およびマーカ部6を含む。本システムは、入力装置8を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
【0028】
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【0029】
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
【0030】
入力装置8は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与えるものである。本実施形態では、入力装置8はコントローラ5とジャイロセンサユニット7とを含む。詳細は後述するが、入力装置8は、コントローラ5に対してジャイロセンサユニット7が着脱可能に接続されている構成である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
【0031】
[ゲーム装置3の内部構成]
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
【0032】
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14およびAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSIの内部構成について後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11eまたは外部メインメモリ12に読み出したデータを書き込む。
【0033】
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRA
1d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
【0034】
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
【0035】
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
【0036】
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
【0037】
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
【0038】
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
【0039】
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
【0040】
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
【0041】
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
【0042】
[入力装置8の構成]
次に、図3〜図6を参照して、入力装置8について説明する。図3は、入力装置8の外観構成を示す斜視図である。図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
【0043】
図3および図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、および、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
【0044】
ハウジング31には、複数の操作ボタンが設けられる。図3に示すように、ハウジング31の上面には、十字ボタン32a、1番ボタン32b、2番ボタン32c、Aボタン32d、マイナスボタン32e、ホームボタン32f、プラスボタン32g、および電源ボタン32hが設けられる。本明細書では、これらのボタン32a〜32hが設けられるハウジング31の上面を「ボタン面」と呼ぶことがある。一方、図4に示すように、ハウジング31の下面には凹部が形成されており、当該凹部の後面側傾斜面にはBボタン32iが設けられる。これらの各操作ボタン32a〜32iには、ゲーム装置3が実行するゲームプログラムに応じた機能が適宜割り当てられる。また、電源ボタン32hは遠隔からゲーム装置3本体の電源をオン/オフするためのものである。ホームボタン32fおよび電源ボタン32hは、その上面がハウジング31の上面に埋没している。これによって、プレイヤがホームボタン32fまたは電源ボタン32hを誤って押下することを防止することができる。
【0045】
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、ジャイロセンサユニット7や他のコントローラ)を接続するために利用される。また、ハウジング31の後面におけるコネクタ33の両側には、上記他の機器が容易に離脱することを防止するために係止穴33aが設けられている。
【0046】
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
【0047】
また、コントローラ5は撮像情報演算部35(図6)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6Rおよび6Lからの赤外光を少なくとも透過する材質で構成される。
【0048】
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5)からの音を外部に放出するための音抜き孔31aが形成されている。
【0049】
次に、図5および図6を参照して、コントローラ5の内部構造について説明する。図5および図6は、コントローラ5の内部構造を示す図である。なお、図5は、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6は、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6に示す斜視図は、図5に示す基板30を裏面から見た斜視図となっている。
【0050】
図5において、ハウジング31の内部には基板30が固設されており、当該基板30の上主面上に各操作ボタン32a〜32h、各LED34a〜34d、加速度センサ37、アンテナ45、およびスピーカ49等が設けられる。これらは、基板30等に形成された配線(図示せず)によってマイクロコンピュータ(Micro Computer:マイコン)42(図6参照)に接続される。本実施形態では、加速度センサ37は、X軸方向に関してコントローラ5の中心からずれた位置に配置されている。これによって、コントローラ5をZ軸回りに回転させたときのコントローラ5の動きが算出しやすくなる。また、加速度センサ37は、長手方向(Z軸方向)に関してコントローラ5の中心よりも前方に配置されている。また、無線モジュール44(図6)およびアンテナ45によって、コントローラ5がワイヤレスコントローラとして機能する。
【0051】
一方、図6において、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
【0052】
さらに、基板30の下主面上には、上記マイコン42およびバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5および図6に示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
【0053】
また、ジャイロセンサユニット7は、角速度センサの一例であり、3軸回りの角速度を検知するジャイロセンサ(図7に示すジャイロセンサ55および56)を有する。ジャイロセンサユニット7は、コントローラ5のコネクタ33に着脱可能に装着される。ジャイロセンサユニット7の前端(図3に示すZ軸正方向側の端部)には、コネクタ33に接続可能なプラグ(図7に示すプラグ53)が設けられる。さらに、プラグ53の両側にはフック(図示せず)が設けられる。ジャイロセンサユニット7がコントローラ5に対して装着される状態では、プラグ53がコネクタ33に接続されるとともに、上記フックがコントローラ5の係止穴33aに係止する。これによって、コントローラ5とジャイロセンサユニット7とがしっかりと固定される。また、ジャイロセンサユニット7は側面(図3に示すX軸方向の面)にボタン51を有している。ボタン51は、それを押下すれば上記フックの係止穴33aに対する係止状態を解除することができるように構成されている。したがって、ボタン51を押下しながらプラグ53をコネクタ33から抜くことによって、ジャイロセンサユニット7をコントローラ5から離脱することができる。
【0054】
また、ジャイロセンサユニット7の後端には、上記コネクタ33と同形状のコネクタが設けられる。したがって、コントローラ5(のコネクタ33)に対して装着可能な他の機器は、ジャイロセンサユニット7のコネクタに対しても装着可能である。なお、図3においては、当該コネクタに対してカバー52が着脱可能に装着されている。
【0055】
なお、図3〜図6に示したコントローラ5およびジャイロセンサユニット7の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
【0056】
図7は、入力装置8(コントローラ5およびジャイロセンサユニット7)の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、および加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
【0057】
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
【0058】
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
【0059】
撮像情報演算部35は、赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を含んでいる。赤外線フィルタ38は、コントローラ5の前方から入射する光から赤外線のみを通過させる。レンズ39は、赤外線フィルタ38を透過した赤外線を集光して撮像素子40へ入射させる。撮像素子40は、例えばCMOSセンサやあるいはCCDセンサのような固体撮像素子であり、レンズ39が集光した赤外線を受光して画像信号を出力する。ここで、テレビ2の表示画面近傍に配置されるマーカ部6のマーカ6Rおよび6Lは、テレビ2の前方に向かって赤外光を出力する赤外LEDで構成される。したがって、赤外線フィルタ38を設けることによって、撮像素子40は、赤外線フィルタ38を通過した赤外線だけを受光して画像データを生成するので、マーカ6Rおよび6Lの画像をより正確に撮像することができる。以下では、撮像素子40によって撮像された画像を撮像画像と呼ぶ。撮像素子40によって生成された画像データは、画像処理回路41で処理される。画像処理回路41は、撮像画像内における撮像対象(マーカ6Rおよび6L)の位置を算出する。画像処理回路41は、算出された位置を示す座標を通信部36のマイコン42へ出力する。この座標のデータは、マイコン42によって操作データとしてゲーム装置3に送信される。以下では、上記座標を「マーカ座標」と呼ぶ。マーカ座標はコントローラ5自体の向き(傾斜角度)や位置に対応して変化するので、ゲーム装置3はこのマーカ座標を用いてコントローラ5の向きや位置を算出することができる。
【0060】
なお、他の実施形態においては、コントローラ5は画像処理回路41を備えていない構成であってもよく、撮像画像自体がコントローラ5からゲーム装置3へ送信されてもよい。このとき、ゲーム装置3は、画像処理回路41と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
【0061】
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸または2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
【0062】
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置8(コントローラ5)を基準に設定されるXYZ座標系(コントローラ座標系)における3次元のベクトル(ax,ay,az)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
【0063】
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(傾斜角度)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データに基づいてコントローラ5の姿勢を判断する。
【0064】
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
【0065】
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)またはコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かによって、コントローラ5が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ5がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ5の傾斜方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾斜角度または姿勢を判定することができる。
【0066】
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
【0067】
通信部36は、マイコン42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。また、マイコン42はコネクタ33に接続されている。ジャイロセンサユニット7から送信されてくるデータは、コネクタ33を介してマイコン42に入力される。以下、ジャイロセンサユニット7の構成について説明する。
【0068】
ジャイロセンサユニット7は、プラグ53、マイコン54、2軸ジャイロセンサ55、および1軸ジャイロセンサ56を備えている。上述のように、ジャイロセンサユニット7は、3軸(本実施形態では、XYZ軸)回りの角速度を検出し、検出した角速度を示すデータ(角速度データ)をコントローラ5へ送信する。
【0069】
2軸ジャイロセンサ55は、X軸回りの角速度およびY軸回りの(単位時間あたりの)角速度を検出する。また、1軸ジャイロセンサ56は、Z軸回りの(単位時間あたりの)角速度を検出する。なお、本明細書では、コントローラ5の撮像方向(Z軸正方向)を基準として、XYZ軸回りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、2軸ジャイロセンサ55は、ロール方向(X軸回りの回転方向)およびピッチ方向(Y軸回りの回転方向)の角速度を検出し、1軸ジャイロセンサ56は、ヨー方向(Z軸回りの回転方向)の角速度を検出する。
【0070】
なお、本実施形態では、3軸回りの角速度を検出するために、2軸ジャイロセンサ55と1軸ジャイロセンサ56とを用いる構成としたが、他の実施形態においては、3軸回りの角速度を検出することができればよく、用いるジャイロセンサの数および組み合わせはどのようなものであってもよい。
【0071】
また、本実施形態では、後述する姿勢算出処理における計算を容易にする目的で、各ジャイロセンサ55および56が角速度を検出する3つの軸は、加速度センサ37が加速度を検出する3つの軸(XYZ軸)と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ56および57が角速度を検出する3つの軸と、加速度センサ37が加速度を検出する3つの軸とは一致しなくてもよい。
【0072】
各ジャイロセンサ56および57で検出された角速度を示すデータは、マイコン54に出力される。したがって、マイコン54には、XYZ軸の3軸回りの角度速度を示すデータが入力されることになる。マイコン54は、上記3軸回りの角速度を示すデータを角速度データとしてプラグ53を介してコントローラ5へ送信する。なお、マイコン54からコントローラ5への送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
【0073】
コントローラ5の説明に戻り、操作部32、撮像情報演算部35、および加速度センサ37からマイコン42へ出力されたデータ、ならびに、ジャイロセンサユニット7からマイコン42へ送信されてきたデータは、一時的にメモリ43に格納される。これらのデータは、上記操作データとしてゲーム装置3へ送信される。すなわち、マイコン42は、ゲーム装置3の無線コントローラモジュール19への送信タイミングが到来すると、メモリ43に格納されている操作データを無線モジュール44へ出力する。無線モジュール44は、例えばBluetooth(ブルートゥース)(登録商標)の技術を用いて、所定周波数の搬送波を操作データで変調し、その微弱電波信号をアンテナ45から放射する。つまり、操作データは、無線モジュール44で微弱電波信号に変調されてコントローラ5から送信される。微弱電波信号はゲーム装置3側の無線コントローラモジュール19で受信される。受信された微弱電波信号について復調や復号を行うことによって、ゲーム装置3は操作データを取得することができる。そして、ゲーム装置3のCPU10は、取得した操作データとゲームプログラムとに基づいて、ゲーム処理を行う。なお、通信部36から無線コントローラモジュール19への無線送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。コントローラ5の通信部36は、例えば1/200秒に1回の割合で各操作データをゲーム装置3の無線コントローラモジュール19へ出力する。
【0074】
上記コントローラ5を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ5を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ5によれば、プレイヤは、コントローラ5によって画面上の任意の位置を指示する操作、および、コントローラ5自体を動かす操作を行うこともできる。
【0075】
[姿勢算出処理の概要]
次に、図8〜図12を参照して、ゲーム装置3において実行される、入力装置8の姿勢を算出する姿勢算出処理の概要を説明する。本実施形態では、ゲーム装置3は、ジャイロセンサ55および56と、加速度センサ37と、撮像手段(撮像素子40)とを備えた入力装置8からデータ(操作データ)を取得し、入力装置8の姿勢を算出する。なお、本実施形態では、入力装置8は、加速度センサ37と撮像素子40とを両方備える構成とするが、他の実施形態においては、加速度センサ37と撮像素子40とのいずれか一方のみを備える構成であってもよい。
【0076】
ゲーム装置3は、(1)姿勢算出手段と、(2)第1補正手段と、(3)第2補正手段とを備えている。本実施形態においては、これら各手段は、ゲーム装置3のコンピュータ(CPU10)によって実行されるゲームプログラム(姿勢算出プログラム)が、当該コンピュータを当該各手段として機能させることによって実現される。なお、他の実施形態においては、上記各手段の一部または全部は、ゲーム装置3が備える専用回路として実現されてもよい。
【0077】
(1)姿勢算出手段
姿勢算出手段は、ジャイロセンサ55および56が検出する角速度に基づいて入力装置8の姿勢を算出する(後述するステップS4)。角速度から姿勢を算出する方法はどのような方法であってもよいが、例えば、初期姿勢に(単位時間あたりの)角速度を逐次加算する方法がある。すなわち、ジャイロセンサ55および56から逐次出力される角速度を積分し、初期状態からの姿勢の変化量を積分結果から算出することによって、現在の姿勢を算出することができる。なお、以下では、姿勢算出手段によって角速度から算出される入力装置8の姿勢を「第1の姿勢」と呼ぶ。ただし、第1の姿勢に補正が加えられた後の姿勢も第1の姿勢と呼ぶ。
【0078】
ここで、ジャイロセンサ55および56が検出する角速度を用いて算出される上記第1の姿勢には、ジャイロセンサ55および56の誤検知が原因で、入力装置8の実際の姿勢との間に誤差が生じることがある。そこで、本実施形態では、ゲーム装置3は、加速度センサ37によって検出される加速度を用いて上記第1の姿勢を補正する。また、撮像素子40によって撮像される画像(撮像画像)を用いて上記第1の姿勢を補正する。
【0079】
(2)第1補正手段
第1補正手段は、加速度センサ37が検出する加速度データに基づいて上記第1の姿勢を補正する(後述するステップS5)。本実施形態では、第1補正手段は、上記第1の姿勢を第2の姿勢へと近づける補正を行う。ここで、第2の姿勢とは、加速度データから決まる姿勢、具体的には、加速度データが示す加速度の向きが鉛直下向きであると想定する場合における入力装置8の姿勢を指す。すなわち、加速度データが示す加速度が重力加速度であると仮定して算出された姿勢である。以下、図8〜図10を参照して、第1補正手段による補正処理(第1補正処理)を説明する。なお、本実施形態では、第1補正手段の具体的な方法として第1および第2の処理例を記載するが、図8〜図10では第1の処理例について説明する。
【0080】
図8は、第2の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図8〜図10では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図8(a)に示すベクトルGは、入力装置8が存在する空間の所定位置を基準とした空間座標系に定義された鉛直下方向、すなわち重力方向を示す。また、図8(a)に示すベクトルv1は、コントローラ5が第1の姿勢であるときの、入力装置8の下向きのベクトル(すなわち図3−図5に示されるY軸負方向)の空間座標系での向きを示したものである。なお、入力装置8の姿勢が基本状態にあるときには、姿勢を示すベクトルはベクトルGと一致することになる。したがって、ベクトルv1は、空間座標系における第1の姿勢に対応する。上記第1の姿勢は、ベクトルGに対してベクトルv1がなす回転としても表すことができ、2次元の図8においては角度θ1として示している。第1の姿勢は角速度によって算出されるので、ベクトルv1は、前回の姿勢に角速度を加えて回転させることによって算出されるものである。第2の姿勢は加速度データに基づいて算出される。図8(a)に示すベクトルv2は、加速度データが示す加速度の向き(ビュー座標系における加速度の向き)を示している。ただし、加速度データは入力装置8に加えられる加速度であって、取得できるのは入力装置8を基準とした座標系におけるベクトルである。図8(b)に、加速度センサの軸と加速度ベクトルとの関係を示す。図8(b)のように、加速度センサから取得される加速度ベクトルv0と、センサのY軸負方向とのなす角度がθ2であるとき、図8(a)の空間座標系においては、ベクトルv1に回転θ2を加えたベクトルv2が空間座標系における加速度ベクトルとなる。そして、第2の姿勢は、上述したように「加速度データが示す加速度の向きが鉛直下向きとみなした場合における入力装置8の姿勢」であるので、ベクトルv2からベクトルv1へ向いた角度θ2の回転が第2の姿勢となる。第2の姿勢を、ベクトルv1のように空間座標系における入力装置8の下向きのベクトルで表すと、ベクトルGをθ2だけ回転させたベクトルv2’として示すことができる。また、3次元の姿勢の場合には、3次元の回転行列等で表現することもできる。なお、角速度から第1の姿勢が正しく算出され、かつ、加速度データが重力方向を正確に示している場合には、加速度の向きを示すベクトルv2の方向は空間座標系の鉛直下方向、つまり重力方向と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合や、加速度データが正確な重力方向を示していない場合には、図8(a)のように、加速度の向きを示すベクトルv2と重力方向のベクトルGとが異なる。そして、例えば静止状態等のように、加速度データにより示される方向が重力方向と一致すると想定される状況においては、ベクトルv1よりもベクトルv2の方が入力装置8の姿勢に対応するデータとして正確なものと考えられる。また、入力装置が静止していない場合であっても、ある程度の期間内における平均的な姿勢の精度を考慮すると、加速度ベクトルは平均的には重力方向に近いものとなるので、時間とともに誤差の蓄積する角速度から算出される姿勢よりも信頼できるものと考えられる。一方で、前回の算出タイミングで正しい姿勢が算出されている状態であった場合には、次の算出タイミングにおける姿勢の算出には、加速度よりも角速度を用いた方が正確な姿勢が算出されると考えられる。すなわち、角速度による姿勢算出は、タイミングごとの誤差は加速度による算出よりも小さいが、時間と共に誤差が増大する一方、加速度による姿勢算出は、タイミングごとの誤差は場合よっては大きい可能性もあるが、タイミングごとに算出可能であるので誤差が蓄積しないという特徴を持つ。したがって、第1補正手段では、第1の姿勢と第2の姿勢の両方を考慮した補正を行う。
【0081】
第1補正手段による補正は、上記第1の姿勢を第2の姿勢へと近づける補正である。つまり、第1補正手段は、上記角度θ1を上記角度θ2に近づける補正を行う。これは、ベクトルv1をベクトルv2’に近づける補正と表現してもよい。ただし、演算の過程上は、ベクトルv2がわかっていれば、ベクトルv2’自体は算出されなくとも補正は可能である。本実施形態では、上記補正は、補正量を示すベクトルv3を用いて行われる。図9は、補正量を示すベクトルv3を示す図である。図9に示すベクトルv3は、第1の姿勢を補正する補正量を示すベクトルである。具体的には、ベクトルv2に対してベクトルv3がなす角度Δθが、補正量となる。詳細は後述するが、ベクトルv3は、ベクトルGとベクトルv2との間に設定される(図9参照)。ベクトルv1をΔθだけ回転させることで、ベクトルv1が上述のベクトルv2’に近づくことになる。
【0082】
第1補正処理は、第1の姿勢(ベクトルv1)を上記補正量だけ回転させることによって行われる。図10は、第1補正処理による補正後の第1の姿勢を示すベクトルを示す図である。図10に示すように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を角度Δθだけ回転させることによって得られる。これによって、補正後の第1の姿勢を表す角度θ1’は、角度θ1と角度θ2との間となっており、上記角度θ1を上記角度θ2に近づける補正が行われたことがわかる。
【0083】
なお、上記第1の方法においては、第1補正手段は、第1の姿勢を第2の姿勢へと近づける補正を行い、補正後の第1の姿勢を第2の姿勢と一致させていない。これは、加速度データが誤検出や激しい操作等の原因で急激に変化する場合であっても補正後の第1の姿勢が急激に変化しないようにするためである。ただし、第1補正手段は、補正後の第1の姿勢を第2の姿勢と一致させるように補正を行ってもよい(後述する第2の方法)。また、詳細は後述するが、第1の方法においては、第1補正手段が第1の姿勢を第2の姿勢へと近づける割合は、加速度データにより示される加速度の大きさ(より具体的には、当該大きさと重力加速度の大きさとの差分)に応じて変化するように決められる。ただし、他の実施形態においては、上記割合を予め定められた固定値としてもよい。
【0084】
(3)第2補正手段
第2補正手段は、撮像手段が撮像する所定の撮像対象の画像に基づいて第1の姿勢を補正する(後述するステップS6)。ここで、本実施形態においては、所定の撮像対象とは上記マーカ部6(の赤外LED)である。本実施形態では、第2補正手段は、上記第1の姿勢を第3の姿勢へと近づける補正を行う。第3の姿勢は、上記撮像対象の画像から算出される姿勢であり、具体的には、当該画像内での撮像対象の向きおよび/または位置から算出される入力装置8の姿勢である。以下、図11および図12を参照して、第2補正手段による補正処理(第2補正処理)を説明する。
【0085】
図11は、第3の姿勢を用いた第1の姿勢の補正を示す図である。なお、本実施形態では、実際には3次元空間における姿勢を処理しているが、図11および図12では、図面をわかりやすくするために2次元平面における姿勢を用いて説明する。図11に示すベクトルv1は、空間座標系における第1の姿勢を示す。図11に示すベクトルv4は、空間座標系における第3の姿勢を示す。マーカ部6の位置や姿勢は予め定められているので、画像内での当該マーカの姿勢や位置によって、相対的に入力装置8の姿勢を算出することができる。第3の姿勢が正しい姿勢を表していることを前提とすれば、角速度から第1の姿勢が正しく算出されている場合には、第1の姿勢を示すベクトルv1は、第3の姿勢を示すベクトルv4と一致する。つまり、角速度から第1の姿勢が正しく算出されていない場合には、図11のように、第1の姿勢を示すベクトルv1と第3の姿勢を示すベクトルv4とが異なる。
【0086】
第2補正処理は、第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって行われる。図12は、第2補正処理による補正後の第1の姿勢を示す図である。図12に示されるように、補正後の第1の姿勢(ベクトルv1’)は、補正前の第1の姿勢(ベクトルv1)を、第3の姿勢(ベクトルv4)に所定の割合で近づけることによって得られる。
【0087】
ここで、入力装置8の姿勢や位置によっては撮像手段がマーカ部6を撮像することができない場合があり、この場合、第2補正手段は第2補正処理を行うことができない。したがって、仮に、第2補正手段が補正後の第1の姿勢を第3の姿勢と一致させるように補正を行うとすれば、第2補正処理を行うことができない状態から第2補正処理を行うことができる状態へと移行した際に、第1の姿勢が急激に変化してしまうおそれがある。このように第1の姿勢がプレイヤの意図に沿わずに急激に変化してしまうと、(たとえ補正後の姿勢が正確なものであったとしても)プレイヤは操作に違和感を感じてしまう。このような急激な変化を防止するために、本実施形態では、第1の姿勢を第3の姿勢に所定の割合で近づけるように補正を行っている。これによって、第1の姿勢が急激に変化することを防止することができるので、プレイヤが操作に違和感を感じることを防止することができる。ただし、撮像手段が常にマーカ部6を撮像することが可能な姿勢で入力装置8が使用されることが想定できる場合等、他の実施形態においては、第2補正手段は、補正後の第1の姿勢を第3の姿勢と一致させるように補正を行ってもよい。
【0088】
なお、本実施形態では、ゲーム装置3は、第1補正処理と第2補正処理との両方を実行するが、他の実施形態においては、第1補正処理と第2補正処理とのいずれか一方のみを実行するようにしてもよい。また、本実施形態においては、ゲーム装置3は、第1補正処理を先に行い、第2補正処理を後に行うこととするが、第1補正処理と第2補正処理とのいずれを先に行うようにしてもよい。
【0089】
以上のように、本実施形態によれば、ジャイロセンサ55および56によって検知された角速度から算出される入力装置8の姿勢を、加速度センサ37によって検知された加速度を用いて補正し、また、撮像手段による撮像画像を用いて補正する。これによって、ジャイロセンサから算出される姿勢の誤差を減少することができ、入力装置8の姿勢をより正確に算出することができる。
【0090】
なお、加速度センサ37の検出結果からは、重力方向を軸とした回転(ヨー方向の回転)を検知することはできないので、第1補正手段による補正は、ヨー方向に関しては行うことができない。しかし、加速度センサ37の検出結果を用いた補正は、入力装置8の姿勢がどのような姿勢であっても(常に加速度を検出することができるので)可能であるという特長を有する。一方、入力装置8の撮像方向にマーカ部6がなければマーカ座標が検出されないので、第2補正手段による補正は、入力装置8の姿勢によっては行うことができない。しかし、撮像画像を用いた補正は、姿勢(特にロール方向の姿勢)を正確に算出することができるという特長を有する。本実施形態においては、このように特長の異なる2種類の補正を行うことによって、入力装置8の姿勢をより正確に算出することができる。
【0091】
[ゲーム装置3における処理の詳細]
次に、ゲーム装置3において実行される処理の詳細について説明する。まず、ゲーム装置3における処理において用いられる主なデータについて図13を用いて説明する。図13は、ゲーム装置3のメインメモリ(外部メインメモリ12または内部メインメモリ11e)に記憶される主なデータを示す図である。図13に示すように、ゲーム装置3のメインメモリには、ゲームプログラム60、操作データ62、およびゲーム処理用データ67が記憶される。なお、メインメモリには、図13に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
【0092】
ゲームプログラム60は、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部または全部が読み込まれてメインメモリに記憶される。ゲームプログラム60には、姿勢算出プログラム61が含まれる。姿勢算出プログラム61は、入力装置8の姿勢を算出するための姿勢算出処理を実行するためのプログラムである。
【0093】
操作データ62は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、メインメモリに記憶される操作データ62はこの割合で更新される。本実施形態においては、メインメモリには、最新の(最後に取得された)操作データのみが記憶されればよい。
【0094】
操作データ62には、角速度データ63、加速度データ64、マーカ座標データ65、および操作ボタンデータ66が含まれる。角速度データ63は、ジャイロセンサユニット7のジャイロセンサ55および56によって検出された角速度を示すデータである。ここでは、角速度データ63は、図3に示すXYZの3軸回りのそれぞれの角速度を示す。また、加速度データ64は、加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータである。ここでは、加速度データ64は、図3に示すXYZの3軸の方向に関する加速度を各成分とする3次元の加速度ベクトルVa1を示す。また、本実施形態においては、コントローラ5が静止している状態で加速度センサ37が検出する加速度ベクトルVa1の大きさを“1”とする。つまり、加速度センサ37によって検出される重力加速度の大きさは“1”である。
【0095】
マーカ座標データ65は、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系(図23に示すx’y’座標系)で表現される。なお、撮像素子40によって2つのマーカ6Rおよび6Lが撮像される場合には、2つのマーカ座標が算出される。一方、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lのいずれか一方が位置しない場合には、撮像素子40によって1つのマーカのみが撮像され、1つのマーカ座標のみが算出される。また、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lの両方が位置しない場合には、撮像素子40によってマーカが撮像されず、マーカ座標は算出されない。したがって、マーカ座標データ65は、2つのマーカ座標を示す場合もあるし、1つのマーカ座標を示す場合もあるし、マーカ座標がないことを示す場合もある。
【0096】
操作ボタンデータ66は、各操作ボタン32a〜32iに対する入力状態を示すデータである。
【0097】
ゲーム処理用データ67は、後述するゲーム処理(図14)において用いられるデータである。ゲーム処理用データ67は、第1姿勢データ68、加速度大きさデータ69、補正度データ70、補正量ベクトルデータ71、補正行列データ72、ロール姿勢成分データ73、ヨー姿勢成分データ74、ピッチ姿勢成分データ75、および第3姿勢データ76を含む。なお、図13に示すデータの他、ゲーム処理用データ67は、ゲーム処理において用いられる各種データ(ゲームパラメータを示すデータ等)を含む。
【0098】
第1姿勢データ68は、角速度データ63を用いて算出される上記第1の姿勢を示すデータである。本実施形態では、第1の姿勢は、以下の式(1)に示す3×3の行列M1で表現される。
【数1】
上記行列M1は、所定の基準姿勢から現在の入力装置8の姿勢への回転を表す回転行列である。以下では、第1の姿勢を示す行列M1を、「第1姿勢行列M1」と呼ぶ。なお、第1姿勢行列M1により表される第1の姿勢は、入力装置8が存在する空間の所定位置を基準としたxyz座標系(上記空間座標系)における姿勢である。ここでは、xyz座標系は、入力装置8がマーカ部6の正面に位置することを前提とし、入力装置8の位置からマーカ部6を向く方向をz軸正方向とし、鉛直上向き(重力方向の逆方向)をy軸正方向とし、入力装置8の位置からマーカ部6を向いた場合の左方向をx軸正方向とした座標系であるとする。ここでは、上記所定の基準姿勢は、マーカ部6の正面に位置する入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢(すなわち、入力装置8を基準としたX軸、Y軸、Z軸が、それぞれx軸、y軸、z軸の向きと一致する姿勢)であるとする。なお、本実施形態では、行列を用いて第1の姿勢を表現することとしたが、他の実施形態においては、第1の姿勢は、3次のベクトルまたは3つの角度によって表現されてもよい。
【0099】
加速度大きさデータ69は、加速度データ64により示される加速度ベクトルVa1の大きさ(長さ)Lを示すデータである。
【0100】
補正度データ70は、第2の姿勢を用いて第1の姿勢を補正する度合(補正度A)を示すデータである。補正度Aは、0≦A≦C1(C1は、0<C1≦1の所定の定数)の範囲を取り得る値である。詳細は後述するが、補正後の第1の姿勢は、補正度Aの値が大きいほど第2の姿勢に近くなる。
【0101】
補正量ベクトルデータ71は、第1の姿勢を補正する補正量を示すベクトル(図9に示すベクトルv3。以下、補正量ベクトルと呼ぶ。)を示すデータである。補正量ベクトルVgは、上記加速度ベクトルVa1を上記xyz座標系で表したベクトルVa2と、上記補正度Aとに基づいて算出される。
【0102】
補正行列データ72は、第1の姿勢を補正するために用いる回転行列(補正行列と呼ぶ)Maを示すデータである。つまり、第1補正処理においては、第1の姿勢を表す第1姿勢行列M1に補正行列Maを掛けることで第1の姿勢が補正される。補正行列Maは、上記ベクトルVa2と上記補正量ベクトルVgとに基づいて算出される。
【0103】
ロール姿勢成分データ73は、上記撮像対象の画像から算出される第3の姿勢に含まれる姿勢成分のうち、ロール方向に関する姿勢成分(ロール姿勢成分)M3rを示すデータである。また、ヨー姿勢成分データ74は、上記第3の姿勢に含まれる姿勢成分のうち、ヨー方向に関する姿勢成分(ヨー姿勢成分)M3yを示すデータであり、ピッチ姿勢成分データ75は、上記第3の姿勢に含まれる姿勢成分のうち、ピッチ方向に関する姿勢成分(ピッチ姿勢成分)M3pを示すデータである。なお、ここで言うロール方向、ヨー方向、およびピッチ方向とは、入力装置8の撮像方向(Z軸正方向)を基準とした場合の回転方向である。本実施形態においては、各姿勢成分M3r、M3y、およびM3pは、第1の姿勢と同様、3×3の行列で表現される。
【0104】
第3姿勢データ76は、上記撮像対象の画像から算出される第3の姿勢を示すデータである。本実施形態では、第3の姿勢は、第1の姿勢と同様、3×3の行列M3で表現される。以下では、第3の姿勢を示す行列M3を「第3姿勢行列M3」と呼ぶ。本実施形態では、入力装置8から操作データとしてマーカ座標データが送信されてくるので、第3姿勢行列M3は、マーカ座標データ65に基づいて算出される。具体的には、第3姿勢行列M3は、上記各姿勢成分M3r、M3y、およびM3pを合成することによって得られる。
【0105】
次に、ゲーム装置3において行われる処理の詳細を、図14〜図23を用いて説明する。図14は、ゲーム装置3において実行される処理の流れを示すメインフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリに読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。図14に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
【0106】
まず、ステップS1において、CPU10は、ゲームに関する初期化処理を実行する。この初期化処理においては、ゲーム処理に用いられる各種パラメータの値が初期化されたり、仮想のゲーム空間が構築されたり、プレイヤオブジェクトや他のオブジェクトがゲーム空間の初期位置に配置されたりする。以上のステップS1の次にステップS2の処理が実行される。
【0107】
ステップS2において、CPU10は、初期姿勢設定処理が実行される。具体的には、プレイヤが所定の操作(例えば、Aボタン32dを押下する操作)を行ったことに応じて、入力装置8の第1の姿勢の初期姿勢として所定の値が設定される。ここでは、基準となる姿勢は、Z軸が鉛直方向と平行となり、かつ、入力装置8の撮像方向がマーカ部6の中央(マーカ6Rおよび6Lの中央)を向く姿勢としているので、プレイヤは、初期姿勢が上記基準となる姿勢となるように入力装置8を把持した状態で、上記所定の操作を行うことが望ましいが、入力装置が静止状態に近く、かつマーカ部を撮像可能であれば、初期姿勢を算出することが可能である。CPU10は、所定の操作が行われると、上記初期姿勢を表す行列を示すデータを第1姿勢データとしてメインメモリに記憶する。以上のステップS2の後、ステップS3〜S8の処理ループが、ゲームが実行される間繰り返し実行される。なお、1回の当該処理ループは、1フレーム時間(例えば1/60秒)に1回の割合で実行される。
【0108】
なお、本実施形態では、初期姿勢設定処理(ステップS2)は、ゲーム開始前(ステップS3〜S8の処理ループが実行される前)に1回実行されるのみであるとしたが、他の実施形態においては、ゲーム中における任意のタイミングで初期姿勢設定処理が実行されるようにしてもよい。すなわち、CPU10は、ゲーム中においてプレイヤが上記所定の操作を行ったことに応じて初期姿勢設定処理を実行するようにしてもよい。
【0109】
ステップS3において、CPU10は操作データを取得する。すなわち、コントローラ5から送信されてくる操作データが無線コントローラモジュール19を介して受信される。そして、受信された操作データに含まれる角速度データ、加速度データ、マーカ座標データ、操作ボタンデータがそれぞれメインメモリに記憶される。ステップS3の次にステップS4の処理が実行される。
【0110】
ステップS4において、CPU10は、メインメモリに記憶されている角速度データ63に基づいて第1の姿勢を算出する。入力装置8の姿勢を角速度から算出する方法はどのような方法であってもよいが、本実施形態においては、第1の姿勢は、前回の第1の姿勢(前回の処理ループにおいて算出された第1の姿勢)と、今回の角速度(今回の処理ループにおいて取得された角速度)とを用いて算出される。具体的には、CPU10は、前回の第1の姿勢を今回の角速度で単位時間分回転させた姿勢を、第1の姿勢とする。なお、前回の第1の姿勢は、メインメモリに記憶されている第1姿勢データ68により示され、今回の角速度は、メインメモリに記憶されている角速度データ63により示されている。ステップS4で算出された姿勢(3×3の行列)を示すデータが、第1姿勢データ68としてメインメモリに新たに記憶される。上記ステップS4の次にステップS5の処理が実行される。
【0111】
ステップS5において、CPU10は前述した第1補正処理を実行する。第1補正処理は、加速度データを用いて第1の姿勢を補正する処理である。以下、図15を参照して、第1補正処理における第1の処理例を説明し、図16〜図21を参照して、第1補正処理における第2の処理例を説明する。
【0112】
図15は、図14に示す第1補正処理(ステップS5)の第1の処理例の流れを示すフローチャートである。第1補正処理においては、まずステップS11において、CPU10は、加速度センサ37によって検出された加速度の大きさLを算出する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1について大きさLを算出する。算出された大きさLを示すデータは加速度大きさデータ69としてメインメモリに記憶される。ステップS11の次にステップS12の処理が実行される。
【0113】
ステップS12において、CPU10は、加速度センサ37によって検出された加速度の大きさが0であるか否かを判定する。すなわち、メインメモリに記憶されている加速度大きさデータ69を読み出し、当該加速度大きさデータ69により示される大きさLが0であるか否かを判定する。ステップS12の判定結果が否定である場合、ステップS13の処理が実行される。一方、ステップS12の判定結果が肯定である場合、以降のステップS13〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。このように、本実施形態においては、加速度センサ37によって検出された加速度の大きさが0である場合には、当該加速度を用いた補正が行われない。これは、加速度の大きさが0である場合には加速度センサ37の検出結果から重力方向を算出できないということ、および、加速度ベクトルの大きさが0であれば以降のステップS13〜S21の処理が困難であることが理由である。
【0114】
ステップS13において、CPU10は、加速度センサ37によって検出された加速度ベクトルVa1を正規化する。すなわち、メインメモリに記憶されている加速度データ64を読み出し、当該加速度データ64により示される加速度ベクトルVa1を、大きさが1となるように補正する。CPU10は、正規化された加速度ベクトルVa1を示すデータをメインメモリに記憶しておく。ステップS13の次にステップS14の処理が実行される。
【0115】
ステップS14において、CPU10は、第1補正処理において第1の姿勢を補正する度合を示す上記補正度Aを算出する。補正度Aは、正規化される前の加速度ベクトルVa1の大きさLに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている加速度大きさデータ69を読み出す。そして、当該加速度大きさデータ69により示される大きさLを用いて、次の式(2)に従って補正度Aを算出する。
A=|L−1| …(2)
上式(2)で算出された補正度Aを示すデータは、補正度データ70としてメインメモリに記憶される。なお、上式(2)で算出された補正度Aは、最終的な値ではない演算中の値であって、以降のステップS16で値が変換されることによって、最終的な補正度Aの値が得られる。ステップS14の次にステップS15の処理が実行される。
【0116】
ステップS15において、CPU10は、ステップS14で算出された補正度Aが所定値Rよりも小さいか否かを判定する。所定値Rは、予め定められており、例えば0.4に設定される。ここで、上述したように、本実施形態においては、加速度センサ37によって検出される重力加速度の大きさは“1”であり、また、補正度Aは加速度ベクトルVa1の大きさLと“1”との差の絶対値である(上式(2))。したがって、補正度Aが所定値R以上である場合とは、加速度ベクトルVa1の大きさLが重力加速度の大きさから所定値R以上離れている場合である。ステップS15の判定結果が肯定である場合、ステップS16の処理が実行される。一方、ステップS15の判定結果が否定である場合、以降のステップS16〜S21の処理がスキップされて、CPU10は第1補正処理を終了する。
【0117】
上記のように、本実施形態では、加速度センサ37によって検出される加速度の大きさLと重力加速度の大きさ(=1)との差が所定の基準(所定値R)よりも小さい場合にのみ補正が行われ、当該大きさLと重力加速度の大きさとの差が所定の基準以上である場合には補正が行われない。ここで、入力装置8が動かされている状態では、重力加速度以外に、入力装置8が動かされることによって生じる慣性による加速度が加速度センサ37によって検出されるので、検出される加速度ベクトルVa1の大きさLが“1”とは異なる値となり、入力装置8が激しく動かされている場合には、大きさLが“1”から大きく離れた値となる。したがって、上記大きさLと重力加速度の大きさとの差が所定の基準以上である場合とは、入力装置8が激しく動かされている場合であると推測される。一方、入力装置8が激しく動かされている場合には、加速度センサ37によって検出される加速度ベクトルVa1に重力加速度以外の成分(上記慣性による加速度の成分)が多く含まれているため、加速度ベクトルVa1の値は、重力方向を示す値としては信頼できないものと推測される。したがって、上記ステップS15の判定処理は、入力装置8が激しく動かされているか否か、換言すれば、加速度ベクトルVa1の値が重力方向を示す値としては信頼できるものであるか否かを判定する処理である。本実施形態においては、上記ステップS15の判定処理によって、加速度ベクトルVa1の値が重力方向を示す値としては信頼できない場合には補正を行わず、加速度ベクトルVa1の値が重力方向を示す値としては信頼できる場合にのみ補正を行うようにしている。これによって、重力方向を示す値としては信頼できない加速度ベクトルVa1を用いて第1の姿勢に対する補正が行われた結果、第1の姿勢が正しく補正されなくなることを防止することができる。
【0118】
ステップS16において、CPU10は、補正度Aの値を変換する。本実施形態では、補正度Aを、検出された加速度ベクトルVa1の大きさLが重力加速度の大きさに近いほど1に近くなるように、補正度Aを変換する。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを、以下の式(3)〜(5)に従って変換する。
A2=1−(A1/R) …(3)
A3=A2×A2 …(4)
A4=A3×C1 …(5)
上式(3)〜(5)において、変数A1は変換前の補正度(メインメモリに現在記憶されている補正度データ70により示される値)であり、変数A4がステップS16において最終的に変換される補正度である。上式(3)は、変換前の補正度A1の大きさが重力加速度の大きさ(=1)に近いほど1に近くなるように変換後の補正度A2を得るための式である。上式(4)は、変換前の補正度A2が1に近いほど大きい重みが付されるように変換後の補正度A3を得るための式である。上式(5)は、補正量の大きさを調整するための式である。すなわち、定数C1は、定数C1の値が大きいほど補正量は大きくなる。定数C1は、予め定められ、0<C1≦1の範囲(例えば0.03)で設定される。以上の式(3)〜(5)による変換によって得られた補正度A4を示すデータが、新たな補正度データ70としてメインメモリに記憶される。上記ステップS16の次にステップS17の処理が実行される。
【0119】
なお、本実施形態においては、上式(3)〜(5)による変換を行ったが、他の実施形態においては、上式(3)〜(5)のうち一部または全部の変換を省略してもよい。ただし、上式(3)の変換を省略する場合には、後述するステップS18で用いる式(7)において、加速度ベクトルVa2と重力方向ベクトル(0,−1,0)とを入れ替える必要がある。
【0120】
ステップS17において、CPU10は、XYZ座標系で表現される加速度ベクトルVa1をxyz座標系の値Va2へと変換する。xyz座標系における加速度ベクトルVa2は、正規化された加速度ベクトルVa1を、前回のフレームにおいて得られた第1の姿勢を表す第1姿勢行列M1を用いて変換することによって算出される。すなわち、CPU10は、ステップS13においてメインメモリに記憶された(正規化された)加速度ベクトルVa1のデータと、第1姿勢データ68とを読み出す。そして、当該加速度ベクトルVa1と当該第1姿勢データ68により示される第1姿勢行列M1とを用いて、xyz座標系における加速度ベクトルVa2を算出する。より具体的には、正規化された加速度ベクトルVa1=(nx,ny,nz)とし、第1姿勢行列M1の各要素を上式(1)に示す変数とし、xyz座標系で表現される加速度ベクトルVa2=(vx,vy,vz)とすると、加速度ベクトルVa2は次の式(6)に従って算出される。
vx=Xx×nx+Yx×ny+Zx×nz
vy=Xy×nx+Yy×ny+Zy×nz
vz=Xz×nx+Yz×ny+Zz×nz …(6)
上式(6)に示されるように、加速度ベクトルVa2は、回転行列である第1姿勢行列M1によって加速度ベクトルVa1を回転させることによって得ることができる。ステップS17において算出された加速度ベクトルVa2はメインメモリに記憶される。上記ステップS17の次にステップS18の処理が実行される。
【0121】
ステップS18において、CPU10は、xyz座標系で表現される加速度ベクトルVa2と補正度Aとを用いて補正量ベクトルVgを算出する。補正量ベクトルVgは、上記ステップS16による変換後の補正度と、xyz座標系の鉛直下方向(重力方向)を示すベクトル(0,−1,0)とを用いて算出される。具体的には、CPU10は、メインメモリに記憶されている補正度データ70を読み出し、当該補正度データ70により示される補正度Aを用いて、以下の式(7)に従って補正量ベクトルVg=(gx,gy,gz)を算出する。
gx=(0−vx)×A+vx
gy=(−1−vy)×A+vy
gz=(0−vz)×A+vz …(7)
上式(7)に示されるように、補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトル(0,−1,0)の終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルである。したがって、補正量ベクトルVgは、補正度Aの値が大きいほど、重力方向ベクトルに近づくこととなる。CPU10は、上式(7)によって算出された補正量ベクトルVgを示すデータを、補正量ベクトルデータ71としてメインメモリに記憶する。上記ステップS18の次にステップS19の処理が実行される。
【0122】
ステップS19において、CPU10は、上記ステップS18で算出された補正量ベクトルVgを正規化する。すなわち、メインメモリに記憶されている補正量ベクトルデータ71を読み出し、当該補正量ベクトルデータ71により示されるベクトルを正規化する。そして、正規化されたベクトルを示すデータを新たな補正量ベクトルデータ71としてメインメモリに記憶する。なお、上記ステップS19で算出された補正量ベクトルVgが、図9に示すベクトルv3に相当する。上記ステップS19の次にステップS20の処理が実行される。
【0123】
ステップS20において、CPU10は、第1の姿勢を補正するための補正行列Maを算出する。補正行列Maは、xyz座標系で表現される加速度ベクトルVa2と、ステップS19において正規化された補正量ベクトルVgとに基づいて算出される。具体的には、CPU10は、ステップS17でメインメモリに記憶された加速度ベクトルVa2と、補正量ベクトルデータ71を読み出す。そして、上記加速度ベクトルVa2を補正量ベクトルVgと一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとする。つまり、補正行列Maは、図9に示す角度Δθの回転を行う回転行列である。ステップS20で算出された補正行列Maを示すデータは、補正行列データ72としてメインメモリに記憶される。上記ステップS20の次にステップS21の処理が実行される。
【0124】
ステップS21において、CPU10は、第1の姿勢を示す第1姿勢行列M1を補正行列Maで補正する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および補正行列データ72を読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該補正行列データ72により示される補正行列Maによって変換する(第1姿勢行列M1と補正行列Maとの積を算出する)。変換後の第1姿勢行列M1が、補正された第1の姿勢を示すこととなる。つまり、ステップS21の処理は、図10に示すベクトルv1を角度Δθだけ回転させる処理に相当する。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS21の後、CPU10は第1補正処理を終了する。
【0125】
以上のように、第1補正処理においては、加速度センサ37によって検出された加速度ベクトルと、重力方向ベクトル(図8に示すベクトルG)との間に補正量ベクトルVgを算出し(ステップS18およびS19)、この補正量ベクトルVgにより表される補正量(補正行列Ma。図9に示す角度Δθ)だけ第1の姿勢を補正した(ステップS21)。これによって、ジャイロセンサ55および56から算出される第1の姿勢(図8に示すベクトルv1または角度θ1)を、加速度センサ37によって決められる第2の姿勢(図8に示す角度θ2)に近づける補正を行うことができる。かかる補正を行うことにより、より正確な値となるように第1の姿勢を補正することができる。
【0126】
また、第1補正処理においては、加速度ベクトルVa1が信頼できる場合ほど(加速度ベクトルVa1の大きさLと重力加速度の大きさとの差が小さいほど)、補正度Aの値が大きくなり、その結果、第1の姿勢は第2の姿勢により近づくように補正される。つまり、加速度ベクトルVa1が信頼できる場合ほど、補正量が大きくなり、補正後の第1の姿勢に第2の姿勢が強く反映されることとなる。このように、本実施形態によれば、加速度センサベクトルVa1の信頼度に応じて第1補正処理における補正量が決まるので、補正量を当該信頼度に応じて適切に決定することができ、ひいては入力装置8の姿勢をより正確に算出することができる。
【0127】
なお、本実施形態においては、上記ステップS18で算出される補正量ベクトルVgは、加速度ベクトルVa2の終点から重力方向ベクトルの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルであって、補正度Aの値が大きいほど重力方向ベクトルに近づくベクトルであった。ここで、他の実施形態において、補正度Aの算出方法によっては、補正量ベクトルVgは、重力方向ベクトルの終点と加速度ベクトルVa2の終点とを(1−A):Aに内分する点を終点とするベクトルであって、補正度Aの値が小さいほど重力方向ベクトルに近づくベクトルとしてもよい。このとき、上記ステップS20においては、上記補正量ベクトルVgを重力方向と一致するように回転させる回転行列を算出し、算出された回転行列を補正行列Maとすればよい。これによっても、本実施形態と同様に補正を行うことができる。
【0128】
次に、第1補正処理の第2の処理例について説明する。本実施形態においては、ゲーム装置3は、第1補正処理として上記第1の処理例を採用してもよいし、下記の第2の処理例を採用してもよい。
【0129】
上述のように、本実施形態では、加速度ベクトルの向きが鉛直下向きとなる場合における入力装置8の姿勢を第2の姿勢とし、第1の姿勢を第2の姿勢へと近づける補正を行っている(図8〜図10、図15)。つまり、第1の姿勢を第2の姿勢へと近づける(または一致させる)ために、加速度ベクトルと重力方向ベクトルとを近づける(一致させる)ように、第1の姿勢を回転させる補正を行っている。ここで、第1の姿勢を回転させる方法の一例として、図16および図17を参照して、加速度ベクトルを単純に回転させて重力方向ベクトルと一致させる方法、すなわち、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第1の姿勢を回転させる方法を考える。
【0130】
図16は、空間座標系における重力方向、加速度、および姿勢を表すベクトルを示す図である。図16においては、重力ベクトルG(=(0,−1,0))が重力方向(鉛直下方向)を表し、Z軸ベクトルM1Zは、入力装置8が第1の姿勢である場合における入力装置8のZ軸の向きを表し、加速度ベクトルVa(上記ベクトルVa2に相当)が入力装置8に加えられる加速度を表している。また、図17は、図16に示す状態から、加速度ベクトルVaを最短距離で回転させる方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させた状態を示す図である。図16に示す場合において、上記方法によって第1の姿勢(Z軸ベクトルM1Z)を回転させると、図17に示すように、Z軸ベクトルM1Zが補正前後において大きく変化する。このように、加速度ベクトルを単純に重力方向ベクトルと一致させる方法では、入力装置8の姿勢を表す所定軸(図16ではZ軸)が、補正前後において大きく変化してしまうことがある。
【0131】
入力装置8の姿勢を表す所定軸が補正前後において大きく変化することは、例えば、仮想空間内におけるオブジェクトの姿勢を入力装置8の姿勢に応じて制御する場合に問題となる。一例として、仮想のゲーム空間内における剣オブジェクトの姿勢を入力装置8の姿勢に応じて変化させることによって、入力装置8を振る操作によって剣オブジェクトを振ることを可能とするゲーム処理を考える。このようなゲーム処理において、例えば剣オブジェクトの長手方向が入力装置8のZ軸方向に対応しているとすると、入力装置8のZ軸が補正によって大きく変化することによって、剣オブジェクトの長手方向の向きが大きく変化することになる。このように、オブジェクトの長手方向が大きく変化すると、(たとえ補正後の姿勢が正確なものであったとしても)プレイヤは操作に違和感を感じてしまう。したがって、入力装置8の姿勢を表す軸のうち、オブジェクトの長手方向に対応する軸については、補正による変化をできるだけ小さくすることが好ましい。また、オブジェクトの長手方向に対応する軸でなくても、他の軸よりもプレイヤが注意を向ける軸(例えば、他の軸よりもゲーム上重要な意味を持つ軸)については、補正による変化をできるだけ小さくすることが好ましい。
【0132】
そこで、本実施形態の第1補正処理の第2の処理例では、入力装置8の姿勢を表す所定軸に関して、補正前後における変化ができるだけ小さくなるように、上記第1の姿勢の補正を行う。以下、図18−図21を参照して、第1補正処理の第2の処理例について説明する。なお、以下では、補正前後における変化をできるだけ小さくする上記所定軸が入力装置8のZ軸である場合を例として説明を行う。
【0133】
図18は、図14に示す第1補正処理(ステップS5)の第2の処理例の流れを示すフローチャートである。第1補正処理の第2の処理例においては、まずステップS11において、CPU10は、加速度センサ37によって検出された加速度の大きさLを算出する。ステップS30において、CPU10は、加速度センサ37によって検出された加速度の大きさがLと重力加速度の大きさ(ここでは1とする)との差を算出し、その差の大きさが所定値Kより小さいか否かを判定する。すなわち、加速度の大きさが重力加速度の大きさから大きく外れている場合には、少なくとも入力装置8の姿勢(加速度から推測される姿勢)が安定しておらず、加速度方向を重力加速度とみなすことが妥当でないと考えられるので、加速度の大きさが重力加速度の大きさに近いときだけ補正の処理を行うようにする。ステップS30を行う理由は第1の処理例におけるステップS15と同様の理由である。ステップS30の判定結果が肯定である場合、ステップS31の処理が実行される。一方、ステップS30の判定結果が否定である場合、以降のステップS31〜S37の処理がスキップされて、CPU10は第1補正処理を終了する。
【0134】
ステップS31において、CPU10は、投影加速度ベクトルVapを算出する。図19は、投影加速度ベクトルおよび投影重力ベクトル(後述)を示す図である。図19に示すように、投影加速度ベクトルVapは、空間座標系(xyz座標系)において、入力装置8のZ軸(Z軸ベクトルM1Z)に垂直な平面XYに対して、加速度ベクトルVaを投影したベクトルである。
【0135】
上記投影加速度ベクトルVapは、第1姿勢行列M1と、加速度センサ37によって検出された加速度ベクトル(加速度データ64により示される加速度ベクトル)Va1とを用いて算出することができる。具体的には、ステップS31においてCPU10は、メインメモリに記憶されている加速度データ64および第1姿勢データ68を読み出す。そして、加速度データ64により示される加速度ベクトルVa1および第1姿勢データ68により示される第1姿勢行列M1を用いて、次の式(8)に従って投影加速度ベクトルVap=(Vax,Vay,Vaz)を算出する。すなわち、加速度ベクトルVa1=(VX,VY,VZ)とし、第1姿勢行列M1の各要素を上式(1)に示す変数とし、投影加速度ベクトルVap=(Vax,Vay,Vaz)とすると、投影加速度ベクトルVapは次の式(8)に従って算出される。
Vax=Xx・VX+Yx・VY
Vay=Xy・VX+Yy・VY
Vaz=Xz・VX+Yz・VY …(8)
上式(8)は、コントローラ座標系(XYZ座標系)で表現される加速度ベクトルVa1のXY成分を、xyz座標系に変換する(第1姿勢行列M1で回転させる)処理を意味している。投影加速度ベクトルVapは、xyz座標系で表現される、XY平面上のベクトルである。したがって、投影加速度ベクトルVapは、上式(8)のとおり、加速度ベクトルVa1をからZ成分を除いたベクトル(VX,VY,0)を、xyz座標系に変換することによって得ることができる。CPU10は、上式(8)によって算出された投影加速度ベクトルVapを正規化し、正規化された投影加速度ベクトルVapを示すデータ(投影加速度データ)はメインメモリに記憶される。上記ステップS31の次にステップS32の処理が実行される。
【0136】
ステップS32において、CPU10は、投影重力ベクトルGpを算出する。図19に示すように、投影重力ベクトルGpは、空間座標系(xyz座標系)において、入力装置8のZ軸(Z軸ベクトルM1Z)に垂直な平面XYに対して、重力ベクトルGを投影したベクトルである。
【0137】
上記投影重力ベクトルGpは、上記投影加速度ベクトルVapと同様の方法で算出することができる。すなわち、投影重力ベクトルGpは、第1姿勢行列M1と、重力ベクトルとを用いて算出することができる。ここで、空間座標系(xyz座標系)における重力ベクトルG=(0,−1,0)は、コントローラ座標系(XYZ座標系)では(−Xy,−Yy,−Zy)と表すことができる。以上より、ステップS31においてCPU10は、メインメモリに記憶されている第1姿勢データ68を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1と、XYZ座標系における重力ベクトルG=(−Xy,−Yy,−Zy)とを用いて、次の式(9)に従って投影重力ベクトルGp=(Gx,Gy,Gz)を算出する。
Gx=−Xx・Xy−Yx・Yy
Gy=−Xy・Xy−Yy・Yy
Gz=−Xz・Xy−Yz・Yy …(9)
上式(8)と同様の考え方により、投影重力ベクトルVpは、XYZ座標系における重力ベクトルGからZ成分を除いたベクトルを、xyz座標系に変換することによって得ることができる。したがって、上式(9)のように、XYZ座標系で表現される重力ベクトルGのXY成分を、第1姿勢行列M1で回転させることによって、投影重力ベクトルVpを得ることができる。CPU10は、上式(9)によって算出された投影重力ベクトルGpを正規化し、正規化された投影重力ベクトルGpを示すデータ(投影重力データ)はメインメモリに記憶される。上記ステップS32の次にステップS33の処理が実行される。
【0138】
ステップS33において、CPU10は、第1の姿勢に対して第1の変換を行うための第1変換行列mtx1を算出する。第1変換行列mtx1は、投影加速度ベクトルVapを投影重力ベクトルGpと一致させるように、Z軸回りの回転を行う回転行列である(図19に示す矢印参照)。具体的には、CPU10は、メインメモリに記憶されている上記投影加速度データおよび上記投影重力データを読み出す。そして、投影加速度ベクトルVapを投影重力ベクトルGpと一致するように回転させる回転行列を算出し、算出された回転行列を第1変換行列mtx1とする。ステップS33で算出された第1変換行列mtx1を示すデータ(第1変換行列データ)はメインメモリに記憶される。上記ステップS33の次にステップS34の処理が実行される。
【0139】
ステップS34において、CPU10は、第1の姿勢を示す第1姿勢行列M1を第1変換行列mtx1で変換する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および上記第1変換行列データを読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該第1変換行列データにより示される第1変換行列mtx1によって変換する(第1姿勢行列M1に対して右側から第1変換行列mtx1を掛ける)。これによって、第1の姿勢に対して第1の変換が行われたこととなる。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS34の次にステップS35の処理が実行される。
【0140】
上記ステップS34によって、第1の姿勢に対して第1変換行列によって変換が行われたこととなる。図20は、図19に示す状態から第1の変換を行った状態を示す図である。ここで、第1変換行列による第1の変換はZ軸回りの回転であるので、図20に示されるように、入力装置8のZ軸を表すZ軸ベクトルM1Zは第1の変換によっては向きが変わらない。ただし、図20には示していないが、入力装置8のX軸およびY軸は第1の変換によってZ軸回りに回転しており、第1の姿勢は変化している。
【0141】
ステップS35において、CPU10は、上記ステップS34によって変換された後の入力装置8の姿勢に対応する(入力装置8に加えられる)加速度を示すように、加速度ベクトルVaを修正する。修正後の加速度ベクトルVa’は、上記ステップS34によって変換された後の第1の姿勢(第1姿勢行列M1)と、XYZ座標系における加速度ベクトルVa1とを用いて算出することができる。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および加速度データ64を読み出し、第1姿勢行列M1と加速度ベクトルVa1と用いて、次の式(10)に従って修正後の加速度ベクトルVa’=(Cx,Cy,Cz)を算出する。
Cx=Xx・VX+Yx・VY+Zx・VZ
Cy=Xy・VX+Yy・VY+Zy・VZ
Cz=Xz・VX+Yz・VY+Zz・VZ …(10)
上式(10)に示されるように、修正後の加速度ベクトルVa’は、XYZ座標系における加速度ベクトルVa1を、上記ステップS34によって変換された後の第1姿勢行列M1で回転させることによって得ることができる。なお、図20に示されるように、修正後の加速度ベクトルVa’は、xyz座標系における加速度ベクトルVa2を、上記第1変換行列mtx1で回転させたものである。つまり、修正後の加速度ベクトルVa’は、加速度ベクトルVa2と、上記第1変換行列mtx1とを用いて算出することも可能である。なお、第2の処理例では、加速度ベクトルVa2を算出する処理を省くために、加速度ベクトルVa1が用いられる上式(10)によってベクトルVa’を算出している。CPU10は、上式(10)で算出された加速度ベクトルVa’を正規化し、正規化された加速度ベクトルVa’を示すデータ(修正加速度データ)をメインメモリに記憶する。上記ステップS35の次にステップS36の処理が実行される。
【0142】
ステップS36において、CPU10は、第1の姿勢に対して第2の変換を行うための第2変換行列mtx2を算出する。図21は、図20に示す状態から第2の変換を行った状態を示す図である。第2変換行列mtx2は、ステップS35における修正後の加速度ベクトルVa’を重力ベクトルGと一致させるように回転を行う回転行列である(図20に示す矢印参照)。具体的には、CPU10は、メインメモリに記憶されている上記修正加速度データを読み出す。そして、修正後の加速度ベクトルVa’を重力ベクトルG=(0,−1,0)と一致するように回転させる回転行列を算出し、算出された回転行列を第2変換行列mtx2とする。ステップS36で算出された第2変換行列mtx2を示すデータ(第2変換行列データ)はメインメモリに記憶される。上記ステップS36の次にステップS37の処理が実行される。
【0143】
ステップS37において、CPU10は、第1の姿勢を示す第1姿勢行列M1を第2変換行列mtx2で変換する。具体的には、CPU10は、メインメモリに記憶されている第1姿勢データ68および上記第2変換行列データを読み出す。そして、当該第1姿勢データ68により示される第1姿勢行列M1を、当該第2変換行列データにより示される第2変換行列mtx2によって変換する(第1姿勢行列M1と第2変換行列mtx2との積を算出する)。これによって、第1の姿勢に対して第2の変換が行われたこととなる。このとき、図21に示されるように、Z軸ベクトルM1Zは第2の変換によって向きが変更される。CPU10は、変換後の第1姿勢行列M1を示すデータを、新たな第1姿勢データ68としてメインメモリに記憶する。上記ステップS37の後、CPU10は第1補正処理を終了する。
【0144】
以上のように、第1補正処理の第2の処理例によれば、まず、第1の姿勢に対して、Z軸に垂直な平面XYに加速度ベクトルVaを投影した方向(投影加速度ベクトルVap)と、当該平面XYに鉛直下方向(重力方向)を投影した方向(投影重力ベクトルGp)とを一致させるZ軸回りの回転を行う第1の変換によって変換される(ステップS34、図20)。そしてさらに、第1の姿勢に対して、上記第1の変換が行われた加速度ベクトル(加速度ベクトルVa’)の方向と鉛直下方向とを一致させる回転を行う第2の変換が行われる(ステップS37、図21)。このように、第1の変換を行ってから第2の変換を行うことによって、補正前後におけるZ軸の変化は最小となる。したがって、第2の処理例によれば、加速度ベクトルを単純に(最短距離で)回転させて重力方向ベクトルと一致させる方法(図17)に比べて、Z軸の変化を小さくすることができる。これによれば、入力装置8の姿勢によってオブジェクトの姿勢を操作する場合であって、例えば入力装置8のZ軸を仮想空間のオブジェクトの長手方向に対応させる場合において、第1補正処理による補正が行われてもオブジェクトの長手方向の向きがあまり変化しない。そのため、当該補正をプレイヤにとって目立ちにくくする(プレイヤが補正に気づきにくくする)ことができ、当該補正によってプレイヤが違和感を感じることを防止することができるので、その結果操作性の良いゲーム操作を提供することができる。
【0145】
なお、上記実施形態においては、CPU10は、第1の変換処理(ステップS34)と第2の変換処理(ステップS35)とを別々に実行したが、他の実施形態においては、第1および第2の変換処理をまとめて1回の処理で実行するようにしてもよい。すなわち、図18に示す処理において、CPU10は、ステップS34の処理を実行しない代わりに、ステップS37において、第1変換行列mtx1と第2変換行列mtx2とを合成し、合成した回転行列で第1の姿勢を回転させるようにしてもよい。この場合でも、第1の変換と第2の変換とからなる変換によって入力装置8の姿勢を補正することができ、上記実施形態と同様の効果を得ることができる。
【0146】
また、上記第2の処理例は、上記第1および第2の変換からなる変換によって、入力装置8の姿勢を表す所定軸(Z軸)に関して補正前後の向きの変化が最も小さくなるように、第1の姿勢を補正するものであった。ここで、他の実施形態においては、CPU10は、入力装置8の姿勢を表す所定軸に関して補正前後の向きの変化が最も小さくなるようにすればよく、例えば次の処理によって第1の姿勢を補正するようにしてもよい。すなわち、CPU10は、まず、加速度ベクトルを最短距離で回転させて重力方向ベクトルと一致させる回転行列を用いて第1の姿勢を回転させ(図17)、次に、補正前後で所定軸の向きの変化が最小となるように、鉛直下方向回りに第1の姿勢を回転させるようにしてもよい。これによっても、上記実施形態と同様の効果を得ることができる。
【0147】
また、上記第2の処理例においては、上記第1の処理例で用いた補正度Aを用いず、加速度ベクトルVaと重力ベクトルGとを一致させるように補正を行った。ここで、他の実施形態においては、第2の処理例においても補正度Aを用いるようにしてもよい。具体的には、ステップS33において、CPU10は、投影加速度ベクトルVapの終点から投影重力ベクトルGpの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルを算出し、投影加速度ベクトルVapを当該ベクトルと一致させるようにZ軸回りの回転を行う回転行列を上記第1変換行列として算出すればよい。また、ステップS36においては、修正後の加速度ベクトルVa’の終点から重力ベクトルGの終点までを結ぶ線分をA:(1−A)に内分する点を終点とするベクトルを算出し、加速度ベクトルVa’を当該ベクトルと一致させるように回転を行う回転行列を上記第2変換行列として算出すればよい。なお、第2の処理例において補正度Aを用いる場合、第1の変換による補正と第2の変換による補正とで補正度Aとして同じ値を用いてもよいし、異なる値を用いてもよい。
【0148】
また、上記第2の処理例においては、XY平面と加速度ベクトルVaとが垂直になる場合、または、XY平面と重力方向ベクトルGとが垂直になる場合、正しく補正が行われない可能性がある。投影加速度ベクトルVapまたは投影重力ベクトルGpが0になってしまうからである。したがって、上記の場合には、CPU10は、第2の処理例による補正を実行せずに、第1の補正処理を終了してもよい(つまり、第1の補正処理は実行されない)。あるいは、上記の場合には、CPU10は、上記第1の処理例による補正を実行するようにしてもよい。
【0149】
図14の説明に戻り、ステップS5の次のステップS6において、CPU10は、前述した第2補正処理を実行する。第2補正処理は、マーカ座標データを用いて第1の姿勢を補正する処理である。以下、図22を参照して、第2補正処理の詳細を説明する。
【0150】
図22は、図14に示す第2補正処理(ステップS6)の流れを示すフローチャートである。第1補正処理においては、まずステップS41において、CPU10は、入力装置8の撮像手段(撮像素子40)によってマーカ部6が撮像されているか否かを判定する。ステップS41の判定は、メインメモリに記憶されているマーカ座標データ65を参照することによって行うことができる。ここでは、マーカ座標データ65が2つのマーカ座標を示す場合、マーカ部6が撮像されていると判定し、マーカ座標データ65が1つのマーカ座標のみを示す場合、または、マーカ座標がないことを示す場合、マーカ部6が撮像されていないと判定する。ステップS41の判定結果が肯定である場合、以降のステップS42〜S47の処理が実行される。一方、ステップS41の判定結果が否定である場合、以降のステップS42〜S47の処理がスキップされ、CPU10は、第2補正処理を終了する。このように、撮像素子40によってマーカ部6が撮像されていない場合には、撮像素子40から得られるデータを用いて入力装置8の姿勢を算出することができないので、この場合には第2補正処理において補正は行われない。
【0151】
ステップS42において、CPU10は、マーカ座標データに基づいてロール姿勢成分M3rを算出する。ロール姿勢成分M3rは、撮像画像内でのマーカ部6の向きに基づいて、すなわち、マーカ座標データ65により示される2つのマーカ座標を結ぶ線の傾きに基づいて算出される。以下、図23を参照して、ロール姿勢成分M3rの算出方法の例を説明する。
【0152】
図23は、撮像画像に対応する2次元座標を示す図である。図23に示されるように、本実施形態においては、撮像画像における位置を表すための2次元座標系(x’y’座標系)は、撮像画像の範囲を−1≦x’≦1、−1≦y’≦1で表すものとする。x’y’座標系は、入力装置8が基準姿勢(入力装置8の撮像方向がマーカ部6の中央を向き、かつ、コントローラ5のボタン面が鉛直上向きとなる姿勢)にある場合に、撮像画像において鉛直下向きがy’軸正方向となり、右向きがx’軸正方向となるように設定されるものとする。また、図23に示す点P1および点P2はマーカ座標の位置を示し、点P3は点P1と点P2との中点である。図23に示すベクトルv10は、点P1を始点とし、点P2を終点とするベクトルである。
【0153】
ロール姿勢成分M3rを算出するために、CPU10はまず、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標から上記ベクトルv10を算出する。さらに、ベクトルv10を正規化したベクトル(hx,hy)を算出する。このベクトル(hx,hy)は、入力装置8が上記基準姿勢にある場合にx軸正方向を向き、入力装置8のロール方向の回転に応じて向きが変化する。ベクトル(hx,hy)がロール方向の姿勢に対応しているので、ロール姿勢成分M3rは、このベクトル(hx,hy)に基づいて算出することができる。具体的には、CPU10は、次の式(11)に従ってロール姿勢成分M3rを算出する。
【数2】
上式(11)によって算出された行列を示すデータは、ロール姿勢成分データ73としてメインメモリに記憶される。ステップS42の次にステップS43の処理が実行される。
【0154】
ステップS43において、CPU10は、マーカ座標データに基づいてヨー姿勢成分M3yを算出する。ヨー姿勢成分M3yは、撮像画像内でのマーカ部6の向きおよび位置に基づいて算出される。以下、図23を参照して、ヨー姿勢成分M3yの算出方法の例を説明する。
【0155】
まず、CPU10は、マーカ座標データ65を読み出し、当該マーカ座標データ65により示される2つのマーカ座標の中点を算出する。本実施形態では、マーカ部6の位置として当該中点の位置を用いる。さらに、CPU10は、算出された中点の座標を、x’y’座標系の原点を中心として、入力装置8のロール方向に関する回転角度だけ(入力装置8の回転方向とは逆方向に)回転させた座標(px,py)を算出する。換言すれば、中点の座標は、原点を中心として、上記ベクトル(hx,hy)がx軸正方向を向くように回転される。入力装置8が水平方向(x軸方向)に関してマーカ部6と同じ位置(すなわち、マーカ部6の正面の位置)にあるとすれば、上記のようにして得られた回転後の座標(px,py)から、ヨー方向に関する姿勢を算出することができる。
【0156】
次に、CPU10は、上記中点の回転後の座標(px,py)と、マーカ部6がx’軸方向の端に位置する場合のヨー方向の角度(限界角度)θy’とに基づいて、ヨー方向に関する回転角度θyを算出する。ここで、上記限界角度θy’と、上記限界角度θy1となる場合における上記中点の回転後のx座標値px’とは予め求めておくことができる。したがって、pxとpx’との比が、θyとθy’との比に等しくなることを用いて、ヨー方向に関する回転角度θyを算出することができる。具体的には、ヨー方向に関する回転角度θyは、次の式(12)によって算出することができる。
θy=px×θy’/px’ …(12)
なお、マーカ部6の水平方向の長さを無視する場合、上記限界角度θy’は、コントローラ5の画角の1/2とし、上記px’の値は“1”とすることができる。
【0157】
最後に、CPU10は、上式(12)により算出された角度θyの回転を行う回転行列をヨー姿勢成分M3yとして算出する。具体的には、ヨー姿勢成分M3yは次の式(13)によって算出される。
【数3】
上式(13)によって算出された行列を示すデータが、ヨー姿勢成分データ74としてメインメモリに記憶される。以上のステップS43の次にステップS44の処理が実行される。
【0158】
ステップS44において、CPU10は、ロール姿勢成分M3rとヨー姿勢成分M3yとを合成する。すなわち、メインメモリからロール姿勢成分データ73およびヨー姿勢成分データ74を読み出し、各データ73および74により示されるロール姿勢成分M3rとヨー姿勢成分M3yとを積算する。ステップS44の次にステップS45の処理が実行される。
【0159】
ステップS45において、CPU10は、第1の姿勢に基づいてピッチ姿勢成分M3pを算出する。なお、本実施形態の処理とは異なるが、ピッチ姿勢成分M3pについても、ヨー姿勢成分M3yと同様の方法で、上記座標(px,py)のy座標値に基づいて算出することが可能である。ただし、上記座標(px,py)を用いてヨー方向(ピッチ方向)の姿勢を算出する方法は、入力装置8が水平方向(ピッチ方向の場合は鉛直方向)に関してマーカ部6と同じ位置にあることを前提として成り立つ方法である。本実施形態のゲームシステム1においては、プレイヤは、水平方向に関してマーカ部6(テレビ2)のほぼ正面の位置で入力装置8を操作すると考えられるので、「入力装置8が水平方向に関してマーカ部6と同じ位置にある」ことを前提して、上記ステップS43の方法によってヨー方向の姿勢を算出することが可能である。一方、プレイヤは、立って入力装置8を操作することも座って入力装置8を操作することも考えられ、また、マーカ部6の位置もテレビ2の画面の上側に配置されることも下側に配置されることも考えられる。そのため、本実施形態のゲームシステム1においては、「入力装置8が鉛直方向に関してマーカ部6と同じ位置にある」ことを必ずしも前提にできないため、上記座標(px,py)を用いてピッチ方向の姿勢を算出することを行わないようにしてもよい。
【0160】
そこで、本実施形態においては、ピッチ姿勢成分M3pについては、第1の姿勢をそのまま用いることとする(したがって、第2補正処理においては、ピッチ方向に関しては補正が行われない)。具体的には、CPU10は、メインメモリから第1姿勢データ68を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1の各要素を用いて、ピッチ方向に関する回転角度θpを、次の式(14)に従って算出する。
cos(θp)=(Zx×Zx+Zz×Zz)1/2
sin(θp)=Zy …(14)
上式(14)における変数Zx,Zy,Zzは、上式(1)において示した第1姿勢行列M1の要素である。なお、ここで用いられる第1姿勢行列M1は、今回の処理ループにおいて第1補正処理が行われた後の第1姿勢行列M1である。さらに、CPU10は、上式(14)で算出したcos(θp)およびsin(θp)を用いて、次の式(15)に従ってピッチ姿勢成分M3pの行列を算出する。
【数4】
上式(15)によって算出された行列を示すデータが、ピッチ姿勢成分データ75としてメインメモリに記憶される。以上のステップS45の次にステップS46の処理が実行される。
【0161】
ステップS46において、CPU10は、ロール方向、ヨー方向、およびピッチ方向の各姿勢成分に基づいて第3の姿勢を算出する。第3の姿勢は、ロール姿勢成分M3rとヨー姿勢成分M3yとの合成結果に、ピッチ姿勢成分M3pをさらに合成することによって得られる。具体的には、CPU10は、メインメモリからピッチ姿勢成分データ75を読み出し、当該ピッチ姿勢成分データ75により示されるピッチ姿勢成分M3pを、ステップS44で算出された行列に積算する。算出された行列を示すデータは、第3姿勢データ76としてメインメモリに記憶される。ステップS46の次にステップS47の処理が実行される。
【0162】
ステップS47において、CPU10は、第3の姿勢を用いて第1の姿勢を補正する。ステップS47における補正は、第1姿勢行列M1を第3姿勢行列M3に所定の割合(下記の定数C2)で近づけることによって行われる。CPU10は、メインメモリから第1姿勢データ68および第3姿勢データ76を読み出す。そして、第1姿勢データ68により示される第1姿勢行列M1と、第3姿勢データ76により示される第3姿勢行列M3とを用いて、次の式(16)に従って補正を行う。
M1=(M3−M1’)×C2+M1’ …(16)
上式(16)において、変数M1’は補正前の第1姿勢行列である。また、定数C2は、0<C2≦1の範囲で予め設定され、例えば0.1に設定される。上式(16)によって算出された補正後の第1姿勢行列M1を示すデータが、新たな第1姿勢データ68としてメインメモリに記憶される。上記ステップS47の後、CPU10は第2補正処理を終了する。
【0163】
以上のように、第2補正処理においては、撮像画像(マーカ座標)から第3の姿勢を算出し、第1の姿勢を第3の姿勢に近づけるように補正することとした。この補正によって、より正確な値となるように第1の姿勢を補正することができる。なお、本実施形態においては、ロール方向およびヨー方向の姿勢についてのみ撮像画像から第3の姿勢を算出したが、上述のように、ピッチ方向についても撮像画像から第3の姿勢を算出することは可能であり、他の実施形態においては、ロール方向、ヨー方向、およびピッチ方向について撮像画像から第3の姿勢を算出してもよい。また、第2補正処理においては、ロール方向、ヨー方向、およびピッチ方向のうち少なくとも1方向について第3の姿勢を算出すればよい。特に、第1補正処理(ステップS7)において第2の処理例を採用する場合には、第2補正処理においては、ロール方向のみについて第3の姿勢を算出し、ロール方向にのみ第1の姿勢を補正(回転)するようにしてもよい。つまり、ヨー方向およびピッチ方向について補正を行うと、Z軸の向きが変化し、補正前後でのZ軸の向きの変化が大きくなってしまう可能性があるので、Z軸の向きをあまり変化させない目的で第2の処理例を採用する場合には、ロールに関する補正のみ行えばよい。
【0164】
図14の説明に戻り、ステップS6の次のステップS7において、CPU10は、補正後の第1の姿勢を用いたゲーム処理を実行する。このゲーム処理は、補正後の第1の姿勢を表す第1姿勢行列M1を入力値としてゲーム結果に反映させる処理であればどのような処理であってもよい。例えば、仮想のゲーム空間内のオブジェクトを、第1姿勢行列M1により示される姿勢となるように制御して表示する処理であってもよいし、第1姿勢行列M1により示される姿勢と所定の姿勢との角度に応じた速度で上記オブジェクトを移動させるように制御して表示する処理であってもよい。ステップS7の次にステップS8の処理が実行される。
【0165】
ステップS8において、CPU10は、ゲームを終了するか否かを判定する。ステップS8の判定は、例えば、ゲームがクリアされたか否か、ゲームオーバーとなったか否か、プレイヤがゲームを中止する指示を行ったか否か等によって行われる。ステップS8の判定結果が否定である場合、ステップS3の処理が再度実行される。以降、ステップS8でゲームを終了すると判定されるまで、ステップS3〜S8の処理ループが繰り返し実行される。一方、ステップS8の判定結果が肯定である場合、CPU10は、図14に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
【0166】
以上のように、本実施形態においては、ジャイロセンサ55および56によって検出された角速度から入力装置8の第1の姿勢を算出し(ステップS4)、第1の姿勢を第1補正処理(S5)および第2補正処理(S6)によって補正した。そして、補正後の第1の姿勢を用いてゲーム処理を実行する(ステップS7)ので、CPU10は、入力装置8の正確な姿勢に基づいたゲーム処理を実行することができる。これによれば、例えば、入力装置8の姿勢をゲーム空間内のオブジェクトの姿勢に対して正確に反映させることができるので、ゲーム操作の操作性を向上することができる。
【0167】
[変形例]
なお、上記実施形態においては、3軸回りの角速度を検出するジャイロセンサを用いて、3次元の姿勢を算出する場合を例として説明したが、図8〜図12にも示したように、2次元平面上における姿勢(回転角度)を算出する場合においても本発明を適用することが可能である。なお、2次元平面上における姿勢は、2軸回りの角速度を2軸ジャイロセンサで検出することによって算出してもよいし、所定の1軸回りの角速度を1軸ジャイロセンサで検出することによって算出してもよい。
【0168】
また、他の実施形態においては、第2補正処理は、入力装置8がマーカ部6を撮像していると推測される場合にのみ、実行されるようにしてもよい。具体的には、CPU10は、第2補正処理を実行する前に、入力装置8(撮像手段)がマーカ部6を撮像可能な向きを向いているか否かを判定する。この判定は、第1の姿勢あるいは第2の姿勢を用いて行うことができる。例えば、第1の姿勢(または第2の姿勢)が、入力装置8の撮像方向が入力装置8からマーカ部6への向きに対して同じ向きかそれとも逆向きかを判定するようにしてもよい。また、上記の判定に用いられる第1の姿勢は、前回の処理ループにおいて第1および第2補正処理が行われた第1の姿勢であってもよいし、今回の処理ループにおいて算出されて第1補正処理が行われた第1の姿勢であってもよい。
【0169】
上記の判定の結果、CPU10は、入力装置8がマーカ部6を撮像可能な向きを向いていると判定される場合、第2補正処理を実行し、マーカ部6を撮像可能な向きを向いていないと判定される場合、第2補正処理をスキップする。なお、マーカ部6でない物(例えば、部屋の電灯や窓の外の太陽光等)がマーカ部6と誤検出されることがあり、誤検出によって得られたマーカ座標を用いて第3の姿勢が算出される場合、かかる第3の姿勢を用いて第2補正処理を行っても正確に補正を行うことができない。これに対して、上記の判定処理を行うことにより、誤検出によって得られたマーカ座標から算出される第3の姿勢を用いて第2補正処理が行われることを防止することができる。これによって、第2補正処理をより正確に行うことができる。
【産業上の利用可能性】
【0170】
以上のように、本発明は、ジャイロセンサを用いて入力装置の姿勢を正確に算出すること等を目的として、例えば入力装置の姿勢に応じたゲーム処理を行うゲーム装置またはゲームプログラム等として利用することが可能である。
【符号の説明】
【0171】
1 ゲームシステム
2 テレビ
3 ゲーム装置
4 光ディスク
5 コントローラ
6 マーカ部
7 ジャイロセンサユニット
8 入力装置
10 CPU
11c GPU
11e 内部メインメモリ
12 外部メインメモリ
63 角速度データ
64 加速度データ
65 マーカ座標データ
68 第1姿勢データ
76 第3姿勢データ
【特許請求の範囲】
【請求項1】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置であって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第1補正手段とを備え、
前記第1補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出装置。
【請求項2】
前記第1補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第1の変換と、前記第1の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第2の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項1に記載の姿勢算出装置。
【請求項3】
前記第1補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項1または請求項2に記載の姿勢算出装置。
【請求項4】
前記第1補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項1から請求項3のいずれか1項に記載の姿勢算出装置。
【請求項5】
前記第1補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項1から請求項4のいずれか1項に記載の姿勢算出装置。
【請求項6】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第2補正手段をさらに備える、請求項1から請求項5のいずれか1項に記載の姿勢算出装置。
【請求項7】
前記第2補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項6に記載の姿勢算出装置。
【請求項8】
請求項1から請求項7のいずれか1項に記載の姿勢算出装置によって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲーム装置。
【請求項9】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置のコンピュータで実行される姿勢算出プログラムあって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第1補正手段として前記コンピュータを機能させ、
前記第1補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出プログラム。
【請求項10】
前記第1補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第1の変換と、前記第1の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第2の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項9に記載の姿勢算出プログラム。
【請求項11】
前記第1補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項9または請求項10に記載の姿勢算出プログラム。
【請求項12】
前記第1補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項9から請求項11のいずれか1項に記載の姿勢算出プログラム。
【請求項13】
前記第1補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項9から請求項12のいずれか1項に記載の姿勢算出プログラム。
【請求項14】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第2補正手段をさらに備える、請求項9から請求項13のいずれか1項に記載の姿勢算出プログラム。
【請求項15】
前記第2補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項14記載の姿勢算出プログラム。
【請求項16】
請求項9から請求項15のいずれか1項に記載の姿勢算出プログラムによって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲームプログラム。
【請求項1】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置であって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第1補正手段とを備え、
前記第1補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出装置。
【請求項2】
前記第1補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第1の変換と、前記第1の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第2の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項1に記載の姿勢算出装置。
【請求項3】
前記第1補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項1または請求項2に記載の姿勢算出装置。
【請求項4】
前記第1補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項1から請求項3のいずれか1項に記載の姿勢算出装置。
【請求項5】
前記第1補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項1から請求項4のいずれか1項に記載の姿勢算出装置。
【請求項6】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第2補正手段をさらに備える、請求項1から請求項5のいずれか1項に記載の姿勢算出装置。
【請求項7】
前記第2補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項6に記載の姿勢算出装置。
【請求項8】
請求項1から請求項7のいずれか1項に記載の姿勢算出装置によって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲーム装置。
【請求項9】
角速度センサと、加速度センサとを少なくとも備えた入力装置からデータを取得し、3次元の空間における当該入力装置の姿勢を算出する姿勢算出装置のコンピュータで実行される姿勢算出プログラムあって、
前記角速度センサが検出する角速度に基づいて前記入力装置の姿勢を算出する姿勢算出手段と、
前記加速度センサからの加速度データに基づいて前記入力装置の加速度を示す加速度ベクトルを算出する加速度ベクトル算出手段と、
前記空間における前記加速度ベクトルの方向と前記空間における鉛直下方向とを近づけるように前記入力装置の姿勢を補正する第1補正手段として前記コンピュータを機能させ、
前記第1補正手段は、前記入力装置の姿勢に関して、所定軸の補正前の向きと補正後の向きとの変化が最も小さくなるように、前記入力装置の姿勢を補正する、姿勢算出プログラム。
【請求項10】
前記第1補正手段は、前記所定軸に垂直な平面に前記加速度ベクトルを投影した方向と、当該平面に前記鉛直下方向を投影した方向とを近づけるように前記所定軸回りの回転を行う第1の変換と、前記第1の変換が行われた前記加速度ベクトルの方向と前記鉛直下方向とを近づける回転を行う第2の変換とからなる変換によって前記入力装置の姿勢を補正する、請求項9に記載の姿勢算出プログラム。
【請求項11】
前記第1補正手段は、前記加速度ベクトルの方向と前記鉛直下方向とが一致するように前記入力装置の姿勢を補正する、請求項9または請求項10に記載の姿勢算出プログラム。
【請求項12】
前記第1補正手段は、前記加速度ベクトルの大きさが重力加速度の大きさに近いほど、前記加速度ベクトルの方向と前記空間における鉛直下方向とが近づくように、前記入力装置の姿勢の補正量を制御する、請求項9から請求項11のいずれか1項に記載の姿勢算出プログラム。
【請求項13】
前記第1補正手段は、前記加速度ベクトルの大きさと重力加速度の大きさとの差が所定の基準より小さい場合にのみ前記入力装置の姿勢を補正する、請求項9から請求項12のいずれか1項に記載の姿勢算出プログラム。
【請求項14】
前記入力装置は、撮像手段をさらに備え、
前記撮像手段が撮像する所定の撮像対象の画像に基づいて、前記入力装置の姿勢をさらに補正する第2補正手段をさらに備える、請求項9から請求項13のいずれか1項に記載の姿勢算出プログラム。
【請求項15】
前記第2補正手段は、前記入力装置の姿勢に前記所定軸回りの回転を加えることによって前記入力装置の姿勢を補正する、請求項14記載の姿勢算出プログラム。
【請求項16】
請求項9から請求項15のいずれか1項に記載の姿勢算出プログラムによって補正された姿勢を前記入力装置の姿勢として用いてゲーム処理を行うゲームプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【公開番号】特開2010−207331(P2010−207331A)
【公開日】平成22年9月24日(2010.9.24)
【国際特許分類】
【出願番号】特願2009−54956(P2009−54956)
【出願日】平成21年3月9日(2009.3.9)
【出願人】(000233778)任天堂株式会社 (1,115)
【Fターム(参考)】
【公開日】平成22年9月24日(2010.9.24)
【国際特許分類】
【出願日】平成21年3月9日(2009.3.9)
【出願人】(000233778)任天堂株式会社 (1,115)
【Fターム(参考)】
[ Back to top ]