説明

情報処理プログラムおよび情報処理装置

【課題】入力装置自身の動きに応じて複雑なオブジェクトを動作させる。
【解決手段】オブジェクトは、互いに接続される複数のジョイント51〜55を有する。ゲーム装置は、オブジェクトの各ジョイントのうちでオブジェクトを基準としたときの位置が固定であるジョイントを基準ジョイントとし、当該基準ジョイントに接続される隣接ジョイントの当該基準ジョイントに対する向き(隣接ボーンの向き)を入力データに基づいて算出する。次に、ゲーム装置は、算出された向きに基づいて基準ジョイントに接続される隣接ジョイントの位置を移動させるとともに、基準ジョイントと隣接ジョイントとを除く他のジョイントを当該隣接ジョイントの移動に応じて移動させる。さらに、ゲーム装置は、移動後の各ジョイントの位置に基づいて形状が決められたオブジェクトを表示装置に表示させる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理プログラムおよび情報処理装置に関し、より特定的には、仮想空間内のオブジェクトに対して入力装置自身の動きに応じた動作を行わせる、情報処理プログラムおよび情報処理装置に関する。
【背景技術】
【0002】
従来より、入力装置自身を動かすことによって操作を行う情報処理システムが提案されている。例えば、特許文献1には、振動ジャイロを搭載した入力装置が開示されている。この入力装置では、リモートコマンダー(入力装置)が振られた方向を振動ジャイロから得られる角速度によって判別し、その判別結果に応じたコマンドが実行される。例えば、振動ジャイロから得られる角速度によってリモートコマンダーが上方向に振られたか、それとも下方向に振られたかを判別し、上方向に振られた場合には、画面内に表示されるカーソルを上方向に移動し、下方向に振られた場合にはカーソルを下方向に移動させる。これによれば、リモートコマンダーを移動させた方向にカーソルを移動させることができ、直感的な入力操作が可能となる。
【特許文献1】特開平6−50758号公報
【発明の開示】
【発明が解決しようとする課題】
【0003】
特許文献1に記載された技術では、例えばカーソルのような単純な構成のオブジェクトが動作対象である場合には動作を制御することは可能であるが、複数の部分で構成されるような複雑なオブジェクトが動作対象である場合には動作を制御することはできなかった。すなわち、入力装置の動きを示す値(角速度)は1種類であるのに対して制御対象(オブジェクトの各部分)は複数であるので、特許文献1に記載された技術をそのまま用いても複数の部分で構成されるオブジェクトの各部分を制御することはできなかった。
【0004】
それ故、本発明の目的は、入力装置自身の動きに応じて複雑なオブジェクトを動作させることが可能な情報処理プログラムおよび情報処理プログラムを提供することである。
【課題を解決するための手段】
【0005】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、本欄における括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【0006】
第1の発明は、入力装置(コントローラ5)の動きに応じて変化する入力値(加速度ベクトル)に基づいて仮想空間(ゲーム空間)内におけるオブジェクト(プレイヤオブジェクト50)を動作させる情報処理装置(ゲーム装置3)のコンピュータ(CPU10)に実行させる情報処理プログラム(ゲームプログラム60)である。オブジェクトは、互いに接続される複数の接続点(ジョイント)を有し、当該接続点の位置関係に基づいて当該オブジェクトの形状が決定される。情報処理プログラムは、入力データ取得ステップ(S3)と、向き算出ステップ(S4,S5,およびS11)と、接続点移動ステップ(S14)と、表示ステップ(S8)とをコンピュータに実行させる。入力データ取得ステップにおいて、コンピュータは、入力値を示す入力データ(加速度データ)を取得する。向き算出ステップにおいて、コンピュータは、オブジェクトの各接続点のうち所定の1つの接続点を基準点(基準ジョイント)とし、当該基準点に接続される隣接接続点(隣接ジョイント)の当該基準点に対する向き(隣接ボーンの向き)を入力データに基づいて算出する。接続点移動ステップにおいて、コンピュータは、向き算出ステップにおいて算出された向きに基づいて基準点を除く他の接続点の位置を移動させる。表示ステップにおいて、コンピュータは、接続点移動ステップにおける移動後の各接続点の位置関係に基づいて形状が決められたオブジェクトを表示装置(テレビ2)に表示させる。
【0007】
第2の発明においては、接続点移動ステップにおいて、コンピュータは、基準点と隣接接続点とを除く他の接続点について、基準点に近い接続点から順に移動後の位置を算出してもよい。
【0008】
第3の発明においては、向き算出ステップは、動き算出ステップ(S4およびS5)と、算出実行ステップ(S11)とを含んでいてもよい。動き算出ステップにおいて、コンピュータは、入力装置の動きを示す動きデータ(65)を入力データに基づいて算出する。算出実行ステップにおいて、コンピュータは、隣接接続点の基準点に対する向きを動きデータに基づいて算出する。
【0009】
第4の発明においては、入力データ取得ステップにおいて、コンピュータは、入力装置が備える加速度センサから出力される加速度データを入力データとして取得する。
【0010】
第5の発明においては、動き算出ステップは、平滑化ステップ(S4)と、差分算出ステップ(S5)とを含んでいてもよい。平滑化ステップにおいて、コンピュータは、入力データ取得ステップで取得された加速度データの値を平滑化した値を示す平滑化データ(追従加速度データ64)を算出する。差分算出ステップにおいて、コンピュータは、入力データ取得ステップで取得した加速度データの値と平滑化データの値との差分を示すデータを動きデータとして算出する。
【0011】
第6の発明においては、加速度センサは、所定の1軸方向に関する入力装置の加速度を検出してもよい。このとき、動き算出ステップにおいて、コンピュータは、所定の1軸方向に関する入力装置の動きを示す動きデータを算出する。
【0012】
第7の発明においては、隣接接続点の基準点に対する基準の向きは予め定められていてもよい。このとき、動き算出ステップにおいて、コンピュータは、所定の方向(X軸方向)に関する入力装置の動きを示す動きデータを算出する。算出実行ステップにおいて、コンピュータは、隣接接続点の基準点に対する向きが基準の向きに対していずれの方向に変化しているかを、動きデータにより示される動きが所定の方向に関して正方向であるか負方向であるかに応じて決定する。
【0013】
第8の発明においては、情報処理プログラムは、接続点移動ステップにおける各接続点の移動量(ジョイント速度)に基づいてオブジェクトを移動させるオブジェクト移動ステップ(S34)をコンピュータにさらに実行させてもよい。
【0014】
第9の発明においては、情報処理プログラムは、基準点を除く各接続点のうちの端の接続点(第5ジョイント55)と当該端の接続点に接続される接続点(第4ジョイント54)とを結ぶ線の方向(第4ボーン59の方向)に基づいて、オブジェクトの方向を変更する方向変更ステップ(S35)をコンピュータにさらに実行させてもよい。
【0015】
また、本発明は、上記第1〜第9の発明における各ステップを実行する情報処理装置と同等の機能を有する情報処理装置の形態で提供されてもよい。
【発明の効果】
【0016】
第1の発明によれば、隣接接続点の基準点に対する向きが入力装置の動きに応じて変化し、当該向きの変化に応じて他の接続点が移動されるので、複数の接続点を有するような複雑なオブジェクトを入力装置自身の動きに応じて動作させることができる。したがって、入力装置の動きによって複数の部分からなるオブジェクトを操作するという、今までにない操作をプレイヤに提供することができる。
【0017】
第2の発明によれば、すでに位置が決まっている接続点に基づいて、まだ位置が決まっていない接続点の位置を順次算出するので、各接続点の移動後の位置を容易に算出することができる。
【0018】
第3の発明によれば、入力装置の動きに応じて隣接接続点の基準点に対する向きを変更することができる。さらに、第7の発明によれば、入力装置を動かす方向に応じて上記向きが基準に対して変化する方向が決まる。これによれば、例えば、入力装置を左右方向に振る操作によって、オブジェクトが身体を所定方向に振り動かすような動作を行わせることができる。
【0019】
第4の発明によれば、加速度センサを用いることによって、入力装置の動きを容易に算出することができる。さらに、第5の発明によれば、加速度センサによって検出された加速度と、当該加速度を平滑化した値との差分を算出することによって、入力装置の動きをより正確に算出することができる。また、第6の発明によれば、簡易な構成で入力装置の動きを算出することができる。
【0020】
第8の発明によれば、接続点移動ステップにおける各接続点の移動量に基づいてオブジェクトが移動する。ここで、向き算出ステップにおいて算出される向きに応じてオブジェクトが移動する場合には、入力操作によって決められるオブジェクトの向きに基づいて、オブジェクトの動作(各接続点の移動)およびオブジェクトの移動の両方が決められることになる。そのため、入力操作に応じてオブジェクトが動作するとともに、入力操作に応じてオブジェクトが移動することとなる。ここで、オブジェクトは、オブジェクトが動作した結果に基づいて移動する方がより自然であるが、上記の場合、オブジェクトが動作した結果、オブジェクトが移動することをリアルに表現することができない。これに対して、第8の発明によれば、入力装置の動きが各接続点の移動量(オブジェクトの動作)に反映された後、当該移動量がオブジェクトの移動に反映されるので、「オブジェクトが動作した結果、オブジェクトが移動する」ことをよりリアルに表現することができる。
【0021】
第9の発明によれば、オブジェクトの方向は、端の接続点と当該端の接続点に接続される接続点とを結ぶ線の方向に基づいて決められる。これによれば、入力操作に応じてオブジェクトの動作が決められ、オブジェクトの動作に応じてオブジェクトの方向が変化されるので、オブジェクトが動作した(接続点が移動した)結果、オブジェクトの方向が変化する様子をリアルに表現することができる。
【発明を実施するための最良の形態】
【0022】
(ゲームシステムの全体構成)
図1を参照して、本発明の一実施形態に係る情報処理装置の一例として、ゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、コントローラ5、およびマーカ部6を含む。本システムは、コントローラ5を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
【0023】
本発明に係る情報処理装置の一例であるゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【0024】
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
【0025】
コントローラ5は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与える入力装置である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
【0026】
(ゲーム装置3の内部構成)
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
【0027】
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に読み出したデータを書き込む。
【0028】
また、システムLSI11には、入出力プロセッサ11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRAM11d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
【0029】
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
【0030】
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
【0031】
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
【0032】
入出力プロセッサ(I/Oプロセッサ)11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
【0033】
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
【0034】
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
【0035】
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
【0036】
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
【0037】
(コントローラ5の構成)
次に、図3〜図6を参照して、コントローラ5について説明する。図3および図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
【0038】
図3および図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、および、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
【0039】
ハウジング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を誤って押下することを防止することができる。
【0040】
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、他のコントローラ)を接続するために利用される。
【0041】
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
【0042】
また、コントローラ5は撮像情報演算部35(図5B)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6Rおよび6Lからの赤外光を少なくとも透過する材質で構成される。
【0043】
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5A)からの音を外部に放出するための音抜き孔31aが形成されている。
【0044】
次に、図5Aおよび図5Bを参照して、コントローラ5の内部構造について説明する。図5Aおよび図5Bは、コントローラ5の内部構造を示す図である。なお、図5Aは、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図5Bは、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図5Bに示す斜視図は、図5Aに示す基板30を裏面から見た斜視図となっている。
【0045】
図5Aにおいて、ハウジング31の内部には基板30が固設されており、当該基板30の上主面上に各操作ボタン32a〜32h、各LED34a〜34d、加速度センサ37、アンテナ45、およびスピーカ49等が設けられる。これらは、基板30等に形成された配線(図示せず)によってマイクロコンピュータ(Micro Computer:マイコン)42(図5B参照)に接続される。本実施形態では、加速度センサ37は、X軸方向に関してコントローラ5の中心からずれた位置に配置されている。これによって、コントローラ5をZ軸回りに回転させたときのコントローラ5の動きが算出しやすくなる。また、加速度センサ37は、長手方向(Z軸方向)に関してコントローラ5の中心よりも前方に配置されている。また、無線モジュール44(図6)およびアンテナ45によって、コントローラ5がワイヤレスコントローラとして機能する。
【0046】
一方、図5Bにおいて、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
【0047】
さらに、基板30の下主面上には、上記マイコン42およびバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5Aおよび図5Bに示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
【0048】
なお、図3〜図5A、図5Bに示したコントローラ5の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
【0049】
図6は、コントローラ5の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、および加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
【0050】
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
【0051】
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
【0052】
撮像情報演算部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の向きや位置を算出することができる。
【0053】
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸または2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
【0054】
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、コントローラ5を基準に設定されるXYZ座標系における3次元のベクトル(AX,AY,AZ)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
【0055】
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(姿勢)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データに基づいてコントローラ5の姿勢を判断する。
【0056】
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の姿勢を判断するためのデータを出力するセンサとして用いられる。
【0057】
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)またはコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かだけで傾いているか否かを知ることができるし、その大きさによってどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾き角度を算出してもよいし、当該傾き角度を算出せずに、コントローラ5の傾き方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾きまたは姿勢を判定することができる。
【0058】
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
【0059】
なお、本実施形態では、コントローラの動きに応じて変化する値を出力するセンサとして、例えば静電容量式の加速度センサを用いることとしたが、他の方式の加速度センサやジャイロセンサを用いるようにしてもよい。ただし、加速度センサは各軸に沿った直線方向の加速度をそれぞれ検出するものであるのに対して、ジャイロセンサは回転に伴う角速度を検出するものである。つまり、加速度センサに代えてジャイロセンサを採用する場合には、検出される信号の性質が異なるため、両者を簡単に置き換えることはできない。そこで、加速度センサの代わりにジャイロセンサを用いて姿勢を算出する場合には、例えば次のような変更を行う。具体的には、ゲーム装置3は、検出開始の状態において姿勢の値を初期化する。そして、当該ジャイロセンサから出力される角速度のデータを積分する。さらに、積分結果を用いて、初期化された姿勢の値からの姿勢の変化量を算出する。この場合、算出される姿勢は、角度で表されることになる。
【0060】
なお、既に説明したように、加速度センサによって姿勢を算出する場合には、加速度ベクトルを用いて姿勢を算出する。したがって、算出される姿勢はベクトルで表すことが可能であり、初期化を行わずとも絶対的な方向を算出することが可能である点で、加速度センサを用いる場合とジャイロセンサを用いる場合とで異なる。また、姿勢として算出される値の性質についても上記のように角度であるかベクトルであるかの違いがあるので、加速度センサからジャイロセンサへの置き換えを行う際には当該姿勢のデータに対しても所定の変換を行う必要がある。
【0061】
通信部36は、マイコン42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。
【0062】
操作部32、撮像情報演算部35、および加速度センサ37からマイコン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へ出力する。
【0063】
上記コントローラ5を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ5によって画面上の任意の位置を指示する操作、および、コントローラ5自体を動かす操作を行うことができる。図7は、コントローラ5を用いてゲーム操作を行うときの様子を示す図解図である。本実施形態では、プレイヤは、コントローラ5の上面(十字ボタン32a等が設けられた面)を略鉛直上向きとした姿勢でコントローラ5を把持する。そして、図7に示すように、コントローラ5を左右方向(コントローラ5のX軸方向)に動かす(振る)ゲーム操作を行う。
【0064】
(ゲーム処理の概要)
次に、図8および図9を参照して、ゲーム装置3において実行されるゲーム処理の概要を説明する。以下では、3次元の仮想空間(ゲーム空間)内に配置されたオブジェクトをコントローラ5の動きに応じて動作させる処理について主に説明する。本実施形態においてプレイヤによる操作対象となるオブジェクト(プレイヤオブジェクト)は、複数の部分からなる構成であり、具体的には、複数のジョイント(接続点)を有する構成である。つまり、本実施形態に係るゲーム装置3は、複数の部分によって構成されるプレイヤオブジェクトをコントローラ5を動かすゲーム操作に応じて動作させるものである。
【0065】
図8は、本実施形態において操作対象となるプレイヤオブジェクトの構成を示す図である。本実施形態においては、操作対象のプレイヤオブジェクト50は、図8に示すように、魚を模した外観のプレイヤオブジェクトである。プレイヤオブジェクト50は、先頭から順に第1ジョイント51、第2ジョイント52、第3ジョイント53、第4ジョイント54、および第5ジョイント55という5つのジョイントを有する。ジョイント同士は、ボーンによって接続される。本実施形態では、5つのジョイント51〜55は一列に接続されている。すなわち、第1ジョイント51と第2ジョイント52とは第1ボーン56によって接続され、第2ジョイント52と第3ジョイント53とは第2ボーン57によって接続され、第3ジョイント53と第4ジョイント54とは第3ボーン58によって接続され、第4ジョイント54と第5ジョイント55とは第4ボーン59によって接続される。本実施形態では、各ボーン56〜59の長さは一定である。また、プレイヤオブジェクト50を構成するポリゴン(スキン)の頂点の位置は、各ジョイント51〜55の位置によって決められる。つまり、プレイヤオブジェクト50の形状は、各ジョイント51〜55の位置関係によって決められる。
【0066】
また、本実施形態では、図8に示すように、各ボーン56〜59が一直線に配置されるような各ジョイント51〜55の接続関係を基準の位置関係とする。詳細は後述するが、コントローラ5に対する入力が行われない状態が続いた場合、各ジョイント51〜55の位置関係は上記基準の位置関係に収束する。また、本実施形態では、プレイヤオブジェクト50は3次元空間における所定の平面内において移動し、プレイヤオブジェクト50の各ジョイント51〜55は当該平面内で移動するものとする。
【0067】
なお、本実施形態では、プレイヤオブジェクトは、一列に並んで接続される5つのジョイントにより構成されるものとするが、プレイヤオブジェクトを構成するジョイントの数および接続関係はどのようなものであっても構わない。
【0068】
図9は、コントローラ5に対して操作が加えられた時のプレイヤオブジェクトを示す図である。本実施形態においては、ゲーム装置3は、加速度センサ37からの出力(加速度ベクトル)に基づいて、コントローラ5の動きを示す動き量を算出する。そして、当該動き量を用いてプレイヤオブジェクト50の動作を制御する。なお、本実施形態では、ゲーム装置3は、コントローラ5のx軸方向に関する動き量を算出する。つまり、ゲーム装置3は、コントローラ5を左右に動かす動きの量を算出する。動き量の詳細な算出方法については後述する。
【0069】
図9に示されるように、ゲーム装置3は、動き量に基づいて第1ボーン56の向き、すなわち、第1ジョイント51に対する第2ジョイント52の向きを決定する。つまり、本実施形態では、コントローラ5の左右の動きに応じて第1ボーン56の向きが変化する(図9に示す矢印参照)。また、プレイヤオブジェクト50を基準として見た場合、第1ジョイント51は入力の影響を受けずに固定されている。つまり、入力である動き量は第1ジョイント51の位置に対して反映されない。
【0070】
以下では、第1ジョイント51のように、コントローラ5の入力の影響を受けずに位置が決定されるジョイントを「基準ジョイント」と呼ぶ。基準ジョイントは、ボーンの向きおよび他のジョイントの位置を決める基準となるジョイントである。本実施形態では、先頭のジョイントである第1ジョイント51を基準ジョイントとするが、基準ジョイントは必ずしも先頭のジョイントである必要はない。また、以下では、第1ボーン56のように、基準ジョイントに隣接するボーンを「隣接ボーン」と呼ぶ。隣接ボーンは、コントローラ5の入力によって向きが直接決められるボーンである。さらに、第2ジョイント52のように、基準ジョイントに隣接するジョイントを「隣接ジョイント」と呼ぶ。隣接ジョイントは、コントローラ5の入力によって基準ボーンに対する向きが決められるジョイントである。
【0071】
上記のようにコントローラ5の動きに応じて基準ボーン(第1ボーン56)の向きが決められると、基準ボーンの向きに基づいて隣接ジョイントが移動され、さらに、隣接ジョイントの移動に応じて他のジョイントが移動される。具体的には、基準ボーンよりも後ろ側のジョイントの位置およびボーンの向きが、先頭側(基準ジョイントがある側)のジョイントの位置およびボーンの向きに基づいて決められる。すなわち、第1ボーン56の向きが決まると、ゲーム装置3は、第1ジョイント51の位置および第1ボーン56の向きから第2ジョイント52の位置を算出する。第2ジョイント52の位置を算出すると、次に、ゲーム装置3は第2ボーン57の向きを算出する。ここで、基準ジョイントを基準に第1ボーン56よりも後側のボーン(第2〜第4ボーン57〜59)の向きは、当該ボーンよりも1つ基準ジョイント側にあるボーンの向きに近づくように決定される。換言すれば、ボーンの向きは、1つ基準ジョイント側に位置するボーンの向きに追従するように変化する。例えば、第2ボーン57の向きは、第1ボーン56の向きに近づくように、すなわち、第1ボーン56と第2ボーン57とが平行に近づくように決定される。
【0072】
上記のように第2ジョイント52の位置および第2ボーン57の向きが決定された後、第3ジョイント53から後側のジョイントおよびボーンについても、第2ジョイント52および第2ボーン57と同様にジョイントの位置およびボーンの向きが決定される。すなわち、ゲーム装置3はジョイントの位置とボーンの向きとを、後端のジョイントである第5ジョイント55まで順に算出していく。第5ジョイント55の位置が算出されたことによって、すべてのジョイントの位置が決定されたこととなり、プレイヤオブジェクト50の姿勢(形状)が決められたこととなる。つまり、プレイヤオブジェクト50を構成する各ポリゴンの頂点の位置が各ジョイント51〜55の位置を基準にして決められる。
【0073】
以上より、本実施形態においては、コントローラ5を左右に動かす(振る)ことに応じて、プレイヤオブジェクト50の前部分(第1ジョイント51および第1ボーン56)が左右に振られることとなる。そして、当該前部分から後側の部分については、前部分の振りに追従するように移動することとなる。したがって、本実施形態においては、魚を模したプレイヤオブジェクト50を、コントローラ5の左右の動きに応じて身体を左右に振る(くねらす)ように動作させることができ、魚が泳いでいる動作をリアルに表現することができる。また、プレイヤは、コントローラ5を左右に動かすことによって魚に泳ぐ動作を行わせるという、今までにないゲーム操作を行うことができる。
【0074】
また、本実施形態においては、ゲーム装置3は、プレイヤオブジェクト50の姿勢が決定された後、ゲーム空間においてプレイヤオブジェクト50を移動させる。詳細は後述するが、プレイヤオブジェクト50の位置は、各ジョイントの移動量(速度)に基づいて算出される。したがって、本実施形態においては、プレイヤオブジェクト50の移動に対してコントローラ5の入力(すなわち、動き量)が直接反映されるのではなく、コントローラ5の入力から決められる各ジョイントの速度が反映される。ここで、コントローラ5の入力が反映されるのはプレイヤオブジェクト50の先端部分(頭の部分)であるので、プレイヤオブジェクト50の移動に対してコントローラ5の入力を直接反映させるようにすると、頭の振りに応じて魚が移動するような表現になってしまい、魚が泳ぐ様子を自然に表現することができない。これに対して、本実施形態では、コントローラ5の入力が各ジョイントの位置を介して間接的にプレイヤオブジェクトの移動に反映されるので、身体の振りに応じて魚が移動するように表現することができ、魚が泳ぐ様子を自然に表現することができる。
【0075】
また、本実施形態においては、ゲーム装置3は、プレイヤオブジェクト50の姿勢が決定された後、ゲーム空間におけるプレイヤオブジェクト50全体の向きを算出する。詳細は後述するが、プレイヤオブジェクト全体の向きは、後端のボーン(ここでは、第4ボーン59)の向きによって決められる。ここで、コントローラ5の入力が反映されるのはプレイヤオブジェクト50の先端部分であるので、コントローラ5の入力をプレイヤオブジェクト50の向きに直接反映させるようにすると、頭の向きに応じて魚の向きが変化するような表現になってしまい、魚が泳ぐ様子を自然に表現することができない。これに対して、本実施形態では、コントローラ5の入力が各ジョイントの位置および各ボーンの向きを介して間接的にプレイヤオブジェクトの向きに反映されるので、身体の振りに応じて魚が向きを変えるように表現することができ、魚が泳ぐ様子を自然に表現することができる。
【0076】
(ゲーム処理の詳細)
次に、ゲーム装置3において実行される処理の詳細について説明する。まず、ゲーム装置3における処理において用いられる主なデータについて図10〜図12を用いて説明する。図10は、ゲーム装置3のメインメモリ(外部メインメモリ12または内部メインメモリ11e)に記憶される主なデータを示す図である。図10に示すように、ゲーム装置3の記憶装置には、ゲームプログラム60、操作データ61、およびゲーム処理用データ63が記憶される。なお、メインメモリには、図10に示すデータの他、ゲームに登場する各種オブジェクトの画像データや、オブジェクトの各種パラメータを示すデータ等、ゲーム処理に必要なデータが記憶される。
【0077】
ゲームプログラム60は、ゲーム装置3に電源が投入された後の適宜のタイミングで光ディスク4からその一部または全部が読み込まれてメインメモリに記憶される。ゲームプログラム60には、コントローラ5の動きに応じてプレイヤオブジェクトを動作させるためのプログラムが含まれている。
【0078】
操作データ61は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、メインメモリに記憶される操作データはこの割合で更新される。メインメモリには、最新の(最後に取得された)操作データのみが記憶されればよい。
【0079】
操作データ61には、加速度データ62が含まれる。加速度データ62は、加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータである。ここでは、加速度データ62は、図3に示すXYZの3軸の方向に関する加速度を各成分とする3次元の加速度ベクトルA=(AX,AY,AZ)を示すデータである。また、操作データ61には、加速度データ62の他、各操作ボタン32a〜32iに対する入力状態を示す操作ボタンデータ、および、上記マーカ座標を示すマーカ座標データが含まれている。
【0080】
ゲーム処理用データ63は、後述するゲーム処理(図13)において用いられるデータである。ゲーム処理用データ63は、追従加速度データ64、動きデータ65、オブジェクト位置データ66、オブジェクト方向データ67、オブジェクト速度データ68、オブジェクト推進力データ69、現在ジョイント位置データ70、前回ジョイント位置データ71、ジョイント速度データ72、ジョイント推進力データ73、角度データ74、角速度データ75、および、ボーン方向データ76を含む。
【0081】
追従加速度データ64は、追従加速度Afの値を示すデータである。追従加速度Afとは、加速度センサ37によって検出された加速度ベクトルに追従して変化する加速度である。換言すれば、追従加速度は、加速度センサ37によって逐次検出された加速度を平滑化した値である。追従加速度Afの算出方法の詳細については後述する。本実施形態では、追従加速度Afは、加速度ベクトルの各成分うちX軸成分の加速度AXに追従して変化する加速度である。
【0082】
動きデータ65は、コントローラ5の動きを表す動き量Mの値を示すデータである。具体的には、動き量Mは、上記加速度ベクトルのX軸成分AXから追従加速度Afを引いた差として算出される(後述する式(2)参照)。
【0083】
オブジェクト位置データ66は、ゲーム空間におけるプレイヤオブジェクトの位置(オブジェクト位置)POSの値を示す。また、オブジェクト位置POSは、プレイヤオブジェクトの所定位置の、ゲーム空間における位置である。この所定位置は、例えば上記基準ジョイントである第1ジョイント51の位置であってもよいし、プレイヤオブジェクトの中心位置であってもよい。
【0084】
オブジェクト方向データ67は、ゲーム空間におけるプレイヤオブジェクトの向きを表す2つのベクトルFおよびLの値をそれぞれ示す。前方向ベクトルFはプレイヤオブジェクトの前方を向く単位ベクトルであり、左方向ベクトルLはプレイヤオブジェクトの左方を向く単位ベクトルである。
【0085】
オブジェクト速度データ68は、プレイヤオブジェクトの速度(オブジェクト速度)VEL、すなわち、位置POSの単位時間(1フレーム時間)あたりの変化量の値を示す。詳細は後述するが、オブジェクト速度VELは、後述するオブジェクト推進力POWに基づいて算出される。本実施形態では、オブジェクト推進力POWに基づいてオブジェクト速度VELが算出され、当該速度VELに基づいて新たなオブジェクト位置POSが算出される。
【0086】
オブジェクト推進力データ69は、プレイヤオブジェクトの推進力(オブジェクト推進力)POWの値を示すデータである。ここで、オブジェクト推進力POWとは、オブジェクト速度VELを算出するための変数であり、プレイヤオブジェクトの各ジョイントの推進量(後述するジョイント推進力pow[i])に基づいて算出される。
【0087】
ここで、本実施形態では、プレイヤオブジェクトは、3次元のゲーム空間における所定の平面上において移動および回転を行うものとする。また、上記オブジェクト位置POS、前方向ベクトルF、左方向ベクトルF、オブジェクト速度VEL、およびオブジェクト推進力POWの各変数は、上記平面上における位置を表すための2次元のx’y’座標系によって表されるものとする。一方、後述する、ジョイントおよびボーンに関する各変数(ジョイント位置pos、ジョイント速度vel、ジョイント推進力pow、水平方向ベクトルh、垂直方向ベクトルv)は、上記平面上においてプレイヤオブジェクトを基準に設定されるxy座標系(図11参照)によって表されるものとする。このxy座標系は、プレイヤオブジェクトの所定位置(例えばオブジェクト位置POS)がxy座標系の原点となるように設定される。また、xy座標系は、x’y’座標系においてプレイヤオブジェクトの方向に応じて回転するように設定される。例えば、xy座標系は、y軸正方向がプレイヤオブジェクトの前方の向き、すなわち、ベクトルFの向きとなるように設定される。
【0088】
現在ジョイント位置データ70は、プレイヤオブジェクトの各ジョイントの現在の位置の値をそれぞれ示すデータである。図11は、プレイヤオブジェクトのジョイントおよびボーンに関する各変数を示す図である。本実施形態では、図11に示すように、オブジェクトが有するジョイントをN個(本実施形態ではN=5)としたときにおける、第iジョイント(iは0≦i≦Nの整数)の位置を“pos[i]”と表す。また、基準ジョイントである第1ジョイントの位置pos[0]は、上記xy座標系における固定値であり、予め定められた値に設定される。
【0089】
前回ジョイント位置データ71は、前回における上記各ジョイントの位置pos[i](iは0≦i≦Nの整数)の値をそれぞれ示すデータであり、“pos’[i]”と表す。ここでは、1フレーム時間毎に各ジョイントの位置が更新されるので、前回ジョイント位置データ71は、1フレーム前における各ジョイントの位置pos[i]の値をそれぞれ示す。
【0090】
ジョイント速度データ72は、上記各ジョイントの速度(移動量)vel[i](iは0≦i≦Nの整数)の値をそれぞれ示すデータである。具体的には、ジョイントの速度vel[i]は、現在の当該ジョイントの位置pos[i]から前回の当該ジョイントの位置pos’[i]を引いた差として算出される。
【0091】
ジョイント推進力データ73は、上記各ジョイントの移動により発生される推進力pow[i](iは0≦i≦Nの整数)の値をそれぞれ示すデータである。ジョイントの推進力pow[i]は、ジョイントの速度vel[i]に基づいて算出される。また、ジョイントの推進力pow[i]は、上記オブジェクト推進力POWを算出するために用いられる。
【0092】
角度データ74は、プレイヤオブジェクトの各ボーンの向き(角度)deg[i](iは0≦i≦N−1の整数)をそれぞれ示すデータである。図11に示すように、第iボーンの角度deg[i](°)は、プレイヤオブジェクトを基準に決められる所定方向(ここでは、xy座標系におけるy軸負方向)と、第iジョイントから第(i+1)ジョイントへの方向とのなす角度として表される。ここでは、角度deg[i]は、−180°≦deg[i]<180°の範囲で表されるものとし、y軸負方向から右回りに進む側にボーンがある場合の角度を正とし、y軸負方向から左回りに進む側にボーンがある場合の角度を負とする。したがって、プレイヤオブジェクトの後方から前方を見た場合にy軸に対して左側にボーンが曲がっている場合には、角度deg[i]が正となり、y軸に対して右側にボーンが曲がっている場合には、角度deg[i]が負となる。
【0093】
角速度データ75は、上記各ボーンの向きの変化量(角速度)ds[i](iは0≦i≦N−1の整数)をそれぞれ示すデータである。ボーンの角速度ds[i]は、当該ボーンの前回の角度から新たな角度を算出するために用いられる。
【0094】
ボーン方向データ76は、プレイヤオブジェクトの各ボーンの向きを表す2つのベクトルh[i]およびv[i]の値をそれぞれ示す。図12は、ボーンの向きを表す2つのベクトルを示す図である。図12に示すように、水平方向ベクトルh[i]は第iボーン83の向きに水平な向きを向く単位ベクトルであり、垂直方向ベクトルv[i]は第iボーン83の向きに水平な向きを向く単位ベクトルである。より具体的には、水平方向ベクトルh[i]は、第i+1ジョイント82から第iジョイント81への方向を向く。また、垂直方向ベクトルv[i]は、水平方向ベクトルh[i]を左回りに90°回転させたベクトルである。
【0095】
次に、ゲーム装置3において行われる処理の詳細を、図13〜図15を用いて説明する。図13は、ゲーム装置3において実行される処理の流れを示すメインフローチャートである。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムがメインメモリに読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。図13に示すフローチャートは、以上の処理が完了した後に行われる処理を示すフローチャートである。
【0096】
まず、ステップS1において、ゲームに関する初期化処理が実行される。具体的には、この初期化処理においては、仮想の3次元ゲーム空間が構築され、プレイヤオブジェクトや他のオブジェクトがゲーム空間の初期位置に配置される処理等が行われる。したがって、オブジェクト位置データ66として上記初期位置を示すデータがメインメモリに記憶され、オブジェクト方向データ67として所定の初期方向を示すデータがメインメモリに記憶される。なお、ここではプレイヤオブジェクトは初期状態では静止しているものとし、そのため、オブジェクト速度データ68としては“(0,0)”を示すデータがメインメモリに記憶される。なお、ステップS1の初期化処理においては、上記処理の他、ゲーム空間の画像を生成するための仮想カメラの位置および向きが予め定められた初期状態に設定される等の処理が行われる。
【0097】
続くステップS2において、以降のゲーム処理において用いられる変数の各値が初期化される。すなわち、CPU10は、追従加速度データ64、動きデータ65、現在ジョイント位置データ70、ジョイント速度データ72、ジョイント推進力データ73、角度データ74、および角速度データ75の内容を次のように設定してメインメモリに記憶する。すなわち、追従加速度データ64の内容は、追従加速度Af=0を示すように設定される。動きデータ65の内容は、動き量M=0を示すように設定される。現在ジョイント位置データ70の内容は、各ジョイント位置pos[i]が全て“(0,0)”を示すように設定される。ジョイント速度データ72の内容は、各ジョイント速度vel[i]が全て“(0,0)”を示すように設定される。ジョイント推進力データ73の内容は、各ジョイント推進力pow[i]が全て“(0,0)”を示すように設定される。角度データ74の内容は、各ボーンの角度deg[i]が全て“0”を示すように設定される。角速度データ75の内容は、各ボーンの角速度ds[i]が全て“0”を示すように設定される。
【0098】
上記ステップS2の後、ステップS3〜S9の処理ループが、ゲームが実行される間繰り返し実行される。なお、1回の当該処理ループは、1フレーム時間(例えば1/60秒)に1回の割合で実行される。
【0099】
ステップS3において、CPU10は操作データを取得する。すなわち、コントローラ5から送信されてくる操作データが無線コントローラモジュール19を介して受信され、操作データに含まれる加速度データがメインメモリに記憶されるので、CPU10はメインメモリから加速度データ62を読み出す。ステップS3〜S9の処理ループにおいて上記ステップS3が繰り返し実行されることによって、コントローラ5の動きに応じて変化する値(加速度ベクトル)が繰り返し取得されることとなる。
【0100】
続くステップS4において、CPU10は、加速度ベクトルAに基づいて追従加速度Afを算出する。本実施形態では、CPU10は、追従加速度ベクトルAfは、ステップS3で取得された加速度データ62により示される加速度ベクトルのX軸成分AXと、前回の追従加速度Af’とを用いて算出される。なお、前回の追従加速度Af’は、ステップS4の実行直前の時点でメインメモリに記憶されている追従加速度データ64により示される。具体的には、追従加速度Afは次式(1)に従って算出される。
Af=Af’+(AX−Af’)×K1 …(1)
上式(1)において、定数K1の値は0<K1<1の範囲で予め定められ、ここでは、定数K1は例えばK1=0.03に設定される。ステップS4において算出された追従加速度Afを示すデータは、追従加速度データ64としてメインメモリに記憶される。
【0101】
続くステップS5において、CPU10は、追従加速度Afに基づいて動き量Mを算出する。動き量Mは、メインメモリに記憶されている加速度データ62および追従加速度データ64を用いて算出される。具体的には、動き量Mは次式(2)に従って算出される。
M=AX−Af …(2)
ステップS5において算出された動き量Mを示すデータは、動きデータ65としてメインメモリに記憶される。
【0102】
以上のように、本実施形態では、加速度センサ37によって検出される加速度ベクトルの値をそのまま用いるのではなく、検出される加速度値から、当該加速度値に追従して変化する追従加速度の値を減算した結果である動き量Mを入力として用いることとした。ここで、他の実施形態においては、動き量Mに代えて、検出される加速度の値をそのまま入力として用いるようにしてもよい。
【0103】
ここで、加速度センサ37によって検出される加速度には、重力に起因する成分(重力加速度の成分)と、コントローラ5が動かされたことによる慣性力に起因する成分とが含まれている。本実施形態のように、コントローラ5の傾きがほぼ変わらない状態でコントローラ5が振り動かされて使用される態様においては、重力加速度の成分は急激には変化しないと考えられる一方、慣性力に起因する成分は急激に変化すると考えられる。追従加速度は、検出される加速度を平滑化することによって高周波成分(急激に変化する成分)を除去したものであるので、上記2つの成分のうちの重力加速度の成分に相当すると考えられる。したがって、検出された加速度から追従加速度を減算することによって、検出される加速度に含まれる2つの成分から、慣性力に起因する成分、すなわち、コントローラ5の動きに起因する成分を抽出することができる。したがって、本実施形態のように動き量Mを用いることによって、検出される加速度をそのまま用いる場合に比べてコントローラ5の動きを正確に反映することができ、コントローラ5を動かす操作をオブジェクトの動作に正確に反映させることができる。
【0104】
なお、本実施形態では、コントローラ5がボタン面を略鉛直上向きとした状態で把持されることを前提とした上で、コントローラ5の水平方向に関する動きを算出するものである。そのため、加速度ベクトルのX軸成分のみを用いて動き量Mを算出するようにした。ここで、コントローラ5がZ軸周りに回転された状態で把持される(例えば、ボタン面が水平方向を向いた状態で把持される)ことを想定する場合には、コントローラ5の水平方向に関する動きを算出するようにしてもよい。具体的には、上記ステップS4において、CPU10は、加速度ベクトルのX軸成分およびY軸成分について追従加速度を算出する。そして、上記ステップS5において、X軸成分およびY軸成分についてそれぞれ動き量を算出し、X軸成分の動き量とY軸成分の動き量とを各成分とする2次元ベクトルを算出する。さらに、CPU10は、Y軸負方向と重力方向とのなす角度を算出し、当該角度だけ上記2次元ベクトルを回転させる変換を行う。なお、重力方向は、X軸成分の追従加速度とY軸成分の追従加速度とを各成分とする追従加速度ベクトルにより示されるので、上記角度は、Y軸負方向と追従加速度ベクトルとのなす角度として算出することができる。上記変換後の2次元ベクトルのX軸成分が、コントローラ5の水平方向の動きを表すことになるので、CPU10は、本実施形態における動き量に代えて当該X軸成分の値を用いる。これによって、コントローラ5がZ軸周りに回転された状態で把持される場合であっても、水平方向の動きを算出することができる。
【0105】
ステップS6において、CPU10は、動作制御処理を実行する。動作制御処理は、コントローラ5の動き(動き量M)に応じてプレイヤオブジェクトを動作させるための処理である。以下、図14を参照して、動作制御処理の詳細を説明する。
【0106】
図14は、図13に示す動作制御処理(ステップS6)の流れを示すフローチャートである。動作制御処理においては、まずステップS11において、CPU10は、基準ジョイントに接続される隣接ボーン(本実施形態では第1ボーン56)の向きを算出する。前述したように、隣接ボーンの向きdeg[0]は、コントローラ5の入力である動き量Mに基づいて算出される。なお、動き量Mは、動きデータ65としてメインメモリに記憶されている。具体的には、CPU10は、次式(3)に従って隣接ボーンの向きdeg[0]を算出する。
deg[0]=M×S1 …(3)
上式(3)において、定数S1は予め定められ、ここでは、定数S1は例えばS1=8.6に設定される。上記ステップS11においては、メインメモリに記憶されている角度データ74のうち、隣接ボーンの角度deg[0]を示すデータが、ステップS11で新たに算出された値に更新される。
【0107】
上式(3)のように、本実施形態においては、隣接ボーンの向きdeg[0]は動き量Mに比例する大きさとなる。したがって、本実施形態では、隣接ボーンの向きが基準の向き(deg[0]=0°の向き)に対していずれの側にあるか(換言すれば、deg[0]が正であるか負であるか)は、コントローラ5が左方向に動かされているか右方向に動かされているか(換言すれば、動き量Mが正であるか負であるか)によって決まる。これによって、コントローラ5を左右に動かす(振る)ことに応じて、隣接ボーンが左右に動くことになる。
【0108】
続くステップS12において、CPU10は、カウンタnの値をn=1に設定する。カウンタnの値を示すデータはメインメモリに記憶される。nは、処理対象となるジョイントまたはボーンの番号を示す変数である。
【0109】
上記ステップS12の後、ステップS13〜S20の処理ループが繰り返し実行される。ステップS13〜S20の処理ループにおいては、基準ジョイントを基準に隣接ボーン(第1ボーン56)よりも後側にあるジョイントの位置およびボーンの向きが算出される。
【0110】
以下に説明するステップS13〜S16においては、基準ジョイント以外の各ジョイントの位置が算出されるとともに、当該各ジョイントの速度および推進力が算出される。ここで、ステップS13〜S16において位置、速度、および推進力が算出される対象となるジョイントを処理対象ジョイントと呼ぶ。処理対象ジョイントは、カウンタnの値によって指定されるジョイント、すなわち、第nジョイントである。
【0111】
ステップS13において、CPU10は、処理対象ジョイントに接続され、処理対象ジョイントよりも1つ基準ジョイント側にあるボーン、すなわち、第(n−1)ボーンの方向を示す2つのベクトルh[n−1]およびv[n−1]を算出する。これら2つのベクトルh[n−1]およびv[n−1]は、第(n−1)ボーンの角度deg[n−1]に基づいて算出される。具体的には、第(n−1)ボーンの水平方向ベクトルh[n−1](=(hx[n−1],hy[n−1]))および垂直方向ベクトルv[n−1](=(vx[n−1],vy[n−1]))は、次式(4)に従って算出される。
hx[n−1]=sin(deg[n−1])
hy[n−1]=cos(deg[n−1])
vx[n−1]=−cos(deg[n−1])
vy[n−1]=sin(deg[n−1]) …(4)
上記ステップS13においては、メインメモリに記憶されているボーン方向データ76のうち、第(n−1)ボーンの水平方向ベクトルおよび垂直方向ベクトルを示すデータが、ステップS13で新たに算出された値に更新される。
【0112】
ステップS14において、CPU10は、処理対象ジョイントの位置を算出する。処理対象ジョイントの位置pos[n]は、第(n−1)ボーンの水平方向ベクトルh[n−1]および垂直方向ベクトルv[n−1]と、第(n−1)ジョイントの位置pos[n−1]とに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている現在ジョイント位置データ70およびボーン方向データ76を読み出し、次式(5)に従って処理対象ジョイントの位置pos[n](=(posx[n],posy[n]))を算出する。
posx[n]=posx[n−1]−hx×L
posy[n]=posy[n−1]−hy×L …(5)
上式(5)において、定数Lは、ボーンの長さを示し、予め定められる。ここでは、定数Lは例えばL=10に設定される。上記ステップS14においては、メインメモリに記憶されている現在ジョイント位置データ70のうち、第nジョイントの位置を示すデータが、ステップS14で新たに算出された値に更新される。また、更新前の第nジョイントの位置を示すデータは、メインメモリに記憶されている前回ジョイント位置データ71のうちの第nジョイントの位置を示すデータとしてメインメモリに記憶される。
【0113】
ステップS15において、CPU10は、処理対象ジョイントの速度vel[n]を算出する。この速度vel[n]は、現在の処理対象ジョイントの位置pos[n]と、1フレーム前の処理対象ジョイントの位置pos’[n]とに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている現在ジョイント位置データ70および前回ジョイント位置データ71を読み出し、次式(6)に従って処理対象ジョイントの速度vel[n](=(velx[n],vely[n]))を算出する。
velx[n]=posx[n]−posx’[n]
vely[n]=posy[n]−posy’[n] …(6)
上式(6)において、変数posx’[n]は前回における第nジョイントの位置のx座標値であり、変数posy’[n]は前回における第nジョイントの位置のy座標値である。上記ステップS15においては、メインメモリに記憶されているジョイント速度データ72のうち、第nジョイントの速度を示すデータが、ステップS15で新たに算出された値に更新される。
【0114】
ステップS16において、CPU10は、処理対象ジョイントの速度vel[n]に基づいて処理対象ジョイントによる推進力pow[n]を算出する。具体的には、CPU10は、メインメモリに記憶されているジョイント速度データ72を読み出し、次式(7)に従って処理対象ジョイントの推進力pow[n](=(powx[n],powy[n]))を算出する。
powx[n]=vx[n]×(−vx[n]×velx[n]−vy[n]×vely[n])
powy[n]=vy[n]×(−vx[n]×velx[n]−vy[n]×vely[n]) …(7)
上記ステップS16においては、メインメモリに記憶されているジョイント推進力データ73のうち、第nジョイントの推進力を示すデータが、ステップS16で新たに算出された値に更新される。
【0115】
上式(7)から明らかなように、ジョイント推進力pow[n]は、処理対象ジョイントの速度vel[n]の各成分のうち、垂直方向ベクトルvにより示される方向の逆方向の成分の大きさとして算出される。ここで、ジョイント推進力の向きがジョイント速度の逆方向を向くようにしているのは、本実施形態のように水中を泳ぐ魚の動作を表現する場合には、ジョイントの移動方向の逆方向に推進力が加わり、ジョイントの移動方向の逆方向にオブジェクトが移動することが自然だからである。なお、他の実施形態においては、ジョイント推進力は、ジョイント速度に基づいて算出されればよく、例えば、ジョイント速度に所定の定数を乗算したものとしてもよい。
【0116】
ステップS17において、CPU10は、プレイヤオブジェクトの全てのジョイントについてステップS13〜S16の処理を行ったか否かを判定する。この判定は、カウンタnの値がジョイントの数Nに等しいか否かによって行うことができる。ステップS17の判定結果が肯定である場合、CPU10は動作制御処理を終了する。一方、ステップS17の判定結果が否定である場合、ステップS18〜S20の処理が実行される。
【0117】
ステップS18およびS19の処理は、最後に実行されたステップS13〜S16の処理において処理対象ジョイントであったジョイントの後側に接続されるボーンの向きを算出するための処理である。以下では、ステップS18およびS19の処理によって向きを算出する処理対象となるボーンを処理対象ボーンと呼ぶ。処理対象ボーンは、カウンタnの値によって指定されるボーン、すなわち、第nボーンである。
【0118】
ステップS18において、CPU10は、処理対象ボーンの角速度ds[n]を算出する。この角速度ds[n]は、1フレーム前に算出された処理対象ボーンの角度deg’[n]および角速度ds’[n]と、処理対象ボーンの1つ先端側に位置する第(n−1)ボーンの角度deg[n−1]とに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されている角度データ74および角速度データ75を読み出して、次式(8)に従って処理対象ボーンの角速度ds[n]を算出する。
ds[n]=ds’[n]×D−(deg[n]−deg[n−1])×K2 …(8)
上式(8)において、定数Dは0<D<1の範囲で予め定められ、ここでは、定数Dは例えばD=0.9に設定される。また、定数K2は0<K2<1の範囲で予め定められ、ここでは、定数K2は例えばK2=0.02に設定される。上記ステップS18においては、メインメモリに記憶されている角速度データ75のうち、第nボーンの角速度を示すデータが、ステップS18で新たに算出された値に更新される。
【0119】
上式(8)から明らかなように、ステップS18では、前回における角速度ds’[n]を減衰させるとともに、処理対象ボーンの角度が、当該処理対象ボーンよりも1つ先端側のボーンの角度に近づくように、新たな角速度ds[n]が算出される。したがって、プレイヤオブジェクトの各ボーンは、1つ先端側のボーンの動きに追従するように動作し、先端側のボーンが停止した状態が続けばその後側のボーンはある時間が経過した時点で停止することとなる。つまり、コントローラ5に対する入力が行われずに隣接ボーン(先端のボーン)が停止した状態が続けば、各ボーンおよび各ジョイントの位置関係は上述した基準の位置関係に収束することとなる。なお、基準の位置関係に収束するまでの時間は、上記定数Dおよび上記定数K2の大きさによって変化する。
【0120】
ステップS19において、CPU10は、処理対象ボーンの角速度ds[n]に基づいて処理対象ボーンの向き(角度)deg[n]を算出する。具体的には、CPU10は、メインメモリに記憶されている角度データ74および角速度データ75を読み出して、次式(9)に従って処理対象ボーンの角度deg[n]を算出する。
deg[n]=deg’[n]+ds[n] …(9)
上式(9)において、変数deg’[n]は式(8)と同様、1フレーム前に算出された処理対象ボーンの角度であり、ステップS19の時点で角度データ74としてメインメモリに記憶されている。上記ステップS19においては、メインメモリに記憶されている角度データ74のうち、第nボーンの角度を示すデータが、ステップS19で新たに算出された値に更新される。
【0121】
ステップS20において、CPU10は、カウンタnの値をインクリメントする(1増加する)。ステップS20の後、上記ステップS13〜S20の処理ループが再度実行される。これによって、次に実行されるステップS13〜S16の処理では、今回処理対象となったジョイントの1つ後端側のジョイントが処理対象となり、次に実行されるステップS18およびS19の処理では、今回処理対象となったボーンの1つ後端側のボーンが処理対象となる。したがって、ステップS13〜S20の処理ループが繰り返し実行されることにより、隣接ボーンより後端側のジョイントおよびボーンについて、ジョイントの位置およびボーンの向きが先端側から順に算出されることとなる。
【0122】
以上に説明した動作制御処理によれば、ステップS11の処理によって、隣接ボーンの角度、すなわち、隣接ジョイントの基準ジョイントに対する向きが動き量に基づいて決定される。そして、続いて実行される1回目のステップS13およびS14の処理によって、隣接ボーンに接続される隣接ジョイントの位置が決定される。さらに、1回目のステップS13およびS14の後、ステップS18およびS19の処理と、(2回目以降の)ステップS13およびS14の処理とが繰り返し実行されることによって、基準ジョイントと隣接ジョイントとを除く他のジョイントについて、基準ジョイントに近いジョイントから順に移動後の位置が算出される。具体的には、隣接ジョイントよりも後端側にあるボーンおよびジョイントについて、ジョイントの位置およびボーンの向きが順に決定されていく。そして、N回目のステップS13およびS14の後のステップS17において判定結果が肯定となり、動作制御処理が終了する。これによって、N個のジョイントの位置およびN−1個のボーンの向きが全て決定されたこととなり、プレイヤオブジェクトの形状が決定されたこととなる。また、本実施形態では、ステップS15およびS16の処理によって、基準ジョイントを除く各ジョイントについて推進力が算出される。後述するステップS7の移動制御処理では、この推進力に基づいてプレイヤオブジェクトがゲーム空間内において移動される。
【0123】
図13の説明に戻り、ステップS6の次のステップS7において、CPU10は、移動制御処理を実行する。移動制御処理は、プレイヤオブジェクトをゲーム空間内において移動させるための処理である。以下、図15を参照して、移動制御処理の詳細を説明する。
【0124】
図15は、図13に示す移動制御処理(ステップS7)の流れを示すフローチャートである。移動制御処理においては、まずステップS31およびS32において、オブジェクト推進力POWが各ジョイントの推進力pow[i]に基づいて算出される。すなわち、ステップS31において、CPU10は、まず各ジョイントの推進力の総和を算出する。具体的には、メインメモリに記憶されているジョイント推進力データ73を読み出し、各ジョイントの推進力pow[i](iは1〜Nの整数)の総和を算出する。なお、ここで算出された総和は、ジョイント推進力と同様、xy座標系における2次元ベクトルであり、(sumx,sumy)と表すことができる。
【0125】
続くステップS32において、CPU10は、ステップS31で算出された総和に基づいてオブジェクト推進力POWを算出する。具体的には、CPU10は、プレイヤオブジェクトを基準としたxy座標系における上記総和(sumx,sumy)を、ゲーム空間を基準としたx’y’座標系の2次元ベクトルに変換することによりオブジェクト推進力POWを算出する。ここで、xy座標系は、y軸正方向がx’y’座標系におけるベクトルFの向きとなるように設定される。したがって、CPU10は、次式(10)に従ってオブジェクト推進力POW(=(POWx,POWy))を算出する。
POWx=−Lx×sumx+Fx×sumy
POWy=−Ly×sumx+Fy×sumy …(10)
上式(10)において、変数LxおよびLyは、上記左方向ベクトルLのx’成分およびy’成分であり、変数FxおよびFyは、上記前方向ベクトルFのx’成分およびy’成分である。上式(10)で算出されたオブジェクト推進力POWを示すデータは、オブジェクト推進力データ69としてメインメモリに記憶される。
【0126】
ステップS33において、CPU10は、オブジェクト速度VELを算出する。オブジェクト速度VELは、1フレーム前に算出されたオブジェクト速度VEL’と、オブジェクト推進力POWとに基づいて算出される。具体的には、CPU10は、メインメモリに記憶されているオブジェクト速度データ68およびオブジェクト推進力データ69を読み出して、次式(11)に従ってオブジェクト速度VEL(=(VELx,VELy))を算出する。
VELx=VELx’×R+POWx×S2
VELy=VELy’×R+POWy×S2 …(11)
上式(11)において、定数Rは0<R<1の範囲で予め定められ、ここでは、定数Rは例えばR=0.995に設定される。また、定数S2は予め定められ、ここでは、定数S2は例えばS2=0.01に設定される。また、変数VELx’およびVELy’は、1フレーム前に算出されたオブジェクト速度のx’成分およびy’成分であり、ステップS33の時点でオブジェクト速度データ68としてメインメモリに記憶されている。上式(11)で算出されたオブジェクト速度VELを示すデータは、オブジェクト速度データ68としてメインメモリに記憶される。
【0127】
上式(11)から明らかなように、ステップS33では、前回におけるオブジェクト速度VEL’を減衰させるとともに、減衰させた値に、今回のフレームで算出されたオブジェクト推進力POWに所定の重みを付した値を加算することによって、今回のフレームにおけるオブジェクト速度VELを算出している。これによって、各ジョイントの速度vel[i]がオブジェクト速度VELに反映される。
【0128】
ステップS34において、CPU10は、オブジェクト速度VELに基づいてプレイヤオブジェクトの位置POSを算出する。具体的には、CPU10は、メインメモリに記憶されているオブジェクト位置データ66およびオブジェクト速度データ68を読み出して、次式(12)に従ってオブジェクト位置POS(=(POSx,POSy))を算出する。
POSx=POSx’+VELx
POSy=POSy’+VELy …(12)
上式(12)において、変数POSx’およびPOSy’は、1フレーム前に算出されたオブジェクト位置のx’成分およびy’成分であり、ステップS34の時点でオブジェクト位置データ66としてメインメモリに記憶されている。上式(12)で算出されたオブジェクト位置POSを示すデータは、オブジェクト位置データ66としてメインメモリに記憶される。上記ステップS34によって、各ジョイントの速度に基づいてプレイヤオブジェクトが移動されたこととなる。
【0129】
ステップS35において、CPU10は、オブジェクトの向きを算出する。前述のように、オブジェクトの向きは、後端のボーンの向きdeg[N−1]に基づいて決定される。具体的には、CPU10は、メインメモリに記憶されている角度データ74を読み出し、次式(13)に従って前方向ベクトルF(=(Fx,Fy))を算出する。
Fx=Fx’−Lx’×deg[N−1]×S3
Fy=Fy’−Ly’×deg[N−1]×S3 …(13)
上式(13)において、定数S3は予め定められ、ここでは、定数S3は例えばS3=0.02に設定される。変数Fx’およびFy’は、1フレーム前に算出された前方向ベクトルFのx’成分およびy’成分であり、ステップS35の時点でオブジェクト方向データ67としてメインメモリに記憶されている。変数Lx’およびLy’は、1フレーム前に算出された左方向ベクトルLのx’成分およびy’成分であり、ステップS35の時点でオブジェクト方向データ67としてメインメモリに記憶されている。上式(13)によれば、プレイヤオブジェクトの後方から前方を見た場合において、y軸に対して左回りに後端のボーンが曲がっていれば(deg[N−1]>0であれば)、プレイヤオブジェクトは右回りに回転することとなる。また、y軸に対して右回りにボーンが曲がっていれば(deg[N−1]<0であれば)、プレイヤオブジェクトは左回りに回転することとなる。そして、y軸と後端のボーンの向きとが一致すれば(deg[N−1]=0であれば)、プレイヤオブジェクトは回転しないこととなる。つまり、上式(13)によれば、プレイヤオブジェクトの方向が後端のボーンの向きに一致するように、プレイヤオブジェクトの方向が変化される。
【0130】
上式(13)の計算を行った後、CPU10は、計算によって得られた前方向ベクトルFの大きさを正規化し、前方向ベクトルFを単位ベクトルとする。さらに、単位ベクトルとなった前方向ベクトルFに基づいて左方向ベクトルを算出する。具体的には、CPU10は、次の式(14)に従って左方向ベクトルL(=(Lx,Ly))を算出する。
Lx=−Fy
Ly=Fx …(14)
以上の処理によって算出された前方向ベクトルFおよび左方向ベクトルLを示すデータは、オブジェクト方向データ67としてメインメモリに記憶される。上記ステップS35の後、CPU10は、移動制御処理を終了する。
【0131】
図13の説明に戻り、ステップS7の次のステップS8において、CPU10は、プレイヤオブジェクトを含むゲーム空間の画像を生成して表示する。すなわち、プレイヤオブジェクトを構成するポリゴンは、メインメモリに記憶されている現在ジョイント位置データ70により示される各ジョイントの位置に基づいて形成され、オブジェクト位置データ66により示される位置に、オブジェクト方向データ67により示される方向を向くようにゲーム空間に配置される。CPU10およびGPU11bは、以上のようにプレイヤオブジェクトが配置されたゲーム空間を仮想カメラから見たときの画像を生成し、テレビ2の画面に表示する。
【0132】
ステップS9において、CPU10は、ゲームを終了するか否かを判定する。ステップS9の判定は、例えば、ゲームがクリアされたか否か、ゲームオーバーとなったか否か、プレイヤがゲームを中止する指示を行ったか否か等によって行われる。ステップS9の判定結果が否定である場合、ステップS3の処理が再度実行される。以降、ステップS9でゲームを終了すると判定されるまで、ステップS3〜S9の処理が繰り返し実行される。一方、ステップS9の判定結果が肯定である場合、CPU10は、図13に示すゲーム処理を終了する。以上で、ゲーム処理の説明を終了する。
【0133】
以上のように、本実施形態によれば、コントローラ5を左右方向に動かす操作によって、プレイヤオブジェクトが当該操作に応じて身体を左右にくねらすように動作させることができる。つまり、本実施形態によれば、コントローラ5を動かす操作によって、複数の部分からなる複雑なオブジェクトを動作させることができ、さらに、オブジェクトの動作を自然に表現することができる。
【0134】
なお、上記実施形態においては、ゲーム装置3は、3次元空間における所定の平面内においてプレイヤオブジェクトを移動させ、プレイヤオブジェクトの各ジョイントを当該平面内で移動させる場合を例として説明を行った。ここで、他の実施形態においては、ゲーム装置3は、プレイヤオブジェクトおよび各ジョイントを3次元的に移動させるようにしてもよい。また、このとき、ゲーム装置3は、加速度センサ37によって検出される加速度ベクトルから2軸方向の動き(例えば、X軸方向およびY軸方向)を示す動きベクトルを算出し、当該動きベクトルに基づいて隣接ボーンの向きを3次元的に変化させるようにしてもよい。
【0135】
また、上記実施形態においては、一列に接続される先端のジョイントを基準ジョイントとしたが、基準ジョイントは先端のジョイントでなくてもよい。例えば、先端からj番目のジョイント(第jジョイント)を基準ジョイントとする場合には、先頭からj+1番目以降のジョイントについては上記実施形態と同様に動作させるとともに、j番目よりも前のジョイントについては固定してもよい。また、j番目よりも前のジョイントについては、隣接ボーン(j番目のジョイントとj+1番目のジョイントとを接続するボーン)の延長線上に位置するように動作させてもよい。また、j番目よりも前のジョイントについてもj+1番目以降のジョイントと同様に動作させるようにしてもよい。
【0136】
また、上記実施形態においては、ジョイントおよびボーンを有する構成のオブジェクトを例として説明したが、オブジェクトの構成はこれに限らず、複数の部分からなり、各部分の接続関係が変化する構成であればどのような構成であってもよい。例えば、ポリゴンの各頂点を各部分(上記実施形態におけるジョイント)とみなし、所定の頂点を基準点(基準ジョイント)として上記実施形態と同様の処理を行うことも可能である。
【産業上の利用可能性】
【0137】
本発明は、入力装置自身の動きに応じて複雑なオブジェクトを動作させること等を目的として、例えば、オブジェクトを操作するゲームを実行するためのゲーム装置またはゲームプログラム等に利用することが可能である。
【図面の簡単な説明】
【0138】
【図1】ゲームシステム1の外観図
【図2】ゲーム装置3の機能ブロック図
【図3】コントローラ5の外観構成を示す斜視図
【図4】コントローラ5の外観構成を示す斜視図
【図5A】コントローラ5の内部構造を示す図
【図5B】コントローラ5の内部構造を示す図
【図6】コントローラ5の構成を示すブロック図
【図7】コントローラ5を用いてゲーム操作を行うときの様子を示す図解図
【図8】本実施形態のプレイヤオブジェクトの構成を示す図
【図9】コントローラ5に対して操作が加えられた時のプレイヤオブジェクトを示す図
【図10】ゲーム装置3のメインメモリに記憶される主なデータを示す図
【図11】プレイヤオブジェクトのジョイントおよびボーンに関する各変数を示す図
【図12】ボーンの向きを表す2つのベクトルを示す図
【図13】ゲーム装置3において実行される処理の流れを示すメインフローチャート
【図14】図13に示す動作制御処理(ステップS6)の流れを示すフローチャート
【図15】図13に示す移動制御処理(ステップS7)の流れを示すフローチャート
【符号の説明】
【0139】
1 ゲームシステム
2 テレビ
3 ゲーム装置
4 光ディスク
5 コントローラ
6 マーカ部
10 CPU
11c GPU
11e 内部メインメモリ
12 外部メインメモリ
50 プレイヤオブジェクト
51〜55,81,82 ジョイント
56〜59,83 ボーン

