[ゲームシステムの全体構成]
図1を参照して、本発明の一実施形態に係る姿勢算出装置の一例であるゲーム装置を含むゲームシステム1について説明する。図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、入力装置8、およびマーカ部6を含む。本システムは、入力装置8を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されているゲームプログラムを読み出して実行することによってゲーム処理を実行する。
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
入力装置8は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与えるものである。本実施形態では、入力装置8はコントローラ5とジャイロセンサユニット7とを含む。詳細は後述するが、入力装置8は、コントローラ5に対してジャイロセンサユニット7が着脱可能に接続されている構成である。コントローラ5とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ5とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ5とゲーム装置3とは有線で接続されてもよい。
[ゲーム装置3の内部構成]
次に、図2を参照して、ゲーム装置3の内部構成について説明する。図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14およびAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSI11の内部構成については後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11eまたは外部メインメモリ12に読み出したデータを書き込む。
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRAM11d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
また、入出力プロセッサ11aは、コントローラ5から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して外部記憶媒体にアクセスし、外部記憶媒体にデータを保存したり、外部記憶媒体からデータを読み出したりすることができる。
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
[入力装置8の構成]
次に、図3〜図6を参照して、入力装置8について説明する。図3は、入力装置8の外観構成を示す斜視図である。図4は、コントローラ5の外観構成を示す斜視図である。図3は、コントローラ5の上側後方から見た斜視図であり、図4は、コントローラ5を下側前方から見た斜視図である。
図3および図4において、コントローラ5は、例えばプラスチック成型によって形成されたハウジング31を有している。ハウジング31は、その前後方向(図3に示すZ軸方向)を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。プレイヤは、コントローラ5に設けられたボタンを押下すること、および、コントローラ5自体を動かしてその位置や姿勢を変えることによってゲーム操作を行うことができる。
ハウジング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を誤って押下することを防止することができる。
ハウジング31の後面にはコネクタ33が設けられている。コネクタ33は、コントローラ5に他の機器(例えば、ジャイロセンサユニット7や他のコントローラ)を接続するために利用される。また、ハウジング31の後面におけるコネクタ33の両側には、上記他の機器が容易に離脱することを防止するために係止穴33aが設けられている。
ハウジング31上面の後方には複数(図3では4つ)のLED34a〜34dが設けられる。ここで、コントローラ5には、他のメインコントローラと区別するためにコントローラ種別(番号)が付与される。各LED34a〜34dは、コントローラ5に現在設定されている上記コントローラ種別をプレイヤに通知したり、コントローラ5の電池残量をプレイヤに通知したりする等の目的で用いられる。具体的には、コントローラ5を用いてゲーム操作が行われる際、上記コントローラ種別に応じて複数のLED34a〜34dのいずれか1つが点灯する。
また、コントローラ5は撮像情報演算部35(図6)を有しており、図4に示すように、ハウジング31前面には撮像情報演算部35の光入射面35aが設けられる。光入射面35aは、マーカ6Rおよび6Lからの赤外光を少なくとも透過する材質で構成される。
ハウジング31上面における1番ボタン32bとホームボタン32fとの間には、コントローラ5に内蔵されるスピーカ49(図5)からの音を外部に放出するための音抜き孔31aが形成されている。
次に、図5および図6を参照して、コントローラ5の内部構造について説明する。図5および図6は、コントローラ5の内部構造を示す図である。なお、図5は、コントローラ5の上筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6は、コントローラ5の下筐体(ハウジング31の一部)を外した状態を示す斜視図である。図6に示す斜視図は、図5に示す基板30を裏面から見た斜視図となっている。
図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がワイヤレスコントローラとして機能する。
一方、図6において、基板30の下主面上の前端縁に撮像情報演算部35が設けられる。撮像情報演算部35は、コントローラ5の前方から順に赤外線フィルタ38、レンズ39、撮像素子40、および画像処理回路41を備えている。これらの部材38〜41はそれぞれ基板30の下主面に取り付けられる。
さらに、基板30の下主面上には、上記マイコン42およびバイブレータ48が設けられている。バイブレータ48は、例えば振動モータやソレノイドであり、基板30等に形成された配線によってマイコン42と接続される。マイコン42の指示によりバイブレータ48が作動することによってコントローラ5に振動が発生する。これによって、コントローラ5を把持しているプレイヤの手にその振動が伝達される、いわゆる振動対応ゲームを実現することができる。本実施形態では、バイブレータ48は、ハウジング31のやや前方寄りに配置される。つまり、バイブレータ48がコントローラ5の中心よりも端側に配置することによって、バイブレータ48の振動によりコントローラ5全体を大きく振動させることができる。また、コネクタ33は、基板30の下主面上の後端縁に取り付けられる。なお、図5および図6に示す他、コントローラ5は、マイコン42の基本クロックを生成する水晶振動子、スピーカ49に音声信号を出力するアンプ等を備えている。
また、ジャイロセンサユニット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から離脱することができる。
また、ジャイロセンサユニット7の後端には、上記コネクタ33と同形状のコネクタが設けられる。したがって、コントローラ5(のコネクタ33)に対して装着可能な他の機器は、ジャイロセンサユニット7のコネクタに対しても装着可能である。なお、図3においては、当該コネクタに対してカバー52が着脱可能に装着されている。
なお、図3〜図6に示したコントローラ5およびジャイロセンサユニット7の形状や、各操作ボタンの形状、加速度センサやバイブレータの数および設置位置等は単なる一例に過ぎず、他の形状、数、および設置位置であっても、本発明を実現することができる。また、本実施形態では、撮像手段による撮像方向はZ軸正方向であるが、撮像方向はいずれの方向であってもよい。すなわち、コントローラ5における撮像情報演算部35の位置(撮像情報演算部35の光入射面35a)は、ハウジング31の前面でなくてもよく、ハウジング31の外部から光を取り入れることができれば他の面に設けられてもかまわない。
図7は、入力装置8(コントローラ5およびジャイロセンサユニット7)の構成を示すブロック図である。コントローラ5は、操作部32(各操作ボタン32a〜32i)、コネクタ33、撮像情報演算部35、通信部36、および加速度センサ37を備えている。コントローラ5は、自機に対して行われた操作内容を示すデータを操作データとしてゲーム装置3へ送信するものである。
操作部32は、上述した各操作ボタン32a〜32iを含み、各操作ボタン32a〜32iに対する入力状態(各操作ボタン32a〜32iが押下されたか否か)を示す操作ボタンデータを通信部36のマイコン42へ出力する。
撮像情報演算部35は、撮像手段が撮像した画像データを解析してその中で輝度が高い領域を判別してその領域の重心位置やサイズなどを算出するためのシステムである。撮像情報演算部35は、例えば最大200フレーム/秒程度のサンプリング周期を有するので、比較的高速なコントローラ5の動きでも追跡して解析することができる。
撮像情報演算部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の向きや位置を算出することができる。
なお、他の実施形態においては、コントローラ5は画像処理回路41を備えていない構成であってもよく、撮像画像自体がコントローラ5からゲーム装置3へ送信されてもよい。このとき、ゲーム装置3は、画像処理回路41と同様の機能を有する回路あるいはプログラムを有しており、上記マーカ座標を算出するようにしてもよい。
加速度センサ37は、コントローラ5の加速度(重力加速度を含む)を検出する、すなわち、コントローラ5に加わる力(重力を含む)を検出する。加速度センサ37は、当該加速度センサ37の検出部に加わっている加速度のうち、センシング軸方向に沿った直線方向の加速度(直線加速度)の値を検出する。例えば、2軸以上の多軸加速度センサの場合には、加速度センサの検出部に加わっている加速度として、各軸に沿った成分の加速度をそれぞれ検出する。例えば、3軸または2軸の加速度センサは、アナログ・デバイセズ株式会社(Analog Devices, Inc.)またはSTマイクロエレクトロニクス社(STMicroelectronics N.V.)から入手可能である種類のものでもよい。なお、加速度センサ37は、例えば静電容量式の加速度センサであるとするが、他の方式の加速度センサを用いるようにしてもよい。
本実施形態では、加速度センサ37は、コントローラ5を基準とした上下方向(図3に示すY軸方向)、左右方向(図3に示すX軸方向)および前後方向(図3に示すZ軸方向)の3軸方向に関してそれぞれ直線加速度を検出する。加速度センサ37は、各軸に沿った直線方向に関する加速度を検出するものであるため、加速度センサ37からの出力は3軸それぞれの直線加速度の値を表すものとなる。すなわち、検出された加速度は、入力装置8(コントローラ5)を基準に設定されるXYZ座標系(コントローラ座標系)における3次元のベクトル(ax,ay,az)として表される。以下では、加速度センサ37によって検出される3軸に関する各加速度値を各成分とするベクトルを加速度ベクトルと呼ぶ。
加速度センサ37が検出した加速度を示すデータ(加速度データ)は、通信部36へ出力される。なお、加速度センサ37が検出した加速度は、コントローラ5自体の向き(傾斜角度)や動きに対応して変化するので、ゲーム装置3は加速度データを用いてコントローラ5の向きや動きを算出することができる。本実施形態では、ゲーム装置3は、加速度データに基づいてコントローラ5の姿勢を判断する。
加速度センサ37が検出した加速度(加速度ベクトル)を示すデータ(加速度データ)は、通信部36へ出力される。本実施形態において、加速度センサ37は、コントローラ5の傾斜角度を判断するためのデータを出力するセンサとして用いられる。
なお、加速度センサ37から出力される加速度の信号に基づいて、ゲーム装置3のプロセッサ(例えばCPU10)またはコントローラ5のプロセッサ(例えばマイコン42)等のコンピュータが処理を行うことによって、コントローラ5に関するさらなる情報を推測または算出(判定)することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、加速度センサ37を搭載するコントローラ5が静止状態であることを前提としてコンピュータ側の処理が実行される場合(すなわち、加速度センサによって検出される加速度が重力加速度のみであるとして処理が実行される場合)、コントローラ5が現実に静止状態であれば、検出された加速度に基づいてコントローラ5の姿勢が重力方向に対して傾いているか否かまたはどの程度傾いているかを知ることができる。具体的には、加速度センサ37の検出軸が鉛直下方向を向いている状態を基準としたとき、1G(重力加速度)がかかっているか否かによって、コントローラ5が基準に対して傾いているか否かを知ることができるし、その大きさによって基準に対してどの程度傾いているかも知ることができる。また、多軸の加速度センサ37の場合には、さらに各軸の加速度の信号に対して処理を施すことによって、重力方向に対してコントローラ5がどの程度傾いているかをより詳細に知ることができる。この場合において、プロセッサは、加速度センサ37からの出力に基づいてコントローラ5の傾斜角度を算出してもよいし、当該傾斜角度を算出せずに、コントローラ5の傾斜方向を算出するようにしてもよい。このように、加速度センサ37をプロセッサと組み合わせて用いることによって、コントローラ5の傾斜角度または姿勢を判定することができる。
一方、コントローラ5が動的な状態(コントローラ5が動かされている状態)であることを前提とする場合には、加速度センサ37は重力加速度に加えてコントローラ5の動きに応じた加速度を検出するので、検出された加速度から重力加速度の成分を所定の処理により除去することによってコントローラ5の動き方向を知ることができる。また、コントローラ5が動的な状態であることを前提とする場合であっても、検出された加速度から、加速度センサの動きに応じた加速度の成分を所定の処理により除去することによって、重力方向に対するコントローラ5の傾きを知ることが可能である。なお、他の実施例では、加速度センサ37は、内蔵の加速度検出手段で検出された加速度信号をマイコン42に出力する前に当該加速度信号に対して所定の処理を行うための、組込み式の処理装置または他の種類の専用の処理装置を備えていてもよい。組込み式または専用の処理装置は、例えば、加速度センサ37が静的な加速度(例えば、重力加速度)を検出するために用いられる場合、加速度信号を傾斜角(あるいは、他の好ましいパラメータ)に変換するものであってもよい。
通信部36は、マイコン42、メモリ43、無線モジュール44、およびアンテナ45を含んでいる。マイコン42は、処理を行う際にメモリ43を記憶領域として用いながら、マイコン42が取得したデータをゲーム装置3へ無線送信する無線モジュール44を制御する。また、マイコン42はコネクタ33に接続されている。ジャイロセンサユニット7から送信されてくるデータは、コネクタ33を介してマイコン42に入力される。以下、ジャイロセンサユニット7の構成について説明する。
ジャイロセンサユニット7は、プラグ53、マイコン54、2軸ジャイロセンサ55、および1軸ジャイロセンサ56を備えている。上述のように、ジャイロセンサユニット7は、3軸(本実施形態では、XYZ軸)周りの角速度を検出し、検出した角速度を示すデータ(角速度データ)をコントローラ5へ送信する。
2軸ジャイロセンサ55は、X軸周りの角速度およびY軸周りの(単位時間あたりの)角速度を検出する。また、1軸ジャイロセンサ56は、Z軸周りの(単位時間あたりの)角速度を検出する。なお、本明細書では、コントローラ5の撮像方向(Z軸正方向)を基準として、XYZ軸周りの回転方向を、それぞれ、ロール方向、ピッチ方向、ヨー方向と呼ぶ。すなわち、2軸ジャイロセンサ55は、ロール方向(X軸周りの回転方向)およびピッチ方向(Y軸周りの回転方向)の角速度を検出し、1軸ジャイロセンサ56は、ヨー方向(Z軸周りの回転方向)の角速度を検出する。
なお、本実施形態では、3軸回りの角速度を検出するために、2軸ジャイロセンサ55と1軸ジャイロセンサ56とを用いる構成としたが、他の実施形態においては、3軸回りの角速度を検出することができればよく、用いるジャイロセンサの数および組み合わせはどのようなものであってもよい。
また、本実施形態では、後述する姿勢算出処理における計算を容易にする目的で、各ジャイロセンサ55および56が角速度を検出する3つの軸は、加速度センサ37が加速度を検出する3つの軸(XYZ軸)と一致するように設定される。ただし、他の実施形態においては、各ジャイロセンサ56および57が角速度を検出する3つの軸と、加速度センサ37が加速度を検出する3つの軸とは一致しなくてもよい。
各ジャイロセンサ56および57で検出された角速度を示すデータは、マイコン54に出力される。したがって、マイコン54には、XYZ軸の3軸回りの角度速度を示すデータが入力されることになる。マイコン54は、上記3軸回りの角速度を示すデータを角速度データとしてプラグ53を介してコントローラ5へ送信する。なお、マイコン54からコントローラ5への送信は所定の周期毎に逐次行われるが、ゲームの処理は1/60秒を単位として(1フレーム時間として)行われることが一般的であるので、この時間以下の周期で送信を行うことが好ましい。
コントローラ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へ出力する。
上記コントローラ5を用いることによって、プレイヤは、各操作ボタンを押下する従来の一般的なゲーム操作に加えて、コントローラ5を任意の傾斜角度に傾ける操作を行うことができる。その他、上記コントローラ5によれば、プレイヤは、コントローラ5によって画面上の任意の位置を指示する操作、および、コントローラ5自体を動かす操作を行うこともできる。
次に、本実施形態で想定するゲームの概要について説明する。図8は、本実施形態で想定するゲームの画面の一例である。本実施形態で想定するゲームはゴルフゲームである。図8において、3次元仮想空間内に構築されたゴルフコースがゲーム画面として表示されており、ゲーム画面には、ゴルフクラブ102を持ったプレイヤオブジェクト101、ゴルフボールオブジェクト103(以下、単にボールと呼ぶ)、パワーゲージ104等が表示されている。また、パワーゲージ104の中には、スイングバー106が表示されている。
次に、本ゲームにおけるプレイヤの操作方法について説明する。本ゲームは、上記入力装置8をゴルフクラブに見立てて操作する。例えば、プレイヤは、図9に示すように、入力装置8の前面(光入射面35aがある面)を下方向に向けて両手で把持する。そして、プレイヤは、ゴルフのスイングを模した動作を行う。このスイング動作に連動して、仮想空間内のプレイヤオブジェクト101もスイング動作を行い、これに伴ってゴルフクラブ102も移動する。つまり、プレイヤの腕を振る動作が、プレイヤオブジェクト101のスイング動作に反映されることになる。
上記の操作についてより具体的に説明すると、まず、ボールを打つ前(スイングを開始する前)のプレイヤオブジェクトの初期状態としては、図8のように、ボール103から少し離れた場所に位置している。この状態のときに、プレイヤが上記のようにスイング動作を行うことで、「素振り」ができる。そして、ボールを打つときは、プレイヤはAボタン32dを押す。すると、図10に示すように、プレイヤオブジェクト101が前進してボール103に近づく。そして、Aボタン32dを押したまま、プレイヤが上記スイング動作を行うことで、ゴルフクラブ102をボール103に当てて、ボール103を飛ばす、つまり、ショットを行うことができる。このように、本ゲームでは、プレイヤが入力装置8を把持し、Aボタン32dを押さずにゴルフのスイング動作を行うことで「素振り」を行い、Aボタン32dを押しながらスイング動作を行うことでボール103を打って飛ばすことで、実際のゴルフに近いプレイ感覚のゴルフゲームを楽しむことができる。
また、本ゲームでは、Aボタン32dを押していない状態で、Bボタン32iを押すことで「構え直し」という操作を行うことができる。当該「構え直し」は、現実世界におけるプレイヤの正面方向を定義するための操作である(ゴルフでいう、「アドレス」の姿勢をとることに近い概念となる)。これは、ジャイロセンサでは姿勢の「変化」しか分からないため、プレイヤにBボタン32iを押してもらうことで、正面方向を定めるものである。そして、この操作で定義された正面方向を基準として、本ゴルフゲームにかかる各種処理が実行されることになる。
より具体的には、Bボタン32iを押したときの入力装置8の姿勢に基づき、実空間においてプレイヤの正面方向に伸びるような仮想的な平面を算出し、「基準平面」として設定するような処理を実行する。図11に、当該基準平面の概念を示す模式図を示す。図11(a)に示すように、基準平面は、実空間におけるプレイヤ自身の正面方向に伸びるような(仮想上の)平面である。同時に、図11(b)に示すように、プレイヤの位置の対応する仮想空間内の位置、すなわち、プレイヤオブジェクト101の正面方向に伸びるような平面に相当する。そして、当該基準平面と、スイング中の入力装置8の姿勢とを比較することで、スイング角度(プレイヤが入力装置8を振りかぶっている量)などのパラメータの算出が実行されたり、また、インパクトが発生したか否か(ゴルフクラブ102とボール103が当たったか否か)の判定等が実行される。より具体的には、スイング角度(後述の振りかぶり角度)について、基準平面の位置を0°として捉え、ボールを飛ばす側を正の値、振りかぶる側を負の値の角度として考える(本実施形態では、+180°〜−180°という範囲で考える)。そして、例えば、スイング角度が負の値から正の値に変化したときに、入力装置8が基準平面と接触、あるいは通過した(インパクトが発生した)という判定を行う。
しかし、一旦正面方向(基準平面)を決めたとしても、その後、プレイヤが入力装置8を振っているうちに、ジャイロセンサの計測誤差や計算誤差の蓄積によって、上記定義した正面方向と、その時々における入力装置8の姿勢との関係が不正確になり得る。また、プレイヤ自身が向きを変えることによって、上記正面方向と定義した方向が、プレイヤの目から見た正面方向ではなくなってしまうこともあり得る。その結果、入力装置8を振っているうちに、現実世界のプレイヤが今、仮想ゲーム空間においてどちらの方向を向いて立っているか分からない(仮想ゲーム空間における正面方向を向いているのかどうかわからない)という問題が発生する。結果的に、プレイヤは「正面」を向いてスイングしているつもりでも、ゲーム処理上は、正面を向いていない状態でスイングしているような扱いで処理され得る。そのために、定期的にBボタン32iを押すことで、正面方向(基準平面)を再設定する必要がある。また、例えば、入力装置8を一旦振りかぶった後、振り下ろさずにそのままの状態を維持したまま、ある程度時間が経過したような場合も、上記計算誤差の蓄積による影響が発生する可能性がある。そのため、上記Bボタン32iを押したときの入力装置8の姿勢(アドレス時の姿勢)と、現在の入力装置8の姿勢との差異が大きい状態であり、入力装置8に動きが発生していない状態がある程度の時間経過したような場合も、上記正面方向(基準平面)を再設定することが好ましい。
ここで、本実施形態では、Bボタン32iが押されたときの入力装置8の持ち方の違いによって、正面方向を算出するための計算が不安定となることを回避するために、後述するような処理を行うことで、多角的な基準で正面方向(基準平面)を定めている。
更に、本実施形態では、基準平面の再設定の必要性を推定して、適当だと思われるタイミングで、図12に示すような、上記「構え直し」操作をプレイヤに促すメッセージ105(以下、構え直しガイドと呼ぶ)の表示を行うという処理も実行している。
次に、上記ゲーム画面に表示されているパワーゲージ104に関して説明する。パワーゲージ104は、棒状の形状で表示されており、ゴルフクラブ102の振りかぶり量(プレイヤにとっては、打球パワーの目安となる情報)と、手首の捻り度合い(Z軸回りの角度)という2種類の情報を表示するものである。まず、振りかぶり量については、ゲージ内のスイングバー106の位置で示される。このスイングバー106は、振りかぶり量に応じてゲージ内を上下する。例えば、図13に示すように、基本姿勢(アドレスの姿勢)の状態では、スイングバー106はパワーゲージ104の一番下に位置している。その後、ゴルフクラブ102がボール103にインパクトするまでの間は、スイングバー106は振りかぶり量に応じてリアルタイムにパワーゲージ104内を上下する。
具体的には、ゴルフクラブ102(実世界では、入力装置8)を振り上げると、図14に示すように、スイングバー106は上方に移動する。振りかぶり量が大きいほど、より上に移動する。その後、クラブを振り下げると、スイングバー106は下方に移動する。そして、インパクト時には、図15に示すように、スイングバー106はパワーゲージ104の一番下に位置することになる。また、インパクトの時点で、打球のパワーが決定する。打球パワーが決定すると(すなわち、インパクトすると)、スイングバー106の表示は消えて、代わりに、図16に示すような、打球パワーを示すパワーバー107が、決定した打球パワーを示す長さまで下から伸びていく。そして、決定した打球パワーに対応する長さまで伸びると、図17に示すように、パワーバー107の伸びはそこで停止し、それ以上は伸びない。
次に、手首の捻り角度(Z軸回りの回転角度)については、図18に示すように、パワーゲージ104の形状自体を湾曲させることで表現している。例えば、手首を右側(時計回り)に捻っていれば、図19(a)に示すように、パワーゲージ104の形状が右に湾曲した形状となる。また、手首を左方向(反時計回り)に捻っていれば、図19(b)示すように、左に湾曲した形状となす。また、捻り具合が大きい程、湾曲具合も大きくなり、捻り具合が小さければ、図19(c)にように、湾曲具合も小さくなる。なお、本実施形態では、捻り角度(Z軸周りの回転角度)の最大値は、図20に示すように、入力装置8のY軸を中心として、左右それぞれ35°(−35°〜+35°)までとして扱う(これ以上の角度の捻りは、35°の捻りとして扱う)。また、捻り角度については、本実施形態では、構え直し操作を行ったときの角度を0°として、右側への捻りを正の値、左側の捻りを負の値として算出されるものとする。
このようにして、本実施形態のパワーゲージ104では、振りかぶり量と手首の捻り角度という異なる2つの要素を1つのパワーゲージでまとめて表示している。
次に、本実施形態にかかる処理のうち、特徴的な処理について説明する。本実施形態において特徴的な処理は、大きく以下の3つに大別される。
(1)ショット関連処理
(2)パワーゲージ関連処理
(3)かまえなおしガイド処理
まず、上記(1)ショット関連については、更に以下のような3つの処理に大別される。
(1−1)基準平面算出処理
(1−2)振り下ろし動作反映処理
(1−3)バックスピン処理
まず、(1−1)基準平面算出処理は、上述のように、Bボタン32iが押されたときに上記基準平面を算出・設定するための処理である。上記のように、コントローラの持ち方の違いによって、基準平面を算出するための計算が不安定となることを回避するために、多角的な視点で基準平面を算出する処理である。
次に、(1−2)振り下ろし動作反映処理は、クラブを振りかぶったときの上記スイングバー106の高さをベースにショットパワーを算出する処理である。具体的には、一旦クラブを振り上げ、その後、ゆっくりと下ろした場合は、スイングバー106の降下にともない弱いショットパワーが算出される。一方、一旦クラブを振り上げ、ある程度勢いよく振り下ろした場合は、振りかぶったときのスイングバー106の高さに近いショットパワーが算出される。また、一旦クラブを振り上げた後、さらに強く振り下ろした場合は、それ以上のショットパワーが算出される。つまり、振り下ろし時の際の動き方をショットパワーに反映させるための処理である。スイング中の振り下ろしにかかる動作をショットに反映させるための処理である。具体的には、上記スイングバー106の移動に関して、一旦クラブを振り上げ、その後、ゆっくりと下ろしたときは、スイングバー106もその動きに追従して下がるが、一旦振り上げて、勢いよく振り下ろした場合、ほぼ振り上げたときのパワーでショットすることができる。つまり、振り下ろし時の際の動き方をショットパワーに反映させる処理である。
次に、(1−3)バックスピン処理については、本実施形態では、スイングしてインパクトしたときに、図21に示すように、最後まで振り切らずに、図22に示すようにボール103のある場所で止めるようなスイング(インパクトの位置で急ブレーキをかけて止めるようなスイング)を行うことで、打球にバックスピンをかけることができる。そして、このような、途中で急ブレーキをかけるようなスイング(制動力がかかったスイング)を検出し、そのときの動きをバックスピンに反映させる処理が、当該(1−3)バックスピン処理である。
次に、上記(2)パワーゲージ関連処理では、上記のような、振りかぶりの量(スイング角度)と、手首の捻り(Z軸まわりの回転角度)とを算出して、それぞれをパワーゲージ104の表示に反映させるための処理が実行される。
次に、(3)かまえなおしガイド処理とは、本実施形態では、上記のように、定期的にBボタン32iの押下による「構え直し」(基準平面の再設定)が必要となるが、この基準平面の再設定の必要性を推定して、適当だと思われるタイミングで上記構え直しガイド105の表示を行う処理である。
次に、上記の各処理の概要について説明する。
[基準平面設定処理の概要]
まず、上記(1)ショット関連処理の(1−1)基準平面設定処理にかかる処理の概要を説明する。本処理は、上述したように、Bボタン32iが押されたときに基準平面(正面方向)を定義する処理である。そして、Bボタン32iが押されたときの、プレイヤの入力装置8の持ち方の違いによる計算結果の不安定さを回避するために、本実施形態では、以下のような処理を行っている。
まず、現在の入力装置8の姿勢に基づいて、(入力装置8のローカル座標系における)Z軸方向と重力方向を含む平面を算出する。以下、この平面を、第1の候補面と呼ぶ。
次に、Z軸正方向を重力方向に向けるような回転を、Y軸に対して加えることで、Y'軸を算出する。これは、仮想的に入力装置8を真下に向け直し、この状態のY軸方向を求めたものである。そして、当該Y'軸と重力方向とを含む平面を算出する。以下、この平面を第2の候補面と呼ぶ。
なお、Y軸をそのまま使うのではなく、Y'軸を算出するのは、以下の理由による。一般的に、ゴルフスイングの構えを取った場合、入力装置8は真下を向いた姿勢よりも、斜めになった姿勢(Z軸を持ち上げるような姿勢)となることが多いと考えられる。このZ軸の持ち上がりの姿勢回転に引きずられて、Y軸方向がプレイヤの正面方向からずれているケースが多い。そのため、Y軸をそのまま使うよりも、入力装置8を一旦真下に向けたと仮定したY'軸を用いるほうが、ゴルフゲームの処理を行う際には、より良い算出結果が得られると考えられるためである。そのため、ゲーム処理の内容によっては、Y'軸を使わず、Y軸をそのまま用いてもよい。
そして、上記2つの候補面と、その時点において算出済みである基準平面(つまり、直近に算出された基準平面)とに基づいて、新たな基準平面を算出する。当該新たな基準平面の算出については、例えば以下のような処理を用いる。まず、上記2つの候補面をブレンドすることで新たは基準平面を求めるという方法がある。このとき、現在の基準平面に近いほうに位置する候補面をより信頼するような重み付けを加えて、2つの平面をブレンドするような処理を行う。
例えば、入力装置8と基準平面、および、上記2つの候補面との関係が、図23のような関係とする。図23は、入力装置8のZ軸負方向から見た場合を想定した模式図である。この場合、第1の候補面と現在の基準平面との成す角をθA、第2の候補面と現在の基準平面との成す角をθBとすると、例えば、以下のような式で新たな基準平面を算出する。
重みa=1-cos(θB/2)
重みb=1-cos(θA/2)
比率a=重みa / (重みa+重みb)
比率b=重みb / (重みa+重みb)
新たな基準平面=比率a×第1の候補面+比率b×第2の候補面 ・・・式1
なお、上記の式において、重みaは、第2の候補面が現在の基準平面からずれているほど大きくなり、重みbは、第1の候補面が現在の基準平面からずれているほど大きくなる。
また、上記比率aおよび比率bについては、以下のような式を用いて算出してもよい。
重みa=1-cos(θB/2)
重みb=1-cos(θA/2)
新たな基準平面=比率a×第1の候補面+比率b×第2の候補面
なお、上記式1については、現在の基準平面と各候補面との「近さ」に着目したものであるが、この他、各候補面と重力方向とのなす角度に着目した手法を用いても良い。すなわち、上記Z軸方向と重力方向のなす角と、上記Y軸方向(あるいはY'軸方向)と重力方向のなす角とをそれぞれ算出する。そして、算出した角度が大きいほど、上記式1における加重平均の比率(上記比率aおよび比率b)を高めるようにしてもよい。
また、別の算出方法として、現在の基準平面により近い方の候補面だけを選び、当該候補面と現在の基準平面とをブレンドすることで新たな基準平面を算出するようにしてもよい。候補面と基準平面との関係が上記図23のような関係であるとすると、例えば、以下のような式で算出する。
新たな基準平面=0.9×現在の基準平面+0.1×選択した候補面・・・式2
なお、上記式2では、加重平均の比率を固定(0.9と0.1)している。この式の場合、現在の基準平面の重み付けが高い、つまり、現在の基準平面の信頼度を高くした式となっている。
また、上記式2で固定的に設定している加重平均の比率については、固定的にすることに限らない。例えば、上記「現在の基準平面により近い方の候補面」を算出するための用いた軸(Z軸あるいはY'軸)と重力方向との成す角度が大きいほど、上記式3における加重平均の比率を高めるようにしてもよい。
また、上記「現在の基準平面により近い方の候補面」の代わりに、上記Z軸と重力方向との成す角と、Y'軸と重力方向との成す角とをそれぞれ算出し、成す角が大きいほうの平面を選択するようにしてもよい。つまり、入力装置8が、ゴルフスイングの構えのように、下に下がった状態であればY'軸を用いて算出された候補面をより信頼し、野球のバッターの構えのように、入力装置8が起き上がっているような状態であれば、Z軸を用いて算出された候補面をより信頼して新たな基準平面を算出するようにしてもよい。
なお、上記のブレンド方法はあくまで一例であり、これらに限らず、2つの候補平面および現在の基準平面を適切にブレンドできれば、どのような処理方法を用いても良い。
以上のような算出方法を用いることで、基準平面について、複数の方法で算出した候補面が矛盾する場合は信頼度を考慮しつつゆるやかに補正を行い、一致する場合は大胆に大きく補正するという結果を得ることができる。このように、「重力方向」や「現在の基準平面」との関係に注目することで、プレイヤの入力装置8の持ち方の違いによる計算結果の不安定さ、すなわち、ちょっとした持ち方のぶれでプレイヤの意図しない方向に正面方向(基準平面)が設定される、ということを回避している。
その結果、プレイヤの入力装置8の持ち方に応じて基準平面の位置を補正するような処理が行われていることになる。
[振り下ろし動作反映処理の概要]
次に、上記(1−2)の振り下ろし動作反映処理の処理概要を説明する。本処理は、振り下ろし時の動きを打球パワーに反映させるための処理であり、例えば、プレイヤが大きく振りかぶり、強く振り下ろせば打球パワーが大きく算出され、弱く、あるいはゆっくりと振り下ろせば、それに連れて打球パワーも低下させて算出するような処理である。具体的には、プレイヤがコントローラ振りかぶることで、スイングバー106がパワーゲージ104の一番上(打球パワーの目安として、100%の打球パワーが期待できるような状態)まで上がった場合を想定する。この状態から、プレイヤが素早く振り下ろすようにスイングを行えば、ほぼ100%のパワーを打球パワーに反映する。一方、スイングバー106がパワーゲージ104の一番上まで上がっている状態から、プレイヤが思い直して(例えば、これでは強すぎる、と考えた場合等)、例えばパワーゲージ104の75%くらいの位置(パワーゲージ104の一番下から3/4程度の距離の位置)まで、ゆっくりと入力装置8(ゴルフクラブ102)を下げて(この動きに連動して、スイングバー106も下に下がる)、その位置からスイングした場合は、上述したような100%のパワーではなく、思い直して下ろした後の75%付近のパワーを打球パワーに反映する。このような、振り下ろし動作にかかる内容を打球パワーに反映させるための処理である。
上記のような処理内容を実現するために、本実施形態では、以下のような処理を実行している。まず、スイングバー106に対応する振りかぶり量Hが算出される。振りかぶり量Hの算出については、後述の「パワーゲージ関連処理」についての説明等において説明するが、プレイヤが入力装置8を振りかぶっている量(スイングの角度)が振りかぶり量(つまり、パワーゲージ104内におけるスイングバー106の位置)として算出される。更に、本処理では、この振りかぶり量(スイングバー106)に追従するような追従量T(Tは0.0〜1.0)という値を算出する。当該追従量Tは、以下のような式で算出される。
H<Tのときは
T=T+追従係数Kt×(H−T) ・・・式3
H≧Tのときは、
T=H
上記の式について説明すると、H<Tのとき、というのは、振り下げ動作を行っているときを示し、H≧Tのとき、というのは、主に振り上げ動作を行っているときを示している。そして、振り上げ動作が行われているときは、追従量Tは振りかぶり量Hと同じ値にしておき、振り下げ動作中のみ追従するような値が算出されるようにしている。また、追従係数Ktは、強いスイングのとき(加速度が大きいとき)は追従性を低くし、弱いスイングのとき(加速度が小さいとき)は、追従性を高くするための係数である。当該追従係数Ktは、スイング中の振りの強さを加速度の大きさで捉え、変化させている。具体的には、まず、加速度センサ37から得られる加速度から、重力成分(1.0G)を除去し、更にその絶対値をとったものを「加速度の大きさ」とする。本実施形態では、この絶対値は、0.0G〜1.2Gの範囲内の値になるものとする。そして、この加速度の大きさである0.0G〜1.2Gの値を、0.2〜0.01の範囲内の値に変換して(割り当てて)追従係数Ktとする(つまり、Kt=0.2〜0.01)。
このような算出を行うことで、プレイヤが入力装置8を振りがぶった後、速く振り下ろしたとき、あるいは、強く振り下ろしたときほど、追従量Tは、過去の振りかぶり量の内の最大値(以下、最大振りかぶり量と呼ぶ)に近い値が維持されうる。また、ゆっくり振り下ろす、あるいは弱く振り下ろすと、追従量Tは振りかぶり量Hと共に下がっていくことになる。
なお、上記式3において、(H−T)としているため、振りかぶり量Hと追従量Tの差が大きいときほど、Tの値をより大きく減少させる(追従させる)ことになる。
また、上記のH≧Tのときは、追従量Tの値は振りかぶり量Hを下限とする。つまり、振り下げの動作中であっても、追従量Tの値は振りかぶり量Hの値を追い越して下がってしまわないようにしている。
ここで、打球のパワーの決定に関して、従来のゴルフゲームでは最大振りかぶり量をスイングパワーとしていたが、本実施形態では、ゴルフクラブ102とボール103がインパクトしたときに最終的な打球のパワー(以下、打球パワーP)が決定される。このときに、上記最大振りかぶり量、あるいは、上記振りかぶり量Hの値をそのまま打球パワーPとして用いるのではなく、上記追従量Tの値を打球パワーPとして用いる。つまり、振りかぶり量Hを補正した値に相当する追従量Tを打球パワーPとして用いる。これにより、上述のような速く振り下ろしたときと、ゆっくり振り下ろしたときの打球パワーPの違いを実現することができる。しかし、本実施形態では、更に、打球パワーPの決定に際して、以下のような処理を行うことで最終的な打球パワーPを決定している。
本実施形態では、上記追従量Tに加え、更に、「過剰な振り強さS」という要素を算出する(Sは0.0〜1.0)。これは、例えば「力を込めた強い振り下ろし方」と「力はあまり込めていない軽い振り下ろし方」等のような、スイングにかかる振り下ろしの「強さ」を評価し、打球パワーに反映しようとするものである。上記追従量Tの計算方法、特にスイング中の加速度が大きいときほど追従係数Ktを小さくする計算によって、強く振れば振るほど(加速度が大きいほど)、打球パワーPは大きくなる。しかし、その上限値は振りかぶり量Hの最大値に等しいので、逆に言うと、どんなに強く振ってもそれ以上の打球パワーを出すことはできない。そこで、強く振っても打球パワーP(追従量T)に影響しないような過剰なスイング中の加速度を「過剰な振り強さS」として評価し、改めて打球パワーPに上乗せすることを考える。本実施形態では、この「過剰な振り強さ」を一連のスイング動作を通じて評価する方法として、仮想的にスイング中の加速度を目減りさせて計算してみて打球パワーPがどう変化するかを観察する方法をとる。例えば、上記振りかぶり量Hの状態から振り下ろしたときの「振りおろしの強さ」を100%とした場合に、加速度が2割しか出ていなかったと仮定して(つまり、加速度を8割引いて)上記追従量Tを再計算する。このように加速度を小さく見積もって再計算すると、上記追従量T等の要素もあり、最終的に、例えば、60%〜80%の「振りおろしの強さ」が算出されることが予想される。このように加速度を8割引で計算したにも関わらず、元の「振りおろしの強さ」との差が小さい(再計算結果が80%程度の値)、つまり、あまり元の強さと変化がない場合は、もともとの加速度値が大きすぎると評価することができる。一方、元の「振りおろしの強さ」との差がより大きい(再計算結果が60%程度の値)であれば、加速度的には無駄がなかったと評価することができる。つまり、加速度の目減りに応じて打球パワーPが下がれば加速度的に無駄のないスイング、加速度を目減りさせても打球パワーPがあまり下がらなければ、もともとの加速度値が大きすぎる、即ち、加速度的に過剰なスイングと考える。そこで、この元の「振り下ろしの強さ」と加速度を割り引いて再計算した「振り下ろしの強さ」との算出結果の差を「過剰な振り強さS」として評価する。
具体的には、以下のような処理を行っている。まず、スイング中の加速度が、実際の2割しか出ていなかったと想定して(加速度を8割差し引いて)、上記追従量Tの算出と同じ計算を行い、その結果を割引追従量T'とする(本実施形態では、T'は0.0〜1.0)。そして、上記追従量Tと割引追従量T'とを比較し、その差をみる。その結果、両者の差が小さい場合は、より力の込められたスイング(加速度的に過剰なスイング)が行われていたとして扱い、両者の差が大きい場合は、実際のスイングの強さは(ゲーム処理上において)適当な強さの振り(加速度的に無駄のないスイング)として扱う。
より具体的な算出方法について説明する。本実施形態では、まず、T'/Tを計算する。そして、その算出結果のうち0.6〜0.8の範囲内の値を上記過剰な振り強さS(0.0〜1.0)に割り当てる。そして、当該過剰な振り強さSと追従量Tとを用いて、以下の式で最終的な打球パワーPを算出する。
P=T+係数Ks×S ・・・式4
ここで、係数Ksは、Sの重み付けを示しており、本実施形態では0.25とする。つまり、過剰な振り強さSの25%を追従量Tに上乗せすることで、打球パワーPを決定している(なお、係数Ksの値は、ゲームバランス等を考慮して適宜決められる値である)。
上記のように、追従量T、および、過剰な振り強さSという要素を加味して打球パワーPを算出する処理を行うことで、本実施形態では、振り下ろしのときの動作内容を打球パワーに反映させることが可能となっている。例えば、スイングバー106を100%の度合い(スイングバー106がパワーゲージ104の一番上まで上がった状態)まで振り上げた後、素早く振り下ろせば、ほぼ100%の打球パワーが得られるが、ゆっくり振り下ろせば、それに連れてより低下した打球パワーになるという処理を実現することができる。
[バックスピン処理の概要]
次に、上記(1−3)のバックスピンに関する処理の概要について説明する。上記のように、スイングの動作について、最後まで振り切らずに、途中でゴルフクラブを止めるようなスイングを行うことで、打球にバックスピンをかけることができる。このような動きを実現するため、本実施形態では、ゴルフクラブのヘッド部分の「しなり」を想定して利用する。より具体的には、「スイングによって後方にしなり、スイングが止まるとしなりが戻り、場合によっては惰性でさらに前方にしなる」ような「しなり」のモデルを利用する。
上記のようなモデルにおける、スイング中のクラブヘッドのしなりを考えると、普通にスイングした場合、ゴルフクラブを振りあげ、振り下ろし始めてクラブヘッドがボールに当たるまでは、クラブヘッド部分は後方にしなる。そして、上記のようにスイングを急に止めたとき、つまり、制動力がかかったとき、クラブヘッド部分は惰性で前方にしなると考えられる。そこで、本実施形態では、この前方へのしなりの最大値を拾い、バックスピン率に反映するという処理を実行している。つまり、スイング(クラブ)が止まった後、惰性でどこまで前方(ボールが飛ぶ方向)にしなるかを測り、そのしなり具合に応じてバックスピン率(バックスピンの強さ)を設定するという処理を行っている。
図24に、当該ヘッド部分のしなりの一例を模式的に示す。図24においては、角度θは上記の振りかぶり角度を示す。角度θh(以下、追従角度と呼ぶ)は、しなっているクラブのヘッド部分の角度を示す。そのため、しなり角φは、次の式で算出することができる(図24では、φ<0の状態である)。
φ=θh−θ ・・・式5
そして、当該しなり角φが前方(φ>0)になったときの変化を監視しておき、前方への変化のうちの最大値を拾い、バックスピン率に反映する。
上記のようなしなりを、「バネ」と「ダンパー」を用いてモデル化したものを図25に示す。図25では、クラブのヘッド部分が、「ばね」Kpと「ダンパー」Kdでクラブの本体部分に接続されているようなモデルを示している。本実施形態では、このようなモデルを用いて、クラブヘッド部分のしなりをシミュレートする。具体的には、まず、以下の式を用いて、ヘッド部分の加速度Aを算出する。
A=−Kp(θh−θ)−Kd(θhd−θd)・・・式6
ここで、変数θhdは、前フレームのθhと現在のフレームとのθhの差分を示す。また、変数θdは、前フレームにおけるθと現在のフレームとのθの差分を示す。また、上記式6の「−Kp(θh−θ)」におけるθhは、前フレームにおける追従角度θhであり、θは現在の振りかぶり角度θである。
更に、変数Kp(ばね)およびKd(ダンパー)に関して、本実施形態では、振りかぶり角度θの絶対値に応じて変数KpおよびKdを更新している。つまり、しなり特性を振りかぶり角度θに応じて変化させている。これは、インパクト付近ではしなりやすく、遠いときはしなりにくくするためである。その結果、インパクト付近でクラブを止めたほうがバックスピンがかかりやすくなり、最後まで振り切ると、バックスピンがかかりにくくなるようになる。
そして、上記加速度Aを用いてクラブヘッド部分の速度を算出し、この速度に基づいて、追従角度、すなわち、ヘッド部分の角度(位置)θhを算出する。追従角度θhが算出できれば、上記式5を用いてしなり角φを算出できる。
その後、前方への最大のしなり角φを用いて、バックスピン率Kを更新するという処理を行っている。なお、本実施形態では、このとき、クラブの種類や打球のパワーに応じて、しなり角φをバックスピン率に反映させる割合を変化させる処理も行っている。
このような処理を行うことで、スイング中に、インパクト付近でクラブを止めればバックスピンをかけることができ、更に、クラブを止める前にスイングの勢いがあれば、(クラブヘッドが惰性でより前方にしなるため)より強いバックスピンをかけることができるという処理が可能となる。
[パワーゲージ関連処理の概要]
次に、上記(2)パワーゲージ関連処理の概要について説明する。本実施形態では、上記のように、手首の捻り(Z軸回りの回転)と上述したような振りかぶり量Hを算出し、振りかぶり量Hは、スイングバー106として表示すると同時に、捻り具合については、パワーゲージ104の形状自体を湾曲させることで、2つの異なる要素を1つのパワーゲージでまとめて表現している。
本実施形態では、捻り角度については、以下のようにして算出している。具体的には、まず、上述したように、構え直し操作時に、上記基準平面が算出される。このときに、当該基準平面に対する入力装置8のX軸の角度を算出して記憶する(以下、この角度を基準X角度と呼ぶ)。図26に、当該基準X角度の概念を示す模式図を示す。図26は、入力装置8が真下を向いている状況を想定して、Z軸の負方向から見た場合を示している。図26では、基準平面に対する入力装置8のX軸方向の角度は90°となっている。
次に、スイング中(基準平面設定後の毎フレームの処理)、その時々の姿勢から、上記基準平面の算出手法と同じ手法を用いて、仮想的な基準平面を算出する(以下、仮想基準面と呼ぶ)。そして、当該仮想基準面に対する、入力装置8のX軸方向の角度を算出する。例えば、入力装置8の状態が、Z軸は真下に向いたまま、少し右に傾いたような状態と仮定し、Z軸と重力方向を含む平面である仮想基準面と、当該仮想基準面に対するこのときのX軸方向の角度が図27に示すような状態であるとする(以下、この角度を現在X角度と呼ぶ)。このときの現在X角度は、例えば100°であるとする。そして、上記の基準X角度と、当該現在X角度との角度差を算出し、この角度差を捻り角度として扱う。上記の例では、100°−90°=10°が捻り角度として扱われることになる。そして、このようにして算出された捻り角度に基づいて、パワーゲージ104の形状をスイング動作中(ショットするまでの間)にリアルタイムに湾曲させて表示する。例えば、パワーゲージ104の湾曲度を−1.0〜1.0の範囲内の値(負の値が左に湾曲することを示し、正の値が右に湾曲することを示す)で定義しておき、図28に示すように、捻り角度の値をこの範囲内の値に線形のグラフとなるように割り当てることで、パワーゲージ104の湾曲度を算出する。そして、当該湾曲度に基づいてパワーゲージ104の形状を湾曲させる。
なお、捻り角度に関しては、Z軸の角速度だけを用いて捻り角度を算出することも考えられるが、実際の振り動作はZ軸まわりの回転だけでなくX軸まわりの回転やY軸まわりの回転の組み合わせによって行われる。そのため、例え「Z軸の角速度の積算値」がゼロであっても、手首の捻りがないとは言い切れないことが考えられる。そのため、本実施形態では、上記のように、入力装置8の姿勢に基づく平面を利用して算出する。
一方、振りかぶり量Hについては、基準姿勢を基準とした場合の、ゴルフクラブ102(入力装置8)を振りかぶっている角度、すなわち、入力装置8のZ軸がどのくらい地面から起き上がっているか、を計算する。そして、この振りかぶり角度を振りかぶり量Hに変換し、スイングバー106の位置に反映させる。これは、ゴルフスイングの場合、入力装置8のZ軸正方向が下を向いている状態が基本的な姿勢と考えられるため、この状態を基準としてZ軸の傾きを見ることで、振りかぶっている角度を把握することができる。
より具体的には、本実施形態では、以下のようにして振りかぶり量Hを算出する。まず、上記基準平面を基にして、図29に示すような、重力上方向をY方向、当該平面に対する垂直方向をX方向とする座標系{L}を設定する。以下、当該座標系を「{L}座標系」と呼ぶ。
次に、スイング中の入力装置8のローカル座標系におけるZ軸正方向を上記{L}座標系に変換したベクトルDを算出する。
そして、当該ベクトルDの3軸成分(Dx、Dy、Dz)に基づき、以下の式を基づいて、振りかぶり角度θを算出する。
θ=Atan(Dx,−Dy+K×Dz)・・・式7
なお、変数K>0であるとする。また、上記式においては、水平にスイングされる場合(野球のようなスイング)を考慮して、Dzの要素を加味している。すなわち、DxおよびDyが共にゼロに近づいたとき(入力装置8が水平に構えられているような状態)のときに、角度の算出が不安定となることを防いでいる。また、Dzがプラス側にあれば、実際よりも入力装置8を下に向けているのと同じ効果があり、マイナス側では、実際よりも入力装置8を上に向けるのと同じ効果が得られる。つまり、水平に振っていても(野球のようなスイングをしていても)、縦に振っている場合(ゴルフスイング)とある程度同じような効果を得ることができる。
上記の式を用いた結果、構え直し操作が行われたときの姿勢(Bボタン32iが押されたときの姿勢)のときは、θ=0となる。また、前方(ゴルフボールを飛ばす方向)に入力装置8を振ると、θは正の値として算出される。また、入力装置8を振りかぶると、θは負の値として算出される。このように算出された振りかぶり角度θを振りかぶり量Hに変換する。例えば、振りかぶり角度θを−180°〜+180°の範囲とし、振りかぶり量Hは0.0〜1.0の範囲の値として、図30に示すような線形のグラフに基づいて振りかぶり角度θの絶対値を振りかぶり量Hに変換する。そして、当該振りかぶり量Hに応じてスイングバー106を上下させることで、振りかぶっている量を表示する。なお、本実施形態では、振りかぶり量Hが0.0のときは、スイングバー106はパワーゲージ104の一番下に来るものとし、振りかぶり量Hが1.0のときは、スイングバー106はパワーゲージ104の一番上に来るものとする。
このように、本実施形態では、上記のような捻り角度をパワーゲージ104の湾曲で示すと同時に、スイングバー106をパワーゲージ104内で上下させることで、例えば上記図18に示したような表示を行い、振りかぶり量(打球のパワーの目安)と手首の捻り具合(フェースの開き具合)という2つの要素をまとめて表示している。これにより、ショット時にゴルフボールに与える影響に関してプレイヤに直感的に把握させることが可能となる。
[構え直しガイド処理の概要]
次に、上記(3)構え直しガイドの表示処理の概要について説明する。上述のように、本実施形態では、上記図12で示したような、Bボタン32iの押下による「構え直し」操作を推奨する、構え直しガイド105を適切なタイミングで表示する。構え直しガイド105の表示タイミングについては、基本的には、Bボタン32iが押されたタイミングで内部的なカウンタ(以下、ガイド表示カウンタと呼ぶ)を用いてカウントアップを開始する。その後、毎フレーム、カウントアップされ、当該ガイド表示カウンタが所定値以上となれば、当該構え直しガイド105を表示するという処理を行っている。但し、本実施形態では、上記の「適切なタイミング」を決定するために、「構え直しの必要度」(以下、必要度Kr)と、「構え姿勢をとっている可能性」(以下、構え姿勢可能性Ks)を算出し、上記のカウントアップに反映する処理を行っている。更に、所定のタイミングでガイド表示カウンタのリセットも行うことで、「適切なタイミング」をより正確なものとしている。具体的には、以下のタイミングで上記ガイド表示カウンタをリセットしている。
(1)Bボタン32iが押されたとき。
(2)入力装置8の姿勢が、「構えなおし」のときに期待される姿勢(アドレスの姿勢)と大きく異なっているとき。例えば、入力装置8のZ軸正方向が水平より上を向いており、かつ、Y軸正方向が水平より下を向いているような場合(野球のバッターのような構え)。
(3)スイング中の状態の時。これは、角速度や加速度の絶対値が所定値以上か否かで判定する。具体的には、角速度については、その絶対値が30deg/secより大きいか否か、加速度については、その絶対値が0.2Gより大きいか否か。
次に、上記必要度Kr、および、構え姿勢可能性Ksの算出方法等について説明する。まず、上記必要度Krとは、構え直しが必要であると考えられる度合いのことである。また、構え姿勢可能性Ksとは、プレイヤが構えの状態をとっている可能性である。ここでいう「構えの状態」とは、入力装置8の前面をある程度下側に向けているような状態(アドレスに近い状態)を想定するものである。つまり、ゴルフクラブを振りかぶっているような状態は除外される。
上記必要度Krの算出について、本実施形態では、以下のようにして算出している。まず、「今この瞬間にBボタンを押した」と仮定して仮の基準平面を作り、現在の基準平面との角度差の絶対値を算出する(当該2平面のなす角度とは、面法線と面法線のなす角度である)。そして、この角度差が0°であれば、構え直し不要と判定し、11°以上であれば、構え直しが必要と判定する。
ここで、必要度Krは0.0〜1.0の範囲の値をとるとし、0.0が構え直しの必要性がないことを示し、1.0が、構え直しの必要性が高いことを示す。すなわち、上記角度差が0°のときはKr=0.0、角度差が11°のときはKr=1.0とする。そして、0°〜11°の間のKrの値は、線形補間によって算出するものとする。
次に、構え姿勢可能性Ksの算出については、角速度の安定状態Sw、加速度の安定状態Sa(つまり、激しい動きが発生していない状態)と、構え直し姿勢の正しさStという要素を用いて算出する。まず、角速度の安定状態Swについては、スイング中ではないと考えられるときの角速度、すなわち、角速度の絶対値が30deg/sec以下の場合に、当該角速度の絶対値を0.0〜1.0の値に換算してSwに割り当てる。加速度の安定状態Saについても同様に、スイング中の動きではないと考えられる加速度の絶対値0G〜0.2Gを、Sa0.0〜1.0の範囲に割り当てる。
次に、構え直し姿勢の正しさStという要素は、入力装置8を下に下ろしている度合いを示す要素である。これは、入力装置8のX軸がどの程度水平状態に近いかによって示される。図31に、構え直し姿勢の正しさStの概念を示す。図31(a)に示すように、入力装置8の前面を下方に下げている状態であれば、入力装置8のローカル座標系におけるX軸は、水平状態(図31(d)参照)となる。この状態を、理想的な構え直し姿勢とすれば、その時々において算出される入力装置8の姿勢のX軸が水平か否かを見ることで(図31(b)、(c)参照)、構え直し姿勢の正しさStを算出することが可能となる。より具体的には、X軸の重力方向成分の絶対値を算出し、0.0〜1.0の範囲の値で示すことで、構え直し姿勢の正しさStとする。
そして、上記の要素を用いて、構え姿勢可能性Ksを以下の式で算出する。
Ks=Sw×Sa×St ・・・式8
上記のようにして必要度Kr、および、構え姿勢可能性Ksが算出できれば、これに基づき、以下の式を用いてガイド表示カウンタCをカウントアップしていく。
C=C+Kr×Ks ・・・式9
そして、ガイド表示カウンタの値が30を越えれば、上記図12に示したような構え直しガイド105を表示する処理を実行する。これにより、「構え直し」が必要で効果的なタイミングを測って構え直しガイド105を表示することができ、プレイヤによる構え直し操作がより適切なタイミングで行われることが期待できる。
次に、ゲーム装置本体3によって実行されるゲーム処理の詳細を説明する。まず、ゲーム処理の際に外部メインメモリ12に記憶されるデータについて説明する。図32は、ゲーム装置3の外部メインメモリ12のメモリマップを示す図である。図32において、外部メインメモリ12は、プログラム記憶領域121およびデータ記憶領域126を含む。プログラム記憶領域121およびデータ記憶領域126のデータは、光ディスク4に記憶され、ゲームプログラム実行時には外部メインメモリ12に転送されて記憶される。
プログラム記憶領域121は、CPU10によって実行されるゲームプログラムを記憶し、このゲームプログラムは、メイン処理プログラム122と、スイング関連処理プログラム123と、インパクト関連処理プログラム124などによって構成される。メイン処理プログラム122は、後述する図35のフローチャートの処理に対応するプログラムである。スイング関連処理プログラム123は、プレイヤが行うスイング動作に関する各種処理をCPU10に実行させるためのプログラムであり、インパクト関連処理プログラム124は、インパクトが発生したか否かを判定するための処理等をCPU10に実行させるためのプログラムである。また、ボール移動処理プログラム125は、打球を移動させるための処理をCPU10に実行させるためのプログラムである。
データ記憶領域126には、操作データ127やゲーム処理用データ128などのデータが記憶されるとともに、ゲーム処理中に一時的に用いられる各種フラグや変数も記憶される。
操作データ127は、コントローラ5からゲーム装置3へ送信されてくる操作データである。上述したように、コントローラ5からゲーム装置3へ1/200秒に1回の割合で操作データが送信されるので、外部メインメモリ12に記憶される操作データ127はこの割合で更新される。本実施形態においては、外部メインメモリ12には、最新の(最後に取得された)操作データのみが記憶されればよい。
操作データ127には、図33に示すように、角速度データ131、加速度データ132、マーカ座標データ133、および操作ボタンデータ134が含まれる。角速度データ131は、ジャイロセンサユニット7のジャイロセンサ55および56によって検出された角速度を示すデータである。ここでは、角速度データ131は、図3に示すXYZの3軸回りのそれぞれの角速度を示す。また、加速度データ132は、加速度センサ37によって検出された加速度(加速度ベクトル)を示すデータである。ここでは、加速度データ132は、図3に示すXYZの3軸の方向に関する加速度を各成分とする3次元の加速度ベクトルを示す。また、本実施形態においては、コントローラ5が静止している状態で加速度センサ37が検出する加速度ベクトルの大きさを"1"とする。つまり、加速度センサ37によって検出される重力加速度の大きさは"1"である。
マーカ座標データ133は、撮像情報演算部35の画像処理回路41によって算出される座標、すなわち上記マーカ座標を示すデータである。マーカ座標は、撮像画像に対応する平面上の位置を表すための2次元座標系で表現される。なお、撮像素子40によって2つのマーカ6Rおよび6Lが撮像される場合には、2つのマーカ座標が算出される。一方、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lのいずれか一方が位置しない場合には、撮像素子40によって1つのマーカのみが撮像され、1つのマーカ座標のみが算出される。また、撮像素子40の撮像可能な範囲内にマーカ6Rおよび6Lの両方が位置しない場合には、撮像素子40によってマーカが撮像されず、マーカ座標は算出されない。したがって、マーカ座標データ133は、2つのマーカ座標を示す場合もあるし、1つのマーカ座標を示す場合もあるし、マーカ座標がないことを示す場合もある。
操作ボタンデータ134は、各操作ボタン32a〜32iに対する入力状態を示すデータである。
ゲーム処理用データ128は、図34に示すように、入力装置姿勢データ141と、基準平面データ142と、基準X角度データ143と、仮想基準面データ144と、現在X角度データ145と、捻り角度データ146と、振りかぶり量データ147と、{L}座標系データ148と、ベクトルDのデータ149と、第1の候補面データ150と、第2の候補面データ151と、前回振りかぶり角度データ152と、前回追従角度データ153と、前回しなり角データ154と、ガイド表示カウンタ155と、打球パワーデータ156と、バックスピン率データ157と、打球パラメータ158と、現在状態データ159と、画像データ160と、ショットフラグ161と、飛球中フラグ162と、バックスピンフラグ163と、終了フラグ164等が記憶される。
入力装置姿勢データ141は、入力装置8の姿勢を示すデータである。ここで、本実施形態では、入力装置8の姿勢を、互いに直交する3つのベクトルの組(すなわち、X軸、Y軸、Z軸)で表す。そして、本実施形態では、電源投入時、あるいは、ゲーム処理の開始時に、初期値として、ワールド座標系における入力装置8の姿勢(すなわち、入力装置8のローカル座標系でみた姿勢)をX軸=(1,0,0)、Y軸=(0,1,0)、Z軸=(0,0,1)と設定する。そして、ゲーム処理の開始後は、入力装置姿勢データ141で示される姿勢は、ジャイロセンサユニット7から取得した値に基づき、ワールド座標系に対する姿勢として算出されるものとする。
基準平面データ142、基準X角度データ143は、上述したような基準平面、基準X角度を示すデータである。なお、本実施形態における各種平面を示すデータの保存形式については、各種平面が重力方向を含む(平行である)ため、平面を定めるという意味で、重力方向を軸とする回転の角度データを保存すればよい。また、冗長ではあるが、後述するような処理において利用しやすいという利点から、平面に含まれる水平ベクトル(重力方向と垂直なベクトル)1軸をデータとして保存するようにしても良い。更に、重力上方向のベクトル1軸と面の法線ベクトル1軸を加えて、3軸のベクトルデータとして保存しても良い。
仮想基準面データ144、現在X角度データ145は、上述したような捻り角度の算出等のために用いる仮想基準面、現在X角度を示すデータである。また、捻り角度データ146は、算出された上記捻り角度を示すデータである。
振りかぶり量データ147は、上記振りかぶり量Hに対応するデータであり、{L}座標系データ148は、上記{L}座標系(上記図29参照)を示すデータである。また、ベクトルDのデータ149は、図29で示したベクトルDを示すデータである。
第1の候補面データ150および第2の候補面データ151は、基準平面を算出するために用いられる上記第1の候補面と第2の候補面を示すデータである。
前回振りかぶり角度データ152、前回追従角度データ153、前回しなり角データ154は、インパクトの発生の判定等に用いられるデータであり、直前の処理ループにおいて算出された振りかぶり角度等の値を記憶したものである。
ガイド表示カウンタ155は、上記図12で示したような構え直しガイド105を表示するタイミングを測るためのカウンタである。
打球パワーデータ156は、打球のパワーを示すデータである(上記打球パワーPに対応するデータである)。バックスピン率データ157は、上記バックスピン率を示すデータである。また、打球パラメータ158は、打球を移動させるために用いる各種パラメータであり、打球が移動する軌道(弾道)や移動速度等のパラメータが含まれる。
現在状態データ159は、現在選択しているゴルフクラブの種類や、現在の場所に関するデータ(フェアウェイかラフか等)、風の向きや風の強さ等、仮想ゲーム空間内におけるプレイヤオブジェクトを取り巻く環境に関するデータが含まれる。
画像データ160は、ゲーム画像として表示される各種画像のデータである。上記構え直しガイド105の画像もこれに含まれる。
ショットフラグ161は、スイングの際にAボタン32dが押されているか否か、つまり、プレイヤが行うスイングが素振りか否かを判定するためのフラグであり、Aボタン32dが押されているときはオンに設定される。
飛球中フラグ162は、インパクトが発生する前(ボールが打たれる前)か、インパクトの発生後(ボールが打たれた後)かを判定するためのフラグである。当該フラグは、インパクト発生前はオフに設定され、インパクトが発生すれば、オンに設定される。
バックスピンフラグ163は、バックスピン率の算出処理を実行する必要があるか否かを示すフラグである。当該フラグは、インパクト発生と共にオンに設定され、その後、バックスピン率の算出が終わればオフに設定される(本実施形態では、インパクトの発生後、打球が着地するまでの間にバックスピン率の算出処理が実行されるため)。
終了フラグ164は、一打分に係る処理が終了したか否かを示すためのフラグである。
次に、図35〜図53を参照して、ゲーム装置3によって実行されるゲーム処理について説明する。ゲーム装置3の電源が投入されると、ゲーム装置3のCPU10は、ROM/RTC13に記憶されている起動プログラムを実行し、これによってメインメモリ33等の各ユニットが初期化される。そして、光ディスク4に記憶されたゲームプログラムが外部メインメモリ12に読み込まれ、CPU10によって当該ゲームプログラムの実行が開始される。なお、図35〜図37に示すフローチャートは、ゴルフにおける一打分の処理を示したものであり、プレイヤによる一打分の動作毎に、図35〜図37のフローチャートの処理が実行される。また、図35〜図37に示すステップS1〜ステップS21の処理ループは、1フレーム毎に繰り返し実行される。
図35において、まず、CPU10は、初期化処理を実行する(ステップS1)。この処理では、各種フラグや変数の初期化が実行される。
次に、CPU10は、操作データ127を取得する(ステップS2)。続いて、CPU10は、飛球中フラグ162がオンか否かを判定する(ステップS3)。これは、インパクト前か後かを示すフラグである。当該判定の結果、移動中フラグがオンのとき、すなわち、インパクト後の状態であれば(ステップS3でYES)、ステップS4の処理に進む。このときの処理については後述する。
一方、飛球中フラグ162がオフのときは(ステップS3でNO)、ボール103のインパクト前であるため、CPU10は、次に、環境設定処理を実行する(図36のステップS5)。この処理では、ショットに関連する環境の設定がなされる。例えば、プレイヤオブジェクト101の現在位置がフェアウェイかラフ、あるいはバンカーか等を判定し、打球パワーの上限を制限するような設定や、ボールの射出方向を地形等に応じて変更する処理が実行される。また、ここで設定された内容を示すデータは、現在状態データ159として外部メインメモリ12に記憶される。なお、当処理は、本発明の内容とは直接関連しないため、詳細な説明は省略する。
次に、CPU10は、上記ステップS2で取得した操作データ127で示される操作内容が、スイング操作以外の操作にかかる内容であるか否かを判定する(ステップS6)。スイング操作以外の操作とは、例えば、ゴルフクラブを選択するための操作や、ショットする方向を変化させる(仮想カメラの向きを変える)ための操作等、本発明の内容に関わること以外の操作である。なお、ゴルフクラブの選択操作が行われたときは、選択したゴルフクラブの種類(ドライバやアイアン等)を示すデータは現在状態データ159の一部として外部メインメモリ12に記憶される。
当該判定の結果、スイング操作以外の操作が行われていたときは(ステップS6でYES)、CPU10は、後述するステップS19の処理に進む。一方、スイング操作以外の操作ではないときは(ステップS6でNO)、次に、CPU10は、操作データ127で示される操作内容がBボタン32iの押下であるか否かを判定する(ステップS7)。当該判定の結果、Bボタン32iが押されていたときは(ステップS7でYES)、CPU10は、構え直し処理を実行する(ステップS8)。当該構え直し処理においては、上述したような基準平面を算出する処理等が実行される。
図38は、上記ステップS8で示した構え直し処理の詳細を示すフローチャートである。図38において、まず、CPU10は、上記操作データ127に含まれる加速度データ132および角速度データ131に基づいて入力装置8の姿勢を算出する処理を実行する(ステップS31)。本処理は、どのような処理方法であっても良いが、本実施形態では、上記のように、まず、ジャイロセンサユニット7で検出された角速度に基づいて入力装置8の姿勢を算出する。角速度から姿勢を算出する方法は、例えば、初期姿勢に(単位時間あたりの)角速度を逐次加算する方法がある。すなわち、ジャイロセンサユニット7から逐次出力される角速度に基づいて、初期状態から開始して、前回算出された姿勢に逐次変化を加えて更新していくことによって、現在の姿勢を算出することができる。次に、加速度センサ37で検出された加速度データに基づいて上記角速度から算出された姿勢を補正する。本実施形態では、上記角速度から算出された姿勢を加速度データから決まる姿勢へと近づける補正を行う。次に角速度による姿勢の更新を行うときには、当該補正された姿勢にたいして角速度を加えることになる。加速度データから決まる姿勢とは、具体的には、加速度データが示す加速度の向きが鉛直下向きであると想定する場合における入力装置8の姿勢を指す。すなわち、加速度データが示す加速度が重力加速度であると仮定して算出された姿勢である。加速度によって決められる姿勢は、センサが静止しているときには正確だが、動いているときには誤差があるという性質がある。一方、ジャイロセンサは、センサ出力に誤差が含まれる場合に、算出された姿勢には時間と共に誤差が蓄積していくという性質がある。したがって、常に補正を加えながら姿勢を更新していくことによって、誤差の少ない姿勢が算出される。このようにして補正された姿勢が、入力装置姿勢データ141として外部メインメモリ12に記憶される。以下(この姿勢のことを、現在姿勢と呼ぶ)。なお、加速度データを反映させない場合は、角速度の積分結果を初期姿勢に反映させた姿勢としてもよい。
次に、CPU10は、基準平面設定処理を実行する(ステップS32)。図39は、当該基準平面設定処理の詳細を示すフローチャートである。図39において、まず、CPU10は、現在の入力装置8のローカル座標系でのZ軸(以下、ローカルZ軸と呼ぶ)方向と、重力方向とを含む平面を第1の候補面として算出し、第1の候補面データ150として外部メインメモリ12に記憶する(ステップS41)。
次に、CPU10は、現在姿勢におけるローカルZ軸を重力方向に向けるような回転行列を算出する。そして、現在の入力装置8のローカル座標系におけるY軸(以下、ローカルY軸と呼ぶ)に対して、上記算出した回転行列を適用することで、Y'軸を算出する(ステップS42)。
次に、CPU10は、当該Y'軸と重力方向とを含む平面を第2の候補面として算出し、第2の候補面データ151として外部メインメモリ12に記憶する(ステップS43)。
次に、現在の基準平面(直近に算出された基準平面)と、上記第1の候補面、第2の候補面と現在の判定面とのなす角(上記図23のθA、θB)をそれぞれ算出する(ステップS44)。次に、上記の角度に基づき、上述した式1(式2や式3でもよい)を用いて、新たな基準平面を算出し、基準平面データ142として外部メインメモリ12に記憶する(ステップS45)。
ここで、ゲーム処理の開始後、当該処理が初めて実行されるときは、まだ基準平面が算出されていない状態である。そのため、初回実行時のみ、基準平面を以下のようにして算出する。すなわち、CPU10は、上記第1の候補面と第2の候補面とがなす角(θA+θB)を2分割するような平面を算出し(つまり、2つの角の平均をとる)、この平面を新たな基準平面とする。
なお、初回実行時における基準平面の算出にすいては、上記のような方法の他、次のような方法を用いて算出しても良い。すなわち、Z軸方向と重力方向との角度差を第1の候補面の重みとし上記Y'軸方向と重力方向との角度差を、第2の候補面の重みとする。そして、第1の候補面と第2の候補面の加重平均をとることで、新たな基準平面としてもよい。
次に、CPU10は、(新たな)基準平面に基づいて、上述したような{L}座標系(上記図29参照)を設定する(ステップS46)。
次に、CPU10は、上記ローカルZ軸が基準平面に平行になるような仮想的な回転を、現在の入力装置8のX軸(以下、ローカルX軸と呼ぶ)に適用することで、X'軸を算出する(ステップS47)。図40は、当該処理の概要を示す図である。図40(a)は、実際の入力装置8の姿勢を示し、図40(b)は、上記のような回転を加えたことによる、入力装置8の仮想的な姿勢の状態を示している。
次に、CPU10は、上記基準平面に対する上記X'軸の角度を算出し、基準X角度データ143として外部メインメモリ12に記憶する(ステップS48)。以上で、基準平面設定処理は終了する。
図37に戻り、基準平面設定処理が終了すれば、次に、CPU10は、プレイヤオブジェクト101の姿勢制御等を行う(ステップS33)。すなわち、CPU10は、上記算出した現在姿勢に基づいてゴルフクラブ102等の位置を移動したり、プレイヤオブジェクト101に、構え直しを行っている様子を取らせる(例えば、ゴルフクラブを握り直すようなそぶりを行わせる)処理を実行したりする。
次に、CPU10は、構え直しガイド105の表示(上記図12参照)のために用いるガイド表示カウンタ155をリセットする(ステップS34)。
次に、CPU10は、パワーゲージ104の表示内容を初期化する(ステップS35)。具体的には、パワーゲージ104の形状を、上記図8や図12で示したように真っ直ぐな状態とし、スイングバー106の位置をパワーゲージ104の一番下に設定する。以上で、構え直し処理は終了する。
図36に戻り、構え直し処理が終了すれば、次に、CPU10は、描画処理を行う(ステップS20)。すなわち、仮想カメラで仮想ゲーム空間を撮影した画像をゲーム画像としてテレビ2に表示する処理が実行される。ステップS20の後、CPU10は、終了フラグ164がオンか否かでゲーム終了か否かを判断し(ステップS21)、YESの場合、ゲーム処理を終了し、NOの場合、ステップS2に戻って、ゲーム処理を繰り返す。
次に、上記ステップS7で、Bボタン32iが押されていないと判定されたときの処理(ステップS7でNO)について説明する。このときは、次に、CPU10は、操作データ127の操作内容がAボタンの押下であるか否か、つまり、Aボタン32dが押されているか否かを判定する(ステップS9)。
当該判定の結果、Aボタン32dが押されているときは(ステップS9でYES)、プレイヤが行うスイングが、「素振り」ではなく、ボールを打ちに行く「ショット」動作として扱うための設定処理が行われる。まず、CPU10は、ショットフラグ161がオンか否かを判定する(ステップS13)。その結果、ショットフラグ161がオンでないときは(ステップS13でNO)、Aボタン32dが押された直後の状態と考えられるため、CPU10は、ショットフラグ161をオンに設定する(ステップS14)。次に、プレイヤオブジェクト101をボール103の位置に向けて前進させる(近づける)ような制御(上記図8から図10の状態にするような制御)を実行する(ステップS15)。その後、CPU10は後述するステップS16の処理に進む。
一方、ステップS13の判定の結果、ショットフラグ161がオンに設定されていれば(ステップS13でYES)。Aボタン32dが押され続けている状態と考えられるため、CPU10は後述のステップS16の処理に進む。
一方、上記ステップS9の判定の結果、Aボタン32dが押されていないときは(ステップS9でNO)、プレイヤが行うスイングを「素振り」として扱うための設定処理を行うことになる。まず、CPU10は、ショットフラグ161がオンか否かを判定する(ステップS10)。その結果、ショットフラグ161がオンであれば(ステップS10でYES)、Aボタン32dを押し続けていた状態からAボタン32dを離した直後の状態と考えられるため、CPU10は、ショットフラグ161をオフに設定する(ステップS11)。次に、CPU10は、プレイヤオブジェクト101をボール103の位置から後退させるような制御(上記図10から図8の状態に戻す)を行う(ステップS12)。その後、CPU10は、後述のステップS16の処理に進む。
一方、ステップS10の判定でショットフラグ161がオフと判定されたときは(ステップS10でNO)、CPU10は、上記ステップS11〜S12の処理は実行せずに、後述のステップS16の処理に進む。
次に、CPU10は、スイング関連処理を実行する(図37のステップS16)。図41は、当該スイング関連処理の詳細を示すフローチャートである。図41において、まず、CPU10は、操作データ127に基づいて、入力装置の現在姿勢を算出する(ステップS51)。
次に、CPU10は、パワーゲージ更新処理を実行する(ステップS52)。この処理は、上述したようなパワーゲージ104の表示内容を決定(更新)するための処理である(処理概要の説明で上述した(2)パワーゲージ関連処理に相当)。
図42は、当該パワーゲージ更新処理の詳細を示すフローチャートである。図42において、まず、CPU10は、捻り角度算出処理を実行する(ステップS61)。この処理は、上述したような捻り角度を求めるための処理である。図43は、当該捻り角度算出処理の詳細を示すフローチャートである。図43において、まず、CPU10は、現在の入力装置の姿勢に基づいて、仮想的に基準平面を生成する(ステップS71)。つまり、仮に今Bボタン32iが押されたものと仮想して、上述したような基準平面を生成する。以下、当該仮想的な基準平面を、仮想基準面と呼ぶ。仮想基準面生成のための処理としては、図39を用いて説明したステップS41〜S45の処理と同じ処理が実行され、生成された平面が仮想基準面データ144として外部メインメモリ12に記憶される。
次に、CPU10は、入力装置8のローカルZ軸を当該仮想基準面に対して平行にするような回転を、ローカルX軸に適用し、仮想X'軸を算出する(ステップS72)。次に、仮想基準面に対する仮想X'軸の角度を算出し、現在X角度データ145として外部メインメモリ12に記憶する(ステップS73)。当該ステップS72およびS73の処理は、仮想基準面を対象とする点を除けば、図39を用いて上述したステップS47およびS48の処理と同様となるため、詳細な説明は省略する。
次に、CPU10は、以下の式で捻り角度を算出し、捻り角度データ146として記憶する(ステップS74)。
捻り角度=現在X角度−基準X角度 ・・・式10
以上で、捻り角度算出処理は終了する。
図42に戻り、捻り角度算出処理の次に、CPU10は、振りかぶり角度算出処理を実行する(ステップS62)。図44は、当該振りかぶり角度算出処理の詳細を示すフローチャートである。図44において、まず、CPU10は、上記(スイング角度算出の図A)を用いて示したように、現在姿勢におけるローカルZ軸を、上述したような{L}座標系に変換することで、ベクトルDを算出する(ステップS81)。
次に、CPU10は、上述した式7(θ=Atan(Dx,−Dy+K×Dz))を用いて、振りかぶり角度θを算出する(ステップS82)。なお、振りかぶり角度θは、上述したように、構え直し操作を行ったときの姿勢で0、前方に振ると正の値、振りかぶると負の値が算出される。以上で、振りかぶり角度算出処理は終了する。
図42に戻り、振りかぶり角度θが算出できれば、次に、CPU10は、当該振りかぶり角度θの絶対値に基づいて、捻り角度をパワーゲージ104の湾曲に反映させる度合い(反映度)を決定するための処理を実行する(ステップS63)。この処理は、振りかぶり角度が大きいときほど(大きく振りかぶっているときほど)、捻り角度の影響を小さくし、振りかぶり角度が小さいほど(ゴルフクラブ102のヘッドがボール103に近いほど)、捻り角度の影響を大きくするための処理である。つまり、仮に手首の捻り角度が同じとして、大きく振りかぶっているときは、パワーゲージ104はあまり湾曲しないが、ボール103に近づくほど、捻り角度がパワーゲージ104の湾曲に反映される度合いが高くなり、より湾曲して表示されるような処理を実行する。例えば、反映度を0.0(反映度弱)〜1.0(反映度強)とすると、振りかぶり角度が0度のときを反映度1.0とし、振りかぶり角度の絶対値が180°を反映度0.0として、この間の値が線形のグラフとなるように割り当てるようにする(もちろん、非線形で割り当てるようにしても良い)。
次に、CPU10は、上記捻り角度と反映度に基づいて、パワーゲージ104の形状を湾曲させる(ステップS64)。例えば、CPU10は、上記図28で示したようなグラフに相当する関数を用いて、捻り角度−35°〜+35°を、湾曲度−1.0〜1.0の範囲の値に変換する処理を実行する。そして、この変換の際に、上記反映度を係数として用いる。例えば、捻り角度を10°とすると、反映度1.0(アドレスに近い状態)であれば、10°がそのまま湾曲度に反映されるが、反映度が0.5(半分くらいまで振りかぶっている状態)であれば、当該0.5を乗じた値を湾曲度として算出する。
続いて、CPU10は、振りかぶり角度θを振りかぶり量Hに換算する(ステップS65)。具体的には、CPU10は、上記図30で示したようなグラフに相当する関数を用いて、振りかぶり角度θ(−180°〜+180°)の絶対値を振りかぶり量H(0.0〜1.0)に変換する。
次に、CPU10は、上記振りかぶり量Hに基づいて、スイングバー106を移動させる(ステップS66)。以上で、パワーゲージ更新処理は終了する。
図41に戻り、パワーゲージ更新処理の次に、CPU10は、打球パワー算出処理を実行する(ステップS53)。図45は、当該打球パワー算出処理の詳細を示すフローチャートである。図45において、まず、CPU10は、上記の「振り下ろし動作反映処理の概要」において説明したような、追従係数Ktの設定、および、これを用いた追従量Tの算出を実行する(ステップS91)。
次に、CPU10は、上述した過剰な振り強さSを算出する(ステップS92)。すなわち、加速度を8割減と仮定して、上記追従量Tと同様の計算を行うことで過剰な振り強さSを算出する。
次に、CPU10は、上述したような式4を用いて打球パワーPを算出し、打球パワーデータ156として外部メインメモリ12に記憶する(ステップS93)。以上で、打球パワー算出処理は終了する。
図41に戻り、打球パワー算出処理が終われば、次に、CPU10は、しなり角算出処理を実行する(ステップS54)。この処理は、上述したようなバックスピン率を算出するために用いる、ゴルフクラブ102のヘッド部分のしなりを算出するための処理である。図46は、当該しなり角算出処理の詳細を示すフローチャートである。図46において、まず、CPU10は、しなり特性の設定を行う(ステップS101)。すなわち、CPU10は、上記変数Kp(ばね)およびKd(ダンパー)を、振りかぶり角度θの絶対値に応じて設定する。具体的には、振りかぶり角度の絶対値|θ|である0°〜180°のうち、0°〜90°の範囲の値に対して、Kpについては、0.01〜0.015の値を割り当てる(90°以上については、Kpは一律に0.015とする)。また、Kdについては、同じく0°〜90°に対して、0.001〜0.3の値を割り当てる(90°以上については、Kdは一律に0.3とする)。これにより、インパクト付近ではしなりやすく、遠いときはしなりにくいという、しなりについての特性をもたせることができる。
次に、CPU10は、上記式6を用いてクラブヘッド部分の加速度Aを算出し、更に、上述したような追従角度θh(上記図25参照)を算出する(ステップS102)。
次に、CPU10は、上記式5(φ=θh−θ)を用いて、しなり角φを算出する(ステップS103)。以上で、しなり角算出処理は終了する。
図41に戻り、しなり角算出処理が終了すれば、次に、CPU10は、入力装置8の現在姿勢に基づいてプレイヤオブジェクト101やゴルフクラブ102等の姿勢を更新する(ステップS55)。以上で、スイング関連処理は終了する。
図37に戻り、スイング関連処理が終われば、次に、CPU10は、インパクト関連処理を実行する(ステップS17)。本処理では、インパクトが発生したか否かの判定や、インパクトが発生したときの打球に関するパラメータを決めるための処理が実行される。
図47は、当該インパクト関連処理の詳細を示すフローチャートである。図47において、まず、CPU10は、ゴルフクラブ102が上記基準平面を通過したか否かを判定する(ステップS111)。より具体的には、CPU10は、前回振りかぶり角度データ152を参照し、直前のフレーム(直前の処理ループ)で算出された振りかぶり角度θの値を取得する。そして、当該値と、現在のフレームでの処理で算出された振りかぶり角度θとを比較して、当該振りかぶり角度θの値がマイナス値からプラス値に変化したか否かを判定することで、基準平面を通過したか否かを判定する。なお、この判定は、主にバックスピン動作を行っていない、通常のスイングが行われた場合を想定した判定である。
当該判定の結果、ゴルフクラブ102が基準平面を通過したと判定されたときは(ステップS111でYES)、CPU10は、後述のステップS113の処理に進む。一方、ステップS111の判定の結果、ゴルフクラブ102が基準平面を通過していないと判定されたときは(ステップS111でNO)、CPU10は、バックスピン動作が行われたときのゴルフクラブ102のヘッド部のしなりを考慮して、基準平面を通過したか否かの判定を行う(ステップS112)。つまり、上述したようなバックスピン動作が行われたとき、プレイヤはボールをインパクトしたつもりであっても、上記振りかぶり角度θで判定した場合、仮想ゲーム空間内においては、ぎりぎりでゴルフクラブ102がボール103に当たっておらず(基準平面を通過していない)、直前で止められた結果になっているという場合がある。このような場合を想定して、バックスピン動作を行ったときに発生すると考えられる、ゴルフクラブ102のヘッド部の前方へのしなりを考慮して、前方にしなったヘッド部分が基準平面を通過したか否か、すなわち、ボール103にインパクトしたか否かを判定するものである。そのため、CPU10は、上記追従角度θhの値がマイナス値からプラス値に変化したか否かを判定することで、基準平面を通過したか否かを判定する。そして、基準平面を通過していれば(ステップS112でYES)、ステップS113の処理に進み、基準平面を通過していないときは(ステップS112でNO)、CPU10は、インパクト関連処理を終了する。
次に、CPU10は、ショットフラグ161がオンか否かを判定する(ステップS113)。つまり、今回行われたスイングが、「素振り」か否かを判定している。その結果、ショットフラグ161がオフのときは(ステップS113でNO)、「素振り」が行われているため、CPU10は、打球パワーデータ156を読み出し、打球パワーPをパワーバー107(図16等参照)に変換して表示する(ステップS114)。このとき、パワーゲージ104の形状が湾曲していれば、その湾曲に沿ってパワーバー107も湾曲した形状として表示する。
一方、上記ステップS113の判定の結果、ショットフラグ161がオンのときは(ステップS113でYES)、CPU10は、打球を飛ばすためのショット処理を実行する(ステップS115)。図48は、上記ショット処理の詳細を示すフローチャートである。図48において、まず、CPU10は、バックスピンフラグ163にオンを設定する(ステップS121)。更に、CPU10は、飛球中フラグ162をオンに設定する(ステップS122)。
次に、CPU10は、打球パワーデータ156を読み出し、上記打球パワーPをパワーバー107に変換して表示する(ステップS123)。続いて、CPU10は、上記打球パワーPや捻り角度、更には、(現在状態データ159を参照して得られる、現在選択されているゴルフクラブの種類や打った場所(フェアウェイやラフ等)、風向き等のデータに基づいて、打球の弾道や移動速度等の打球のパラメータを算出する(ステップS124)。算出されたパラメータは、打球パラメータ158として外部メインメモリ12に記憶される。以上で、ショット処理は終了する。
図41に戻り、ショット処理が終了すれば、次に、CPU10は、上記振りかぶり角度θを前回振りかぶり角度データ152として外部メインメモリ12に記憶する(ステップS116)。更に、CPU10は、上記追従角度θhを前回追従角度データ153として外部メインメモリ12に記憶する(ステップS117)。また、CPU10は、上記スイング関連処理において算出されたしなり角を前回しなり角データ154として外部メインメモリ12に記憶する(ステップS118)。以上で、インパクト関連処理は終了する。
図37に戻り、インパクト関連処理が終了すれば、次に、CPU10は、構え直しガイド処理を実行する(ステップS18)。本処理は、上記図12に示したような構え直しガイド105の表示タイミングを測り、当該ガイドメッセージを表示するための処理である(上述した処理概要の説明における(3)ガイドメッセージ表示関連処理に相当)。
図49は、上記ステップS18で示した構え直しガイド処理の詳細を示すフローチャートである。図49において、まず、CPU10は、ガイド表示カウンタ155をリセットする条件が満たされているか否かの判定を行う(ステップS131)。すなわち、上述したような、入力装置8の姿勢が、「構えなおし」のときに期待される姿勢(アドレスに近い姿勢)と大きく異なっているか否かという条件と、スイング中の状態か否かという条件である。(なお、Bボタンが押されたか否かという条件については、上記図38のステップS34の処理で対応している)。
より具体的には、
(1)入力装置のローカルZ軸が水平よりも上を向いていて、ローカルY軸が水平より下を向いているか(例えば、野球のバットを持ったときの構えなど)。
(2)角速度の絶対値が30deg/secより大きいか
(3)加速度の絶対値が0.2Gより大きいか。
という3つの条件について、それぞれ満たされているか否かを判定する。
次に、CPU10は、上記3つの条件のうち、一つでも条件が満たされているか否かを判定する(ステップS132)。その結果、1つでも条件が満たされていれば(ステップS132でYES)、リセット条件が満たされたとして、CPU10は、ガイド表示カウンタ155をリセットし(ステップS133)、構え直しガイド処理を終了する。
一方、上記3つの条件のいずれも満たされていないときは(ステップS132でNO)、CPU10は、ガイド表示カウンタをカウントアップするための処理を実行する。具体的には、まず、CPU10は、上述したような、(構え直しの)必要度Krの算出処理を実行する(ステップS134)。図50は、必要度Krの算出処理の詳細を示すフローチャートである。図50において、まず、CPU10は、上述したような仮想基準面を算出し、外部メインメモリ12に記憶する(ステップS141)。この処理は、図42を用いて上述したステップS71の処理と同様の処理である。
次に、CPU10は、現在の基準平面と上記仮想基準面との角度差(面法線と面法線のなす角度)の絶対値を算出する(ステップS142)。
次に、CPU10は、上記ステップS142で算出した角度差を必要度Krに変換する(ステップS143)。具体的には、角度差が11°以上のときは構え直し不要、角度差が0°であれば、構え直し不要と定義し、この間の0°〜11°までの角度差を、線形補間を用いて0.0〜1.0の範囲内の値に変換して、必要度Krとする。以上で、必要度Krの算出処理は終了する。
図49に戻り、次に、CPU10は、構え姿勢可能性Ksの算出処理を実行する(ステップS135)。図51は、上記ステップS135で示した構え姿勢可能性Ksの算出処理の詳細を示すフローチャートである。図51において、まず、操作データ127に含まれる角速度データに基づき、現在の角速度を角速度の安定状態を示す変数Swに変換する(ステップS151)。具体的には、角速度の絶対値0deg/sec〜30deg/secを、線形補間を用いて0.0〜1.0の範囲内の値に変換し、変数Swとする。
次に、CPU10は、操作データ127に含まれる加速度データに基づき、現在の加速度を加速度の安定状態を示す変数Saに変換する(ステップS152)。具体的には、加速度の絶対値0G〜0.2Gを、線形補間を用いて0.0〜1.0の範囲内の値に変換し、変数Saとする。
次に、CPU10は、ローカルX軸の重力方向成分を、構え直し姿勢の正しさを示す変数Stに変換する(ステップS153)。すなわち、図31を用いて上述したような、X軸の水平度合いを0.0(X軸が垂直な状態)〜1.0(X軸が水平な状態)の範囲の値に換算して変数Stとする。
次に、CPU10は、上述した式8(Ks=Sw×Sa×St)を用いて、構え姿勢可能性Ksを算出する(ステップS154)。以上で、構え姿勢可能性Ksの算出処理は終了する。
図49に戻り、次に、CPU10は、必要度Krおよび構え姿勢可能性Kに基づき、上記の式9(C=C+Kr×Ks)を用いてかまえ表示カウンタCをカウントアップする(ステップS136)。
次に、CPU10は、構え表示カウンタCが30を越えたか否かを判定する(ステップS137)。その結果、30を越えていれば(ステップS137でYES)、上記図10で示したような構え直しガイド105を表示するための処理を実行する(ステップS138)。一方、30を越えていないときは(ステップS137でNO)、CPU10は、そのまま構え直しガイド処理を終了する。
図37に戻り、構え直しガイド処理が終了すれば、次に、CPU10は、その他のゲーム処理を実行する(ステップS19)。すなわち、本発明に関すること以外のゴルフゲームにかかる処理を実行する。その後、上述したステップS20以降の処理が実行される。
次に、上記図35のステップS3の判定の結果、飛球中フラグ162がオンのときの処理(ステップS3でYES)を説明する。このときは、インパクトが発生した後、つまり、ショットした後ということになるため、CPU10は、ボール移動処理を実行する(ステップS4)。この処理では、打球を移動させるための処理、および、バックスピンに関する処理が実行される。
図52は、上記ボール移動処理の詳細を示すフローチャートである。図52において、まず、CPU10は、バックスピンフラグがオンか否かを判定する(ステップS161)。その結果、オンのときは(ステップS161でYES)、CPUはバックスピン率設定処理(ステップS162)を実行してからステップS163の処理に進み、オフのときは(ステップS161でNO)、ステップS162の処理は実行せずにステップS163の処理に進む。
図53は、上記ステップS162で示したバックスピン率設定処理の詳細を示すフローチャートである。この処理では、クラブヘッド部分の前方へのしなり角の最大値を検出してバックスピン率に反映するための処理が実行される。図53において、まず、CPU10は、上記しなり角φを算出するためのしなり角算出処理を実行する(ステップS171)。本処理は、図40を用いて説明したステップS54の処理と同じであるため、説明は省略する。
次に、CPU10は、算出されたしなり角φの値が、正の値であるか否かを判定する(ステップS172)。当該判定の結果、正の値でないときは(ステップS172でNO)、CPU10は、算出されたしなり角で前回しなり角データ154を更新し(ステップS177)、バックスピン率設定処理を終了する。
一方、算出されたしなり角φの値が、正の値のときは(ステップS172でYES)、次に、CPU10は、しなりの折り返しが発生したか否かを判定する(ステップS173)。しなりの折り返しとは、バックスピンをかけるようなスイングによってゴルフクラブのヘッド部分が前方へしなった後、反発してまた後方へ戻り始めたときのことである。例えば、CPU10は、前回しなり角データ154で示されるしなり角が上記ステップS171で算出されたしなり角φより大きければ、折り返しが発生したと判定する。そして、当該判定の結果、折り返しが発生していないときは(ステップS173でNO)、まだ前方へ向かってのしなりが継続している状態と考えられるため、CPU10は、上記ステップS177の処理を実行してから、バックスピン率設定処理を終了する。
一方、折り返しが発生したときは(ステップS173でYES)、次に、CPU10は、そのときに選択されているゴルフクラブの種類等に基づいて、しなり角のバックスピンへの反映率を決定する処理を実行する(ステップS174)。例えば、クラブの種類がドライバであれば、バックスピンがかかりにくくなるよう、反映率としては低い値を設定する。
次に、CPU10は、上記決定された反映率と、前回しなり角データ154で示されるしなり角(すなわち、前方へのしなりの最大値となる)に基づき、バックスピン率を決定する(ステップS175)。決定されたバックスピン率は、バックスピン率データ157として外部メインメモリ12に記憶される。
次に、CPU10は、バックスピンフラグ163をオフに設定する(ステップS176)。以上で、バックスピン率設定処理は終了する。
図52に戻り、バックスピン率設定処理の後、CPU10は、打球パラメータ158に基づいて、打球(ボール103)を移動する。また、バックスピン率が決定した後は、当該バックスピン率にも基づいて打球を移動させる(ステップS163)。つまり、ショットの直後は、まだバックスピン率は未決定の状態であるため、打球パラメータ158のみに基づいて(バックスピンがかかっていない状態で)打球が移動される。その後、バックスピン率が決定した後(バックスピンフラグ163がオフになった後)は、打球パラメータ158に加えてバックスピン率データ157も用いて打球を移動させる。一般的に、バックスピンのかかった打球は、高く上がるような弾道となる。そのため、上記のように途中からバックスピン率を適用して打球を移動させることで、打球が途中から急上昇するような弾道になり得る。また、このとき、例えば、打球を追いかけるようなカメラワークを行うための仮想カメラの設定等も適宜行われる。
なお、バックスピンによる打球の挙動については、上記の方法の他、例えば、上記のバックスピン率が決定しても、打球が着地するまでは打球パラメータ158のみに基づいて打球を移動させ、打球が一旦着地してから、上記バックスピン率を打球の挙動に反映するようにしてもよい。例えば、打球が着地したタイミングで、当該バックスピン率を適用した状態のインパクト時からの打球の軌道を再計算する。これにより、バックスピンを考慮した最終的な打球の位置が算出されるため、この位置にボールが来るように着地後の打球の挙動を制御するようにしてもよい。
次に、CPU10は、打球の移動が終了したか否かを判定する(ステップS164)。その結果、打球の移動が終了していないときは(ステップS164でNO)、CPU10は、ボール移動処理を終了する。一方、打球の移動が終了すれば(ステップS164でYES)、CPU10は、飛球中フラグ162にオフを設定し(ステップS165)、ショット終了後におけるその他のゲーム処理を実行する(ステップS166)。これは、例えば、スコアの計算等の処理である。その後、CPU10は、終了フラグ164にオンを設定する(ステップS167)。以上で、ボール移動処理は終了する。
図35に戻り、ボール移動処理が終了すれば、上記ステップS20の描画処理以降の処理が実行される。上記ボール移動処理において終了フラグ164にオンが設定されていれば、ステップS20の判定の結果、本実施形態にかかる処理、つまり、一打分の処理が終了する。以上で、本実施形態にかかる処理の詳細説明を終了する。
このように、本実施形態では、パワーゲージ104について、上記捻り角度と振りかぶり量(打球のパワーの目安)という、異なる2つの要素についての情報を1つのパワーゲージ104でプレイヤに提示している。これにより、プレイヤに、フェースの開き具合や、どの程度強い打球を打つことができるか等を直感的に把握させることが可能となる。
また、本実施形態では、上記のような「構え直し」の際の基準平面の算出について、Bボタン32iが押されたときの、プレイヤの個人差による入力装置8の持ち方の違いによって、基準平面を算出するための計算が不安定となることを回避している。そのため、より適切に基準平面を算出でき、その結果、インパクトの判定についてもより適切な判定を実行することが可能となる。
また、「構え直し」の操作を行うべきタイミングについて、上記のような構え直しの必要度Kr、および、構え姿勢可能性Ksを用いて、より適切なタイミングを測っている。これにより、プレイヤに、無駄に構え直し操作を行わせることを防ぐ事ができる。また、必要なときに構え直し操作を行わせることもできる。
更に、スイング動作のうちの振り下ろしにかかる動作の内容(振り下ろしの強さ)を打球パワーに反映する処理を行っているため、入力装置8自体を動かすことによる操作の一体感をより高めることができ、ゲームの興趣性を高めることができる。また、加速度を利用して打球パワーPの決定を行っているため、プレイヤが入力装置8を振りかぶった後、単純に速い速度でスイングした場合はもちろんのこと、例えば、腕のリーチが長いプレイヤが大きなスイングを行った場合等、スイングの角度の時間的変化はゆっくりではあるが、加速度としては大きな加速度(つまり、遠心力)が発生するようなスイングについても強いスイングとして捉えることができ、打球パワーに反映することが可能となる。
また、ボタン操作ではなく、スイングの仕方によって打球にバックスピンをかけることができるため、よりリアリティの高い操作感を有するゴルフゲームをプレイヤに提供することができる。
なお、上記「構え直し」の操作に関しては、上述した実施形態では、Bボタン32iが押されたときに実行するようにしていたが、この他、ボタン入力が無くても、入力装置8の姿勢が「構え直し」で期待されるような姿勢のまま、所定時間以上静止しているような状態であれば、Bボタン32iが押されたものとみなして、上記構え直しに係る処理を実行するようにしてもよい。
また、上記実施形態では、構え直し操作をプレイヤが行うことを推奨するために、構え直しガイド105を表示するという処理を行っていた。これに限らず、例えば、構え直しガイド105を表示する代わりに、所定の音声案内を出力することで、構え直し操作を行うことを推奨するようにしてもよい。
また、パワーゲージ104に関して、捻り角度に応じて湾曲させていたが、更に、ボール103を打つ場所(地形)による要素を加えて、パワーゲージの形状を変化させてもよい。つまり、ボールを打つ場所によるボールの射出方向や軌道(弾道)の変化についての情報も、パワーゲージ104の形状の変化で提示するようにしてもよい。図54に、ボール103を打つ場所によるパワーゲージ104の形状の違いの例を示す。図54(a)は、フェアウェイで打つ場合を示し、図54(b)は、例えば、バンカーで打つ場合を示している。図54(a)のパワーゲージ104では、射出方向は前方に真っ直ぐの方向であることが示されている(つまり、ボールは、真っ直ぐの方向射出された後、右曲がりにスライスするような飛び方)。一方、図54(b)のパワーゲージ104の場合は、パワーゲージ104の根本部分からやや右に傾斜するような変化となっており、射出方向が右斜め前となっていること(打球は最初から右斜め前に飛んでいき、更に右にスライスする)が示されている。また、図54では、フェアウェイではパワーゲージを根本から傾斜させず、バンカーでは、パワーゲージを根本から傾斜させていることも示されている。すなわち、特定の地形でボールを打つときのみ根本から傾斜させるような処理を行っても良い。
また、上記実施形態では、パワーゲージ104の形状を湾曲させる場合を例に挙げたが、この他、パワーゲージ104の表示色を変えて表示するようにしてもよい。例えば、通常はパワーゲージ104の枠の色を白色で表示しておき、湾曲度が所定値以上の場合は、パワーゲージ104の枠線を赤色で表示するようにしてもよい。同様に、スイングバー106やパワーバー107に表示色についても、振りかぶり量Hや捻り角度、打球パワーP等の大きさに応じて変化させるようにしてもよい。
また、上記実施形態では、結果的に、インパクト発生時に打球パワーPと捻り角度が同時に決定するという形になっているが、これに限らず、必ずしも同時に決定する必要はない。いずれか一方が先に決定され、その後、他方を決定するようにしてもよい。例えば、捻り角度を打球パワーPよりも先に決定するようにした場合は、捻り角度が決定するまでは、スイングバー106に移動とパワーゲージ104の湾曲を共に行い、捻り角度が決定した後は、パワーゲージの湾曲状態を固定し、スイングバー106のみ移動させるようにしてもよい。また、打球パワーPと捻り角度のいずれか一方が決定された時点で、パワーゲージ104の湾曲状態とスイングバー106の位置(つまり、表示状態のみ)を固定させるようにしてもよい。例えば、ショットした瞬間に、パワーゲージ104の湾曲状態とスイングバー106の位置が固定されて(表示状態は同時に固定する)、かつ湾曲状態に関連した打球の曲がり具合も決定するが(パラメータの片方が決定する)、打球パワーについては、プレイヤが入力装置8を振り切ってから確定する(もう一方のパラメータは後のタイミングで決定される)ようにしてもよい。
また、上記基準平面算出処理において、上述の例では、現在の基準面を新たに算出した基準平面で置き換えるような処理によって基準平面を更新していた。この他、例えば、基準平面自体はその位置を固定しておき、ゴルフクラブ102の姿勢のほうを調整するようにしてもよい。つまり、基準平面は重力方向を含む(平行である)ため、基準平面の補正は、現在の基準平面を重力方向まわり回転させる操作に相当する。従って、逆の考え方として、現在の基準平面を固定して、ゴルフクラブ(入力装置8の姿勢)の方を重力方向まわりに逆回転させたとしても、同様の効果が得られる。例えば、上記第1の候補面とその時点における基準平面との角度差を算出する。この差が例えば30°あったとする。この場合は、ゴルフクラブ102の姿勢を30°回転させるという処理を行うようにしても良い。
また、上述した振りかぶり角度θを振りかぶり量Hに変換することに関し、上記の実施形態では、線形のグラフになるような(図30参照)変換を行う場合を例として挙げた。これに限らず、例えば図55に示すように、非線形のグラフとなるように振りかぶり角度θを振りかぶり量Hに変換するようにしてもよい。図55は、横軸右方向をθの正の値、縦軸上方向をHの正の値とするグラフである。図55(a)では、上に膨らむような曲線のグラフとなっており、この場合は、プレイヤが大きく振りかぶっているときほど(Hが1.0に近いほど)細かい調整を行いやすくすることができる。また、図55(b)は、下に膨らむような曲線のグラフとなっており、この場合は、プレイヤがあまり振りかぶっていないときほど(Hが0.0に近いほど)細かい調整を行いやすくすることができる。
また、捻り角度とパワーゲージ104の湾曲度についても、同様に非線形のグラフとなるように対応付けても良い。また、ゲームの難度設定として、線形、非線形のグラフを使い分けるようにしても良い。設定操作については、プレイヤがゲームの難度を選択できるような設定画面を用意しておけばよい。そして、例えば、難度について「簡単」「普通」「難しい」の3つを用意しておく。「簡単」が選択されたときは、図56に示すような、下向きの曲線となるグラフになるような湾曲度の変換を行う。また、「普通」が選択されたときは、上記図28に示したような線形のグラフとなるような変換を行う。また、「難しい」が選択されたときは、図57に示すような、上向きに膨らむ曲線となるグラフになるような変換を行う。また、上記振りかぶり量Hの変換についても、このような難度設定に応じたグラフの使い分けをおこなってもよい。
更に、打球パワーPの算出に関して、上述の実施形態で説明した算出方法に加えて、更に、プレイヤが入力装置8を振り上げてから振り下ろす(インパクトが発生する)までにかかった時間を計測し、当該時間に応じて打球パワーPを補正するようにしてもよい。すなわち、速く振り下ろしたとき(振り上げてから振り下ろしてボールにインパクトするまでの時間が相対的に短いとき)は、ゆっくり振り下ろしたときよりも打球パワーPが相対的に高くなるような処理を実行するようにしてもよい。例えば、上記打球パワー算出処理(ステップS53)において、上記追従量Tは用いずに、一旦、上記振りかぶり量Hのみに基づいて打球パワーPを仮決定する。その後、上記ショット処理(ステップS115)において、振り下ろしにかかった時間に応じて、当該打球パワーPを増減させるような補正を加える処理を実行しても良い(振り下ろしにかかった時間が相対的に短ければ、打球パワーPを増加させる補正を行い、当該時間が長ければ、打球パワーPを減少させる補正を行う等)。
また、打球パワーPの決定に関して、「力を入れすぎたショット(力みすぎたショット)」を反映するようにしてもよい。例えば、打球パワーについて、所定の値を「上限値」として予め設定しておく。そして、上記算出された打球パワーPが当該「上限値」を越えるような値のときは、「力を入れすぎたショット」であるとして、例えば打球の飛ぶ方向をランダムに変化させるようにしてもよい。例えば、「上限値」以下の打球パワーであれば、真っ直ぐ前方に飛んでいくような打球の弾道を、少し右にスライスさせる、あるいは左前方に射出される等の変化を加える処理を行う。また、このとき、パワーバー107の色を変え、左右に揺らすようなエフェクトを表示し、「力を入れすぎたショット」であることを視覚的にプレイヤに提示するようにしてもよい。
また、打球パワーPの決定に関しては、上述したような追従量Tや過剰な振り強さSを用いずに、単純に、振りかぶり量の最大値(最大振りかぶり量)を打球パワーPとして用いてもよい。すなわち、最大振りかぶり量を外部メインメモリに記憶しておき、インパクト発生時に、当該最大振りかぶり量に基づいて打球パワーPを決定して、パワーバー107として表示するようにしても良い。振り下ろし時にかかる動作は打球パワーには反映されないが、処理負荷を軽減できる点で有利である。また、この場合でも、スイングバー106とパワーゲージ104自体の湾曲によって、フェースの開き具合と打球パワーに関する情報を直感的にプレイヤに提供する事は可能である。
また、上記バックスピン率の算出処理に関して、上述の実施形態の例では、バネとダンパーを想定したモデルに基づいて「しなり」をシミュレートするような処理を行っていた。このようなモデルを利用することに限らず、例えば、毎フレームの角速度の変化を監視するようにし、角速度が急激に減少していれば、スイングに急ブレーキがかけられた(制動力がかけられた)、つまり、図22で示したような、バックスピンがかかるようなスイングが行われたと判定して、バックスピン率を決定するような処理を実行するように構成しても良い。
更に、上記バックスピン率の算出処理に関し、上述したような角速度の変化を利用する処理だけに限らず、加速度を利用して上記制動力の発生を判定するようにしてもよい。例えば、上記のような、スイングを急に止めるような操作を行うと、急にスイングを止めた反動で、それまでとは逆方向への加速度が発生する。そこで、当該逆方向への加速度の変化(上記前方へのしなりの相当する)を監視するようにし、これに基づいてバックスピン率を決定する処理を実行しても良い。
また、図47を用いて上述したインパクト関連処理に関し、本実施形態では、振りかぶり角度θを利用してインパクトの発生を判定しており、その一例として、上述したように、振りかぶり角度θの符号が反転したか否かを判定すること(ステップS111)でインパクトの発生を判定していた。振りかぶり角度θを利用したインパクトの発生の判定方法については、この他、入力装置8のZ軸方向についての姿勢と上記基準平面とが水平になったか否かを角度θに基づいて判定することでインパクトの発生を判定するようにしても良い。両者が水平であれば(振りかぶり角度θが0°であれば)、インパクトが発生したと判定すればよい。
更に、上記実施形態では、入力装置8の姿勢の検出について、上記ジャイロセンサユニット7や加速度センサ37を用いていた。これに限らず、入力装置8の姿勢の検出については、所定のカメラで入力装置8を撮像し、当該撮像データに基づいて入力装置8の姿勢を算出するようにしてもよい。例えば、所定のカメラで入力装置8を撮像し、当該撮像画像のデータをゲーム装置3に取得させる。そして、CPU10は、撮像画像に写っている入力装置8を識別し、その姿勢を判別して入力装置8の動きを検出する等の処理を実行すればよい。