【特許請求の範囲】
【請求項1】
入力装置の動きに応じて変化する入力値に基づいて仮想空間内におけるオブジェクトを動作させる情報処理装置のコンピュータに実行させる情報処理プログラムであって、
前記オブジェクトは、互いに接続される複数の接続点を有し、当該接続点の位置関係に基づいて当該オブジェクトの形状が決定され、
前記入力値を示す入力データを取得する入力データ取得ステップと、
前記オブジェクトの各接続点のうち所定の1つの接続点を基準点とし、当該基準点に接続される隣接接続点の当該基準点に対する向きを前記入力データに基づいて算出する向き算出ステップと、
前記向き算出ステップにおいて算出された向きに基づいて前記基準点を除く他の接続点の位置を移動させる接続点移動ステップと、
前記接続点移動ステップにおける移動後の各接続点の位置関係に基づいて形状が決められた前記オブジェクトを表示装置に表示させる表示ステップとを前記コンピュータに実行させる、情報処理プログラム。
【請求項2】
前記接続点移動ステップにおいて、前記コンピュータは、前記基準点を除く他の接続点について、前記基準点に近い接続点から順に移動後の位置を算出する、請求項1に記載の情報処理プログラム。
【請求項3】
前記向き算出ステップは、
前記入力装置の動きを示す動きデータを前記入力データに基づいて算出する動き算出ステップと、
前記隣接接続点の前記基準点に対する向きを前記動きデータに基づいて算出する算出実行ステップとを含む、請求項1または請求項2に記載の情報処理プログラム。
【請求項4】
前記入力データ取得ステップにおいて、前記コンピュータは、前記入力装置が備える加速度センサから出力される加速度データを前記入力データとして取得する、請求項3に記載の情報処理プログラム。
【請求項5】
前記動き算出ステップは、
前記入力データ取得ステップで取得された加速度データの値を平滑化した値を示す平滑化データを算出する平滑化ステップと、
前記入力データ取得ステップで取得した加速度データの値と前記平滑化データの値との差分を示すデータを前記動きデータとして算出する差分算出ステップとを含む、請求項4に記載の情報処理プログラム。
【請求項6】
前記加速度センサは、所定の1軸方向に関する前記入力装置の加速度を検出し、
前記動き算出ステップにおいて、前記コンピュータは、前記所定の1軸方向に関する前記入力装置の動きを示す動きデータを算出する、請求項4に記載の情報処理プログラム。
【請求項7】
前記隣接接続点の前記基準点に対する基準の向きは予め定められており、
前記動き算出ステップにおいて、前記コンピュータは、所定の方向に関する入力装置の動きを示す動きデータを算出し、
前記算出実行ステップにおいて、前記コンピュータは、前記隣接接続点の前記基準点に対する向きが前記基準の向きに対していずれの方向に変化しているかを、前記動きデータにより示される動きが前記所定の方向に関して正方向であるか負方向であるかに応じて決定する、請求項3に記載の情報処理プログラム。
【請求項8】
前記接続点移動ステップにおける各接続点の移動量に基づいて前記オブジェクトを移動させるオブジェクト移動ステップを前記コンピュータにさらに実行させる、請求項1または請求項2に記載の情報処理プログラム。
【請求項9】
前記基準点を除く各接続点のうちの端の接続点と当該端の接続点に接続される接続点とを結ぶ線の方向に基づいて、前記オブジェクトの方向を変更する方向変更ステップを前記コンピュータにさらに実行させる、請求項1、請求項2または請求項8に記載の情報処理プログラム。
【請求項10】
入力装置の動きに応じて変化する入力値に基づいて仮想空間内におけるオブジェクトを動作させる情報処理装置であって、
前記オブジェクトは、互いに接続される複数の接続点を有し、当該接続点の位置関係に基づいて当該オブジェクトの形状が決定され、
前記入力値を示す入力データを取得する入力データ取得手段と、
前記オブジェクトの各接続点のうち所定の1つの接続点を基準点とし、当該基準点に接続される隣接接続点の当該基準点に対する向きを前記入力データに基づいて算出する向き算出手段と、
前記向き算出手段によって算出された向きに基づいて前記基準点を除く他の接続点の位置を移動させる接続点移動手段と、
前記接続点移動手段による移動後の各接続点の位置関係に基づいて形状が決められた前記オブジェクトを表示装置に表示させる表示制御手段とを備える、情報処理装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5A】
image rotate

【図5B】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate


【公開番号】特開2008−310523(P2008−310523A)
【公開日】平成20年12月25日(2008.12.25)
【国際特許分類】
【出願番号】特願2007−156721(P2007−156721)
【出願日】平成19年6月13日(2007.6.13)
【出願人】(000233778)任天堂株式会社 (1,115)
【Fターム(参考)】