以下、本実施形態について説明する。なお、以下に説明する本実施形態は、特許請求の範囲に記載された本発明の内容を不当に限定するものではない。また本実施形態で説明される構成の全てが、本発明の必須構成要件であるとは限らない。
1.構成
図1に本実施形態の画像生成システム(ゲームシステム)のブロック図の例を示す。なお本実施形態の画像生成システムは図1の構成要素(各部)の一部を省略した構成としてもよい。
操作部160は、プレーヤが操作データを入力するためのものであり、その機能は、方向キー、操作ボタン、アナログスティック、レバー、ステアリング、アクセル、ブレーキ、マイク、或いはタッチパネル型ディスプレイなどにより実現できる。
記憶部170は、処理部100や通信部196などのワーク領域となるもので、その機能はRAM(DRAM、VRAM)などにより実現できる。この記憶部170は、電源を切るとデータが消えてしまう揮発性のメモリにより構成できるが、補助記憶装置194よりも高速な記憶装置になっている。そしてゲームプログラムや、ゲームプログラムの実行に必要なゲームデータは、この記憶部170に保持される。
情報記憶媒体180(コンピュータにより読み取り可能な媒体)は、プログラムやデータなどを格納するものであり、その機能は、光ディスク(CD、DVD)、或いはメモリ(ROM等)などにより実現できる。処理部100は、情報記憶媒体180に格納されるプログラム(データ)に基づいて本実施形態の種々の処理を行う。即ち情報記憶媒体180には、本実施形態の各部としてコンピュータ(操作部、処理部、記憶部、出力部を備える装置)を機能させるためのプログラム(各部の処理をコンピュータに実行させるためのプログラム)が記憶される。
表示部190は、本実施形態により生成された画像を出力するものであり、その機能は、CRT、LCD、タッチパネル型ディスプレイ、或いはHMD(ヘッドマウントディスプレイ)などにより実現できる。音出力部192は、本実施形態により生成された音を出力するものであり、その機能は、スピーカ、或いはヘッドフォンなどにより実現できる。
補助記憶装置194(補助メモリ、2次メモリ)は、記憶部170の容量を補うために使用される大容量の記憶装置であり、SDメモリーカード、マルチメディアカードなどのメモリーカードや、HDD(ハードディスクドライブ)などにより実現できる。この補助記憶装置194は脱着自在になっているが、内蔵されるものであってもよい。この補助記憶装置194は、ゲームの途中結果などのセーブデータや、プレーヤ(ユーザ)の個人的が画像データや音楽データなどを保存するために使用される。
通信部196は、有線や無線のネットワークを介して外部(例えば他の画像生成システム、サーバ、ホスト装置)との間で通信を行うものであり、その機能は、通信用ASIC又は通信用プロセッサなどのハードウェアや、通信用ファームウェアにより実現できる。
なお本実施形態の各部としてコンピュータを機能させるためのプログラム(データ)は、サーバ(ホスト装置)が有する情報記憶媒体からネットワーク及び通信部196を介して情報記憶媒体180(あるいは記憶部170、補助記憶装置194)に配信してもよい。このようなサーバ(ホスト装置)による情報記憶媒体の使用も本発明の範囲内に含めることができる。
処理部100(プロセッサ)は、操作部160からの操作データやプログラムなどに基づいて、ゲーム処理、画像生成処理、或いは音生成処理などを行う。処理部100は記憶部170(主記憶部172)をワーク領域として各種処理を行う。この処理部100の機能は、各種プロセッサ(CPU、GPU等)、ASIC(ゲートアレイ等)などのハードウェアや、プログラムにより実現できる。
処理部100は、H/Wスレッド処理部101、H/Wスレッド処理部102、描画部120、音生成部130を含む。なおこれらの一部を省略する構成としてもよい。
H/Wスレッド処理部101(第1のハードウェアスレッド処理部)は、ゲームを進行させるゲーム処理(ゲーム演算)を、第1のH/W(ハードウェア)スレッド処理として行う。ここでH/Wスレッド処理部101により実行されるゲーム処理としては、ゲーム開始条件が満たされた場合にゲームを開始する処理、ゲームを進行させる処理、操作部160からの操作データ(入力データ)を取得(モニタ)する処理、移動体やマップなどのオブジェクトを配置設定する処理、移動体を移動させたり動作させる処理、仮想カメラを制御する処理、ヒットチェック処理、ゲーム結果(ゲーム成績、ゲームポイント)を演算する処理、或いはゲーム終了条件が満たされた場合にゲームを終了する処理などがある。
H/Wスレッド処理部102(第2のハードウェアスレッド処理部)は、H/Wスレッド処理部101による第1のH/Wスレッド処理と並列に(並行して)、第2のH/Wスレッド処理を行う。
H/Wスレッド処理部101は、いわゆるゲームのメインループの処理を行い、ゲームスレッド処理を行う。一方、H/Wスレッド処理部102は、メインループとは異なる処理を、メインループの処理と並列に行う。例えば本実施形態では、H/Wスレッド処理部101は、処理負荷が軽いヒットチェック処理(簡易ヒットチェック)を行う一方で、H/Wスレッド処理部102は、処理負荷が重いヒットチェック処理(詳細ヒットチェック)を行う。これらのH/Wスレッド処理部101、102の機能は、いわゆるマルチスレッドプロセッサのハードウェアと、このマルチスレッドプロセッサにより実行される第1のH/Wスレッド処理プログラム(ゲームのメインプログラム)、第2のH/Wスレッド処理プログラム(詳細なヒットチェック処理用プログラム)のソフトウェアとにより実現できる。
なお図1では2つのH/Wスレッド処理部を設けた場合について示しているが、3つ以上のH/Wスレッド処理部を設けてもよい。例えばモーションデータを再生して移動体を動作させるモーション処理や、処理負荷が重いエフェクトやパーティクルなどの物理シミュレーション処理や、補助記憶装置194(HDD)への書き込み・読み出し処理や、通信部196を制御して行うネットワーク通信処理などについては、その各々についてH/Wスレッド処理部を設けて、H/Wスレッド処理により実現してもよい。
H/Wスレッド処理部101は、オブジェクト空間設定部110、移動体演算部112、仮想カメラ制御部114、第1のヒットチェック処理部116、ゲーム結果演算部117を含むことができる。なお、これらの構成要素の一部を省略したり、他の構成要素を追加する変形実施も可能である。
オブジェクト空間設定部110は、モデルオブジェクト(戦闘機、車、人、ロボット、ミサイル、弾等)、マップ(地形)、建物、コース(道路)、樹木、壁などの表示物を表す各種オブジェクト(ポリゴン、自由曲面又はサブディビジョンサーフェイスなどのプリミティブ面で構成されるオブジェクト)をオブジェクト空間に配置設定する処理を行う。即ちワールド座標系でのオブジェクトの位置や回転角度(向き、方向と同義)を決定し、その位置(X、Y、Z)にその回転角度(X、Y、Z軸回りでの回転角度)でオブジェクトを配置する。具体的には、記憶部170のモデルデータ記憶部176には、移動体(戦闘機、キャラクタ)等のモデルデータが記憶されている。そしてオブジェクト空間設定部110は、このモデルデータを用いてオブジェクト空間へのオブジェクトの設定(配置)処理を行う。
移動体演算部112は、移動体を移動させるための演算を行う。また移動体を動作させるための演算も行う。即ち操作部160によりプレーヤが入力した操作データや、プログラム(移動・動作アルゴリズム)や、各種データ(モーションデータ)などに基づいて、移動体(オブジェクト、モデルオブジェクト)をオブジェクト空間内で移動させたり、移動体を動作(モーション、アニメーション)させる処理を行う。具体的には、移動体の移動情報(位置、回転角度、速度、或いは加速度)や動作情報(パーツオブジェクトの位置、或いは回転角度)を、1フレーム(1/60秒)毎に順次求めるシミュレーション処理を行う。なおフレームは、移動体の移動・動作処理(シミュレーション処理)や画像生成処理を行う時間の単位である。
仮想カメラ制御部114は、オブジェクト空間内の所与(任意)の視点から見える画像を生成するための仮想カメラ(視点)の制御処理を行う。具体的には、仮想カメラの位置(X、Y、Z)又は回転角度(X、Y、Z軸回りでの回転角度)を制御する処理(視点位置、視線方向あるいは画角を制御する処理)を行う。
例えば仮想カメラにより戦闘機、車、キャラクタなどの移動体を後方から撮影する場合には、移動体の位置又は回転の変化に仮想カメラが追従するように、仮想カメラの位置又は回転角度(仮想カメラの向き)を制御する。この場合には、移動体演算部112で得られた移動体の位置、回転角度又は速度などの情報に基づいて、仮想カメラを制御できる。或いは、仮想カメラを、予め決められた回転角度で回転させたり、予め決められた移動経路で移動させる制御を行ってもよい。この場合には、仮想カメラの位置(移動経路)又は回転角度を特定するための仮想カメラデータに基づいて仮想カメラを制御する。
なお本実施形態の移動体は、画面に表示されるオブジェクトであってもよいし、画面に表示されない仮想的なオブジェクトであってもよい。例えば1人称視点等の場合には、仮想カメラの位置を移動体位置と見なすことができる。
第1のヒットチェック処理部116は、第1、第2のオブジェクト(モデルオブジェクト)についての第1のヒットチェック処理を行う。そして第1のヒットチェック処理において第1のオブジェクトに対して第2のオブジェクトがヒットしたと判断した場合に、ヒットイベントの発生をH/Wスレッド処理部102に通知する(知らせる)。この通知は、例えば記憶部170のレジスタの第1のヒットイベントフラグをオンにすることで実現できる。
ゲーム結果演算部117はゲーム結果(ゲーム成果度)の演算処理を行う。即ちゲームの得点、ゲーム成績、獲得ポイント、倒した対戦相手の数、勝ち抜き数、ステージクリア数、試合の勝敗、問題の正答数、クリア時間、順位、或いはラップタイムなどの種々のゲーム結果の演算処理を行う。このゲーム結果は、ゲーム処理における各種の判定処理や各種フラグに基づいて演算される。
H/Wスレッド処理部102は、第2のヒットチェック処理部118、画像変化処理部119を含む。なお、これらの構成要素の一部を省略したり、他の構成要素を追加する変形実施も可能である。
第2のヒットチェック処理部118は、H/Wスレッド処理部102からヒットイベントの発生が通知された場合(第1のヒットイベントフラグがオンになったことが検出された場合)に、第1、第2のオブジェクトのヒットチェック処理として、第1のヒットチェック処理とは異なる第2のヒットチェック処理を行う。即ち第1のヒットチェック処理と第2のヒットチェック処理は、同じ第1、第2のオブジェクトに関するヒットチェック処理ではあるが、その処理内容(プログラム記述、関数)が異なる。
具体的には、第2のヒットチェック処理は、第1のヒットチェック処理よりも処理負荷が重いヒットチェック処理である。或いは、第1のヒットチェック処理は、ゲーム進行(ゲーム結果演算)に不可欠(必要)なヒットチェック処理であり、第2のヒットチェック処理は、ゲーム進行(ゲーム結果演算)に影響を与えないヒットチェック処理(ゲーム進行に不可欠ではないヒットチェック処理)である。
なお処理負荷が重いとは、例えばその処理を実現する関数及び変数の少なくとも一方のプログラムでの記述量(ステップ数)が多い場合や、その関数が複雑(次数が多い。或いは線形関数)である場合等をいう。一方、処理負荷が軽いとは、例えばその処理を実現する関数及び変数の少なくとも一方のプログラムでの記述量が少ない場合や、その関数が簡素(次数が少ない。或いは非線形関数)である場合等をいう。
画像変化処理部119は、ヒットチェック処理に応じて画像を変化させる処理を行う。具体的には、第2のヒットチェック処理部118により求められたヒット位置の情報(座標)に基づいて、ヒット位置の画像を変化させるための処理を行う。例えば第1のオブジェクトに対して第2のオブジェクトがヒットした事を表す装飾画像(弾痕画像等)を、ヒット位置に表示するための処理を行う。またヒット位置を含む領域での第1のオブジェクトの形状を変形する処理を行い、ヒット位置での画像を変化させる。具体的には、この形状変形処理のために予め細分化された第1のオブジェクトの表面の頂点の位置を変化させることで、ヒット位置を含む領域(ヒット位置の周辺領域)での第1のオブジェクトの形状(頂点)を変形する処理を行う。
描画部120は、処理部100で行われる種々の処理(ゲーム処理)の結果に基づいて描画処理を行い、これにより画像を生成し、表示部190に出力する。いわゆる3次元ゲーム画像を生成する場合には、まずモデル(オブジェクト)の各頂点の頂点データ(頂点の位置座標、テクスチャ座標、色データ、法線ベクトル或いはα値等)を含むモデルデータが入力され、入力されたモデルデータに含まれる頂点データに基づいて、頂点処理(頂点シェーダによるシェーディング)が行われる。なお頂点処理を行うに際して、必要に応じてポリゴンを再分割するための頂点生成処理(テッセレーション、曲面分割、ポリゴン分割)を行うようにしてもよい。
頂点処理では、頂点処理プログラム(頂点シェーダプログラム、第1のシェーダプログラム)に従って、頂点の移動処理や、座標変換(ワールド座標変換、カメラ座標変換)、クリッピング処理、あるいは透視変換等のジオメトリ処理が行われ、その処理結果に基づいて、オブジェクトを構成する頂点群について与えられた頂点データを変更(更新、調整)する。そして、頂点処理後の頂点データに基づいてラスタライズ(走査変換)が行われ、ポリゴン(プリミティブ)の面とピクセルとが対応づけられる。そしてラスタライズに続いて、画像を構成するピクセル(表示画面を構成するフラグメント)を描画するピクセル処理(ピクセルシェーダによるシェーディング、フラグメント処理)が行われる。
ピクセル処理では、ピクセル処理プログラム(ピクセルシェーダプログラム、第2のシェーダプログラム)に従って、テクスチャの読出し(テクスチャマッピング)、色データの設定/変更、半透明合成、アンチエイリアス等の各種処理を行って、画像を構成するピクセルの最終的な描画色を決定し、透視変換されたモデルの描画色を描画バッファ174(ピクセル単位で画像情報を記憶できるバッファ。VRAM、レンダリングターゲット)に出力(描画)する。即ち、ピクセル処理では、画像情報(色、法線、輝度、α値等)をピクセル単位で設定あるいは変更するパーピクセル処理を行う。これにより、オブジェクト空間内において仮想カメラ(所与の視点)から見える画像が生成される。
なお頂点処理やピクセル処理は、シェーディング言語によって記述されたシェーダプログラムによって、ポリゴン(プリミティブ)の描画処理をプログラム可能にするハードウェア、いわゆるプログラマブルシェーダ(頂点シェーダやピクセルシェーダ)により実現できる。プログラマブルシェーダでは、頂点単位の処理やピクセル単位の処理がプログラム可能になることで描画処理内容の自由度が高く、従来のハードウェアによる固定的な描画処理に比べて表現力を大幅に向上させることができる。
描画部120は、オブジェクトを描画する際にジオメトリ処理、隠面消去処理、αブレンディング、テクスチャマッピング処理等を行う。
ジオメトリ処理では、オブジェクトに対して、座標変換、クリッピング処理、透視投影変換、或いは光源計算等の処理が行われる。そして、ジオメトリ処理後(透視投影変換後)のモデルデータ(オブジェクトの頂点の位置座標、テクスチャ座標、色データ、法線ベクトル、或いはα値等)は、記憶部170に保存される。
隠面消去処理としては、描画ピクセルのZ値(奥行き情報)が格納されるZバッファ(奥行きバッファ)を用いたZバッファ法(奥行き比較法、Zテスト)による隠面消去処理がある。即ちオブジェクトのプリミティブに対応する描画ピクセルを描画する際に、Zバッファ(描画バッファのZプレーン)に格納されるZ値を参照する。そして参照されたZバッファのZ値と、プリミティブの描画ピクセルでのZ値とを比較し、描画ピクセルでのZ値が、仮想カメラから見て手前側となるZ値(例えば小さなZ値)である場合には、その描画ピクセルの描画処理を行うとともにZバッファのZ値を新たなZ値に更新する。
αブレンディング(α合成)は、α値(A値)に基づいて行う処理であり、通常αブレンディング、加算αブレンディング或いは減算αブレンディングなどがある。なおα値は、各ピクセル(テクセル、ドット)に関連づけて記憶できる情報であり、例えば色情報以外のプラスアルファの情報である。α値は、半透明度(透明度、不透明度と等価)情報、マスク情報、或いはバンプ情報などとして使用できる。
テクスチャマッピング(テクスチャフェッチ、テクスチャサンプリング)処理は、テクスチャ記憶部178に記憶されるテクスチャ(テクセル値)をオブジェクトにマッピングする処理である。具体的には、オブジェクト(プリミティブ面)の頂点等に設定(付与)されるテクスチャ座標等を用いてテクスチャ記憶部178からテクスチャ(色、α値などの表面プロパティ)を読み出す。そして、2次元の画像又はパターンであるテクスチャをオブジェクトにマッピングする。この場合に、ピクセルとテクセルとを対応づける処理やバイリニア補間(広義にはテクセル補間)などを行う。
音生成部130は、処理部100で行われる種々の処理の結果に基づいて音処理を行い、BGM、効果音、又は音声などのゲーム音を生成し、音出力部192に出力する。
本実施形態ではH/Wスレッド処理部101は、第1、第2のオブジェクトについての第1のヒットチェック処理を行い、第1のオブジェクトに対して第2のオブジェクトがヒットしたと判断した場合に、ヒットイベントの発生をH/Wスレッド処理部102に通知する。また第1のヒットチェック処理の結果(ヒットチェックの判定結果)に基づいてゲーム結果を演算するゲーム処理を行う。
一方、H/Wスレッド処理部102は、ヒットイベントの発生が通知されると、第1のヒットチェック処理よりも例えば処理負荷が重い第2のヒットチェック処理を行う。具体的には。第1のオブジェクトに対する第2のオブジェクトのヒット位置を求める。
そしてH/Wスレッド処理部102は、第2のヒットチェック処理のヒットチェック結果情報(第2のヒットイベントフラグ又はヒット位置等)を、H/Wスレッド処理部101に通知する(知らせる)。するとH/Wスレッド処理部101は、通知されたヒット位置での画像を変化させる処理を行う。具体的にはH/Wスレッド処理部101は、H/Wスレッド処理部102からヒットチェック結果情報が通知されると、ヒットチェック結果情報に基づく画像の描画を、描画部120に対して指示する。例えば描画データを転送すると共に描画コマンドを発行する。
この場合にH/Wスレッド処理部102は、例えば第Kのフレームにおいてヒットイベントの発生が通知されると、第Kのフレームの後の第M(M>K。K、Mは自然数)のフレームにおいて、第2のヒットチェック処理のヒットチェック結果情報をH/Wスレッド処理部101に通知する。そしてH/Wスレッド処理部101は、第MのフレームにおいてH/Wスレッド処理部102からヒットチェック結果情報が通知されると、第Mのフレームの後の第Nのフレーム(N>M。Nは自然数)において、ヒットチェック結果情報に応じたゲーム処理(ヒット位置の画像を変化させる処理等)を行う。具体的にはH/Wスレッド処理部101は、描画部120への画像の描画指示の前のステップで、H/W処理部102からのヒットチェック結果情報(第2のヒットイベントフラグ)の監視処理を行う。
またH/Wスレッド処理部101は、第2のヒットチェック処理よりも処理負荷が軽い第1のヒットチェック処理として、第1のオブジェクトの形状を簡素化した第1の簡易オブジェクトに対して、第2のオブジェクト又は第2のオブジェクトの形状を簡素化した第2の簡易オブジェクトがヒットしたか否かを判断する処理を行う。そしてヒットしたと判断された場合には、第1のヒットイベントフラグをオンにすることで、第1のヒットチェック処理でのヒットイベントの発生を通知する。なお、この第1、第2の簡易オブジェクトは、第1、第2のオブジェクトよりもポリゴン数(プリミティブ面数)が少ないオブジェクトである。
またH/Wスレッド処理部102は、処理負荷が重い第2のヒットチェック処理として、第1の簡易オブジェクトではなく、実際に表示される第1のオブジェクト自体に対して第2のオブジェクトがヒットしたか否かを判断する。そしてヒットしたと判断された場合には、第2のヒットイベントフラグをオンにすることで、第2のヒットチェック処理でのヒットイベントの発生をH/Wスレッド処理部101に通知する。
なおH/Wスレッド処理部101は、第1のヒットチェック処理において第1のオブジェクトに対して第2のオブジェクトがヒットしたと判断した場合に、第2のヒットチェック処理に必要な第1、第2のオブジェクトの情報(モデル情報、位置、ベクトル等)を記憶部170に保存する。するとH/Wスレッド処理部102は、保存された第1、第2のオブジェクトの情報に基づいて、第2のヒットチェック処理を行う。そしてH/Wスレッド処理部102は、第1のオブジェクトに対する第2のオブジェクトのヒット位置を求め、求められたヒット位置の情報を記憶部170に保存する。するとH/Wスレッド処理部101は、保存されたヒット位置の情報に基づいて、ゲーム処理を行う。
なお、本実施形態の画像生成システムは、1人のプレーヤのみがプレイできるシングルプレーヤモード専用のシステムにしてもよいし、複数のプレーヤがプレイできるマルチプレーヤモードも備えるシステムにしてもよい。また複数のプレーヤがプレイする場合に、これらの複数のプレーヤに提供するゲーム画像やゲーム音を、1つの端末を用いて生成してもよいし、ネットワーク(伝送ライン、通信回線)などで接続された複数の端末(ゲーム機、携帯電話)を用いて分散処理により生成してもよい。
2.本実施形態の手法
2.1 H/Wスレッドによるヒットチェック
コンピュータのプログラムは、記述された命令コードが順次実行されながら動作する。通常、プログラムに分岐やループがあっても、プログラム全体は1つの流れになっており、このような一連のプログラムの流れがスレッドと呼ばれる。このスレッドは、並列処理の実行単位でもある。
そして、近年、複数のスレッドを並列的に処理可能なマルチスレッドプロセッサが、ゲーム装置などの画像生成システムに採用されるようになってきている。このマルチスレッドプロセッサでは、例えばレジスタファイルや演算器などのハードウェア資源をスレッドごとに用意することで、複数のスレッドの並列処理を実現する。そしてスレッド単位で処理を並列化することによりハードウェア資源を有効に活用し、全体としての処理を効率化する。
H/W(ハードウェア)スレッド処理は、このようなマルチスレッドプロセッサにより並列実行されるスレッド処理である。そしてH/Wスレッドは、マルチスレッドプロセッサが備える複数のハードウェアリソースの全部又は一部を区分し、実行されるスレッドごとに割り当てられた仮想的な単位である。
本実施形態では、このH/Wスレッド処理を有効活用する手法を採用することで、オブジェクト間のヒットチェック処理の効率化を図っている。
例えば図2において、ステップS1〜S6は、ゲームスレッドである第1のH/Wスレッド処理HS1の処理である。一方、ステップS11、S12は、コリジョン(衝突)スレッドである第2のH/Wスレッド処理HS2の処理である。
ステップS1〜S6はゲームのメインのループ処理である。即ち、まずフレームが更新されたか否かを判断し(ステップS1)、フレームが更新された場合には操作データを取得する(ステップS2)。そして、移動体演算やゲーム進行処理などのゲーム処理を行う(ステップS3)。次に、簡易ヒットチェックである第1のヒットチェック処理CH1を行う(ステップS4)。そしてこのヒットチェック処理CH1の結果に基づいて、得点やゲーム成績などのゲーム結果を演算する(ステップS5)。次に、描画データ(ポリゴンデータ)を送信し、描画コマンドを発行して、描画部に描画を指示する(ステップS6)。
ステップS9の簡易的なヒットチェック処理CH1において、第1のオブジェクトに対して第2のオブジェクトがヒットしたと判断されると、ヒットイベントの発生がヒットイベントフラグなどを用いて、H/Wスレッド処理HS2に通知される。するとH/Wスレッド処理HS2では、詳細なヒットチェックである第2のヒットチェック処理CH2が行われる(ステップS11)。そしてヒットチェック処理CH2のヒットチェック結果情報(ヒットイベントフラグ、ヒット位置等)が取得されて(ステップS12)、H/Wスレッド処理HS1に通知される。
このように図2の本実施形態の手法では、ステップS1〜S6のH/Wスレッド処理HS1のヒットチェック処理CH1においてヒットイベントの発生が検出されると、HS1とは異なるH/Wスレッド処理HS2がスタートし、CH1よりも処理負荷が重く詳細なヒットチェック処理CH2が実行される。そしてこのヒットチェック処理CH2において第1、第2のオブジェクトがヒットした判断されると、そのヒットチェック結果情報がH/Wスレッド処理HS1に伝えられる。
図3に、本実施形態の手法を戦闘機ゲームに適用した場合の例を示す。例えばフレーム1では、H/Wスレッド処理HS1において、戦闘機を表すオブジェクトOB1とミサイルや機関銃の弾を表すオブジェクトOB2との間の簡易的なヒットチェック処理CH1が行われる。具体的には、第1のオブジェクトOB1の形状を簡素化した第1の簡易オブジェクトSP1(球オブジェクト)と、第2のオブジェクトOB2の形状を簡素化した第2の簡易オブジェクトSP2(球オブジェクト)を用いてヒットチェック処理CH1が行われる。なお、第2の簡易オブジェクトSP2ではなく、第2のオブジェクトOB2自体を用いてもよい。
そしてフレーム1では、簡易オブジェクトSP1、SP2は交差していないため、オブジェクトOB1、OB2はヒットしていないと判断される。
一方、フレーム2(広義には第Kのフレーム)では、簡易オブジェクトSP1、SP2は交差しているため、オブジェクトOB1、OB2はヒットしたと判断される。すると第1のヒットイベントフラグがオンになり、ヒットイベントが通知され、H/Wスレッド処理HS2がスタートする。またOB1で表される戦闘機に対して、OB2で表されるミサイルや弾が当たったと判断され、このヒットチェック処理の結果に応じたゲーム結果の演算が行われる。即ち、ミサイルや弾による破壊により戦闘機の耐久力を減少させる演算が行われる。
H/Wスレッド処理HS2では、OB1とOB2のヒットイベントが通知されると、第1のヒットチェック処理CH1よりも処理が重く詳細な第2のヒットチェック処理CH2が行われる。このヒットチェック処理CH2では、簡易オブジェクトSP1、SP2を用いずに、オブジェクトOB1自体に対してオブジェクトOB2がヒットしたか否かが判断される。即ちミサイルや弾が戦闘機に本当にヒットしたか否かのチェックが行われる。
そしてフレーム4(広義には第Kのフレームの後の第Mのフレーム)では、ミサイルや弾が戦闘機に本当にヒットしたと判断されたため、ミサイルや弾のヒット位置が求められる。そしてヒットチェック結果情報としてヒット位置の座標がH/Wスレッド処理HS1に通知される。また第2のヒットイベントフラグがオンになり、戦闘機にミサイルや弾が本当にヒットしたことが知らされる。
するとフレーム5(広義には第Mのフレームの後の第Nのフレーム)では、ヒットチェック結果情報に応じたゲーム処理が行われる。具体的には、ヒット位置にミサイルや弾の弾痕を表示する処理が行われる。即ちヒットチェック結果情報(ヒット位置)に応じた画像の描画が描画部に指示されて、弾痕表示の画像が生成される。
例えば敵の戦闘機にミサイルや弾が当たって戦闘機にダメージを与える処理は、即座に行うことが望ましい。即ちミサイルや弾が当たったことで、その戦闘機が墜落したり、操縦不能になったりする。ところが、戦闘機にミサイルや弾が当たったか否かの判断を、負荷の重い詳細なヒットチェック処理で実現すると、このヒットチェック処理に時間がかかってしまい、ゲーム結果の演算処理や描画処理が間に合わなくなるおそれがある。
そこで図3のH/Wスレッド処理HS1では、戦闘機にミサイルや弾が当たったか否かの判断を、簡易オブジェクトSP1、SP2を用いた簡易なヒットチェック処理CH1で実現する。そして、この簡易なヒットチェック処理CH1で、戦闘機にミサイルや弾が当たったと判断されると、戦闘機の耐久力を下げるなどのゲーム結果演算処理を、メインのH/Wスレッド処理HS1において即座に行う。このようにすれば、処理が間に合わなくなり、戦闘機の墜落が遅れて、プレーヤに不自然感を与えるなどの事態を防止できる。
一方、このようなH/WスレッドHS1における簡易なヒットチェック処理CH1により、戦闘機にミサイルや弾が当たったと仮判断されると、H/WスレッドHS2が立ち上がって、オブジェクトOB1、OB2自体を用いた詳細なヒットチェック処理CH2が行われる。そして戦闘機にミサイルや弾が本当に当たったか否かが判断され、当たったと判断されると、そのヒット位置に弾痕が表示される。
戦闘機にミサイルや弾が当たったか否かは、ゲーム進行に大きな影響を与えるため、H/Wスレッド処理HS1において即座に行う必要がある。一方、弾痕表示は、ゲームの進行には影響を与えず、単なる演出効果である。従って、この弾痕表示の処理は、即座に行う必要はないため、H/Wスレッド処理HS2が実行する。そしてH/Wスレッド処理HS2は、メインのゲーム処理であるH/Wスレッド処理HS1と並列に実行され、ヒットチェック処理CH2に時間がかかったとしても、HS1の処理に悪影響を与えることはない。そして、十分に時間をかけてヒット位置を正確に求め、そのヒット位置に弾痕を表示する。この場合に図3に示すように、弾痕表示が行われるタイミングが遅れたとしても、ゲーム結果には影響を与えず、プレーヤも不自然さをそれほど感じない。従って、ゲーム結果については即座に求めてゲーム処理をスムーズに進行できると共に、ヒット位置に弾痕が表示されたリアルな画像を生成して、プレーヤに提供できるようになる。即ちスムーズなゲーム進行処理と、生成される画像のリアル度の向上を両立できる。
なお図3では、フレーム2(広義には第Kのフレーム)において、オブジェクトOB1(SP1)に対してオブジェクトOB2がヒットしたと判断されると、ヒットイベントの発生がH/Wスレッド処理HS2に通知される。そしてフレーム2(第Kのフレーム)の後のフレーム4(広義には第Mのフレーム)において、ヒットチェック処理CH2のヒットチェック結果情報がH/Wスレッド処理HS1に通知される。そして、ヒットチェック結果情報が通知されると、フレーム4(第Mのフレーム)の後のフレーム5(広義には第Nのフレーム)において、ヒットチェック結果情報に応じたゲーム処理である弾痕の表示処理が行われる。
この場合、図3において、フレーム5(第Nのフレーム)ではなく、前のフレーム4(第Mのフレーム)で弾痕表示を行おうとすると、弾痕表示の処理が間に合わなくなり、弾痕の一部の画像が欠けたりするなどの不具合が生じる可能性がある。
この点、図3では、フレーム4(第Mのフレーム)ではなく、次のフレーム5(第Nのフレーム)において弾痕表示が行われる。これは、例えば画像の描画開始の指示の前に、H/Wスレッド処理HS2からのヒットチェック結果情報である第2のヒットイベントフラグの監視処理を行うことで、実現できる。
また図3から明らかなように、H/Wスレッド処理HS2において、ヒット位置を求める詳細なヒットチェック処理CH2を行うと、実際にヒットイベントが発生してから例えば数フレーム後に、ヒットチェック処理CH2が完了して、弾痕が表示されるようになる。しかしながら、このように弾痕表示のタイミングが遅れても、ミサイルや弾のヒットによるゲーム結果の演算処理については遅れないため、ゲーム進行には悪影響は及ばさない。
なお図3では、フレーム4(第Mのフレーム)の後のフレーム5(第Nのフレーム)で、弾痕表示等のヒットチェック結果情報に応じたゲーム処理を行っている。しかしながら、処理時間に余裕がある場合には、フレーム4(第Mのフレーム)においてヒットチェック結果情報に応じたゲーム処理を行うようにしてもよく、N≧Mであってもよい。
2.2 ヒットチェック処理
次にヒットチェック処理の詳細例を説明する。例えば図4(A)の大雑把な当たり判定であるヒットチェック処理CH1では、戦闘機のオブジェクトOB1には、例えばOB1の代表点を中心点とする球の簡易オブジェクトSP1(ヒットチェック用オブジェクト)が設定される。同様に、ミサイルや弾のオブジェクトOB2には、例えばOB2の代表点を中心点とする球の簡易オブジェクトSP2(ヒットチェック用オブジェクト)が設定される。そして、球の簡易オブジェクトSP1、SP2の半径をR1、R2とし、オブジェクトOB1、OB2間の距離(代表点間の距離)をRとした場合に、簡易ヒットチェック処理CH1では、R≦R1+R2か否かが判断される。そしてR≦R1+R2であれば、戦闘機にミサイルや弾がヒットしたと判断し、戦闘機の耐久力を減らす。
一方、図4(B)のヒットチェック処理CH2では、図1(A)のような簡易オブジェクトSP1、SP2を使用せずに、多数のポリゴンで構成される戦闘機のオブジェクトOB1自体に、オブジェクトOB2がヒットしたか否かが判断される。具体的には図4(C)に示すように、オブジェクトOB1を構成する各ポリゴンについて、オブジェクトOB2のベクトルV2が交差したか否かを判断し、交差した場合には、そのヒット位置HPを求める。そして求められたヒット位置HPに弾痕を表示する。
例えば戦闘機のオブジェクトOB1は、画像のリアル度を向上するために、多数のポリゴンで構成される。従って、このようなオブジェクトOB1を構成する各ポリゴンについて行うヒットチェック処理CH2は、処理負荷が非常に重い。従って、このヒットチェック処理CH2を、ゲームスレッドであるH/Wスレッド処理HS1において行うと、他の処理が1フレーム以内に完了しないなどの問題が生じるおそれがある。
本実施形態によれば、このヒットチェック処理CH2は、H/Wスレッド処理HS1とは別のH/Wスレッド処理HS2で行われるため、このような問題の発生を防止できる。
なお図4(A)では、オブジェクトOB1の形状を、1つの簡易オブジェクトSP1(球)で近似しているが、2つ以上の簡易オブジェクト(球)で近似してもよい。また簡易オブジェクトSP1、SP2は、球の形状であることが処理負荷の軽減のためには好ましいが、これに限定されず、球以外の形状(例えば円柱、四角錐等)であってもよい。
図5(A)に、ヒットチェック処理CH1において保存される情報の例を示す。図5(A)に示すように、ヒットチェック処理CH1においてオブジェクトOB1(SP1)にOB2(SP2)がヒットした判断されると、ヒットイベントフラグF1がオンにされる。このヒットイベントフラグF1は、フラグ用のレジスタに設定される。
またオブジェクトOB1にOB2がヒットした判断されると、詳細なヒットチェック処理CH2に必要なオブジェクトOB1、OB2の情報が記憶部(レジスタ)に保存される。例えば図5(A)では、戦闘機のオブジェクトOB1の情報として、OB1を指定するためのオブジェクト番号(モデル番号)OBNが記憶部に保存される。またオブジェクトOB1の代表点の位置P1(X1、Y1、Z1)と、OB1の方向DR1(θX1、θY1、θZ1)が保存される。なお方向DR1は、オブジェクトOB1の姿勢を表すものであり、θX1、θY1、θZ1は、各々、X、Y、Z軸回りの回転角度である。
また図5(B)では、ミサイルや弾のオブジェクトOB2の情報として、位置(X2、Y2、Z2)と、ミサイルや弾の向きと長さを表すベクトルV2(VX2、VY2、VZ2)が保存される。
図5(B)に、ヒットチェック処理CH2において保存されるヒットチェック結果情報の例を示す。図5(B)に示すように、ヒットチェック処理CH2においてオブジェクトOB1にOB2がヒットしたと判断されると、ヒットイベントフラグF2がオンにされる。このヒットイベントフラグF2は、フラグ用のレジスタに設定される。
またオブジェクトOB1にOB2がヒットしたと判断されると、そのヒット位置HP(XH1、YH1、ZH1)が求められる。即ちオブジェクトOB1を構成するポリゴンのうち、オブジェクトOB2のベクトルV2に交差するポリゴンが検索され、そのポリゴンにV2が交差する点が、ヒット位置HPとして求められる。
そしてヒット位置HPが求められると、そのヒット位置の情報(座標)が、ヒットチェック結果情報として保存される。そしてH/Wスレッド処理HS1は、保存されたヒット位置の情報に基づいて、ゲーム処理(描画処理)を行う。具体的には、ヒット位置の画像を変化させる処理を行う。例えば図6(A)に示すように、オブジェクトOB1に対してOB2がヒットした事を表す弾痕画像(広義には装飾画像)がヒット位置に表示される。
この弾痕画像の表示処理(画像を変化させる処理)は、例えば図6(B)に示すように、弾痕を表すポリゴンを、ヒット位置に配置設定することで実現できる。或いは図6(C)に示すように、ヒット位置付近のテクスチャを、元絵のテクスチャ(戦闘機の通常の表面を表すテクスチャ)から、弾痕が表現された弾痕テクスチャに切り替えることで、実現してもよい。なお図6(B)、図6(C)とは異なる手法で、弾痕などの装飾画像を表現してもよい。また本実施形態で実現される装飾画像は、弾痕には限定されない。例えばゴミや塵のオブジェクトが車体のオブジェクトにヒット(接触)したことで生成される汚れ画像などであってもよい。
2.3 形状変形処理
H/Wスレッド処理HS2で行われる処理は、オブジェクトOB1に対するOB2のヒット位置を求める処理に限定されない。例えば、H/Wスレッド処理HS2において、ヒット位置を含む領域でのオブジェクトOB1の形状を変形する処理を行ってもよい。
例えば格闘技ゲームにおいて、キャラクタの顔や体に他のキャラクタのパンチやキックがヒットした場合に、パンチやキックによりヒット位置の部分の形状を変形させて、その部分が腫れて膨らんで見える画像を生成できれば、プレーヤの仮想現実感を向上できる。
しかしながら、このような形状変形処理を、ゲームのメインのループであるH/Wスレッド処理HS1で行うと、形状変形処理は処理負荷が重いため、他の処理(例えば描画処理)を1フレーム内で完了できなくなるなどの問題が生じるおそれがある。
一方、パンチやキックがキャラクタにヒットした場合に、そのキャラクタの耐久力を減らすゲーム結果の演算処理については、即座に行うことが望ましい。
そこで例えば図7(A)のように、キャラクタの顔を表すオブジェクトOB1に対して、他のキャラクタの拳などを表すオブジェクトOB2が当たった場合に、OB1にOB2がヒットしたか否かの判断処理については、ゲームスレッドであるH/Wスレッド処理HS1において行う。そしてヒットした判断した場合に、ヒットイベントの発生をH/Wスレッド処理HS2に通知すると共に、キャラクタの耐久力を減らすなどのゲーム結果の演算処理を行う。
そしてヒットイベントの発生が通知されると、H/Wスレッド処理HS2では、顔のオブジェクトOB1に対する拳のオブジェクトOB2のヒット位置HPを求める処理を行う。そしてヒット位置HPを含む領域SF1でのオブジェクトOB1の形状を変形する処理を行う。これにより、ヒット位置HPの部分がパンチにより腫れて膨らんで見える画像を生成できるため、プレーヤの仮想現実感を向上できる。
この場合、図3から明らかなように、H/Wスレッド処理HS2において形状変形処理を行うと、実際にヒットイベントが発生してから例えば数フレーム後に、形状変形処理が完了する。しかしながら、このように形状変形処理の完了が遅れても、パンチのヒットによるゲーム結果の演算処理については遅れないため、ゲーム進行には悪影響は及ばさない。そして、形状変形処理の完了が遅れると、パンチのヒット後、ある程度時間が経ってから、キャラクタの顔が徐々に膨らんで行くように見えるため、画像のリアル度を逆に向上できる。
なお形状変形処理は例えば以下のようにして実現できる。例えば図7(A)に示すように、オブジェクトOB1の表面を形状変化処理のために予め細分化しておく。即ち、オブジェクトOB1の表面である例えば頬の部分が平らであり少ないポリゴン分割数で表現できる場合にも、わざと多数のポリゴンで表面を分割して細分化しておく。そして図7(B)に示すように、このように細分化されたオブジェクトOB1の表面の頂点の位置を変化させることで、ヒット位置HPを含む領域SF1でのOB1の形状変形処理を実現する。
例えばオブジェクトOB1に対するOB2のヒットイベントが発生した場合に、オブジェクトOB1の領域SF1を構成するポリゴンの頂点データリストを、図7(C)のように変更する。即ち頂点データリストに設定されるポリゴンの頂点のX、Y、Z座標を変更する。
この場合に、例えば拳がヒットした時のパンチの威力の大小に応じて、形状変形の度合いを変化させてもよい。具体的には、拳を表すオブジェクトOB2の速度情報や運動エネルギー情報などを例えばH/Wスレッド処理HS1において演算し、記憶部に保存する。そしてH/Wスレッド処理HS2では、この保存された速度情報や運動エネルギー情報などに基づいて、形状変形(頂点の変位)の度合いを変化させる。こうすることで、パンチの威力に応じて領域SF1での表面の膨らみ具合が変化するようになり、プレーヤの仮想現実感を更に向上できる。
2.4 領域特定処理
H/Wスレッド処理HS2で行われる処理として、オブジェクトOB1に対するオブジェクトOB2のヒットにより画像が変化する領域を特定する処理を行ってもよい。即ち、ヒット位置を含む領域のうち、ヒットにより画像が変化すべき領域を特定する。
例えば図8(A)では、サッカー選手のキャラクタを表すオブジェクトOB2がスライディングを行っている。この場合に、このスライディングによりグラウンドの芝が削れる領域を特定し、この特定された領域の画像が変化したように見える画像を生成できれば、プレーヤの仮想現実感を向上できる。
しかしながら、このようなスライディングの領域特定処理を、ゲームのメインのループであるH/Wスレッド処理HS1で行うと、処理負荷が重いため、他の処理を1フレーム内で完了できなくなるなどの問題が生じるおそれがある。
一方、このようなスライディングが行われた場合に、そのスライディングによりボールを奪ったか否かを判断するゲーム結果の演算処理については、即座に行うことが望ましい。
そこで図8(A)のように、サッカーのグラウンドを表すオブジェクトOB1(マップオブジェクト)に対してOB2がヒットするスライディングのヒットイベント発生の判断処理については、H/Wスレッド処理HS1が行う。そしてスライディングのヒットイベントが発生した場合には、ヒットイベントの発生をH/Wスレッド処理HS2に通知すると共に、スライディングによりボールを奪ったか否かを判断するゲーム結果の演算処理を行う。
そして図8(A)のようなスライディングのヒットイベントの発生が通知されると、H/Wスレッド処理HS2では、図8(B)に示すように、グラウンドのオブジェクトOB1(マップオブジェクト)の表面の領域のうち、OB1に対するキャラクタのオブジェクトOB2のヒットにより画像が変化する領域SF2を特定する処理を行う。即ち、キャラクタのスライディングによりグラウンドの芝が削られる領域SF2を特定する。そして、必要であれば、この領域SF2における芝の画像を、芝が削られた画像に変化させるための処理を行う。なお、この画像変化処理については、ゲームスレッドであるH/Wスレッド処理HS1において行うようにしてもよい。このようにすることで、このスライディングの領域SF2での画像が、芝が削れた画像に変化するようになるため、プレーヤの仮想現実感を向上できる。
この場合、図3から明らかなように、H/Wスレッド処理HS2において領域特定処理を行うと、実際にヒットイベントが発生してから例えば数フレーム後に、領域特定処理が完了するようになる。しかしながら、このように領域特定処理の完了が遅れても、スライディングによるゲーム結果の演算処理については遅れないため、ゲーム進行には悪影響は及ばさない。そして、領域特定処理の完了が遅れると、スライディング後、ある程度時間が経ってから、芝の画像が削れる画像が生成されるようになるため、画像のリアル度を逆に向上できる。
なお領域特定処理は例えば以下のようにして実現できる。即ちスライディングのヒットイベントが発生すると、H/Wスレッド処理HS1では、例えばスライディング位置、スライディング方向、スライディング速度(或いはこれらの少なくとも1つ)を求める。そして、求められたスライディング位置、スライディング方向(スライディングの方向ベクトル)、スライディング速度を記憶部に保存する。また必要であれば、キャラクタのオブジェクトOB2のモデル情報(モーションデータ)も保存する。そしてH/Wスレッド処理HS2では、この保存されたスライディング位置、スライディング方向、スライディング速度(或いはこれらの少なくとも1つ)に基づいて、スライディングの領域SF2の特定処理を行う。また必要であれば、キャラクタのオブジェクトOB2のモデル情報を読み出し、このモデル情報(モーションデータ)に基づいて領域SF2の形状を特定する。こうすれば、スライディング時のキャラクタのオブジェクトOB2の足や体の状態に応じて、スライディングの領域SF2の形状も変化するようになり、プレーヤの仮想現実感を更に向上できる。
2.5 回転処理
H/Wスレッド処理HS2で行われる処理として、オブジェクトOB1に対するオブジェクトOB2のヒット位置を求め、ヒット位置に応じてオブジェクトOB1を回転させる処理を行ってもよい。
例えば図9(A)では、サッカー選手のキャラクタが、ボールを表すオブジェクトOB1をキックしている。この場合に、このキックにより、ボールのオブジェクトOB1が回転して見える画像を生成できれば、プレーヤの仮想現実感を向上できる。
しかしながら、このようなオブジェクトOB1の回転処理をゲームのメインのループであるH/Wスレッド処理HS1で行うと、H/Wスレッド処理HS1の処理負荷が増加してしまう。
一方、このようなキックが行われた場合に、そのキックに応じた方向にボールを飛ばし、パスやシュートが成功したか否かなどを判断するゲーム結果の演算処理については、リアルタイムに行うことが望ましい。
そこで図9(A)のように、ボールのオブジェクトOB1に対してキャラクタの足がヒットするキックのヒットイベント発生の判断処理については、H/Wスレッド処理HS1が行う。そしてキックのヒットイベントが発生した場合には、ヒットイベントの発生をH/Wスレッド処理HS2に通知すると共に、ボールのキックに対応するゲーム結果の演算処理を行う。
そして図9(A)のようなキックのヒットイベントの発生が通知されると、H/Wスレッド処理HS2では、図9(B)に示すように、キックのヒット位置HPを求め、ヒット位置HPに応じた回転速度や回転方向で、ボールのオブジェクトOB1を回転させる処理を行う。このようにすることで、キックのヒット位置HPに応じて、ボールのオブジェクトOB1の回転速度や回転方向が変化するようになるため、プレーヤの仮想現実感を向上できる。
なお回転処理は例えば以下のようにして実現できる。即ちキックのヒットイベントが発生すると、H/Wスレッド処理HS1では、例えばキック方向、キック速度(或いはこれらの少なくとも1つ)を求める。そして、キック方向(広義にはヒット方向)、キック速度(広義にはヒット速度)を記憶部に保存する。そしてH/Wスレッド処理HS2では、保存されたキック方向、キック速度と、ヒット位置(或いはこれらの少なくとも1つ)に基づいて、オブジェクトOB1の回転速度や回転方向を求める。こうすれば、ボールのキック時のキック方向やキック速度に応じて、ボールの回転速度や回転方向が変化するようになり、プレーヤの仮想現実感を更に向上できる。
2.6 ソフトウェアのマルチスレッド処理
本実施形態では、H/Wスレッド処理HS2において、ソフトウェアのマルチスレッド処理を行うようにしてもよい。
例えば図10(A)では、第Kのフレームにおいて、戦闘機のオブジェクトOB1に対して弾のオブジェクトOB2がヒットする第1のヒットイベントが発生している。また図10(B)では、第Kのフレームの後の第L(L>K。K、Lは自然数)のフレームにおいて、オブジェクトOB1に対して弾のオブジェクトOB3がヒットする第2のヒットイベントが発生している。即ち連射された機関銃の弾が戦闘機に次々に当たっている。
この場合に図3(C)に示すように、第Kのフレーム(第1のフレーム)において、H/Wスレッド処理HS1では、オブジェクトOB1に対してOB2がヒットする第1のヒットイベントの発生を、H/Wスレッド処理HS2に通知する。また第Lのフレーム(第3のフレーム)において、H/Wスレッド処理HS1では、オブジェクトOB1に対してOB3がヒットする第2のヒットイベントの発生を、H/Wスレッド処理HS2に通知する。
すると、H/Wスレッド処理HS2では、第1のヒットイベント(OB1、OB2)に対応する第2のヒットチェック処理CH2Aと、第2のヒットイベント(OB1、OB3)に対応する第2のヒットチェック処理CH2Bとを、所与の処理単位で交互に行うようにする。即ちこの場合にはソフトウェアのマルチスレッド処理を行う。
例えば図10(C)のA1では、OB1にOB2がヒットする第1のヒットイベントしか発生していない。従って、オブジェクトOB1を構成するポリゴンの中から、オブジェクトOB2がヒットしたポリゴンを検索し、そのヒット位置を求める処理が順次行われる。具体的には図10(C)のA1では、オブジェクトOB1を構成するポリゴンPL1〜PL20に対してオブジェクトOB2がヒットしたか否かをチェックするヒットチェック処理CH2Aが行われる。
次に、OB1にOB3がヒットする第2のヒットイベントが発生すると、ソフトウェアのマルチスレッド処理に切り替わる。例えば図10(C)のA2では、オブジェクトOB1を構成するポリゴンPL1〜PL20に続いて、ポリゴンPL21〜PL30に対してオブジェクトOB2がヒットしたか否かをチェックするヒットチェック処理CH2Aが行われる。そして所与の処理単位である例えば10枚分のポリゴンの処理が終了すると、今度は、A3に示すように、例えばポリゴンPL1〜PL10に対してオブジェクトOB3がヒットしたか否かをチェックするヒットチェック処理CH2Bが行われる。そして所与の処理単位である10枚分のポリゴンの処理が終了すると、次は、例えばポリゴンPL31〜PL40に対するヒットチェック処理CH2Aが行われる。そしてその次は、ポリゴンPL11〜PL20に対するヒットチェック処理CH2Bが行われる。このように所与の処理単位で交互にヒットチェック処理CH2A、CH2Bが行われる。
このように、H/Wスレッド処理HS2においてソフトウェアのマルチスレッド処理を行うようにすれば、更に処理を効率化できる。
即ちソフトウェアのマルチスレッド処理を行わないと、第1のヒットイベントに対応するヒットチェック処理CH2Aが、オブジェクトOB1の全てのポリゴンについて終了するまで、第2のヒットイベントに対応するヒットチェック処理CH2Bはスタートできない。そして、オブジェクトOB1のポリゴン数が多い場合には、全てのポリゴンについてのヒットチェック処理CH2Aが終了するまでに時間がかかってしまい、ヒットチェック処理CH2Bが、長い期間、待たされてしまう可能性がある。
この点、図10(C)に示すようなソフトウェアのマルチスレッド処理を行えば、ヒットチェック処理CH2Bが、長い期間、待たされてしまう事態を防止できる。そしてオブジェクトOB2がヒットしたポリゴンが例えばポリゴンPL5などの前半の順番のポリゴンであれば、ヒットチェック処理CH2Bは直ぐに終了し、弾痕表示へと移行できるため、処理を効率化できる。
なお、図10(C)では、ソフトウェアスレッド処理を切り替える処理単位が10枚のポリゴンである場合を例示したが、処理単位はこれに限定されず、任意の枚数のポリゴンとすることができる。また処理単位を可変に制御してもよい。
2.7 リプレイデータ
図3では、ヒットチェック処理CH2で取得されたヒットチェック結果情報をH/Wスレッド処理HS1に通知し、H/Wスレッド処理HS1がヒットチェック結果情報に基づくゲーム処理(例えば弾痕表示処理)を行っているが、本実施形態はこれに限定されない。例えば図11に示すように、ヒットチェック処理CH2で取得されたヒット位置などのヒットチェック結果情報を、リプレイデータとして記憶部に保存するようにしてもよい。そして、リプレイデータに基づくリプレイ処理においては、保存されたヒットチェック結果情報に基づいてリプレイ画像の生成を行う。なお、この場合に、ヒットチェック結果情報を、ゲームスレッドであるH/Wスレッド処理HS1において利用してもよいし、利用しなくてもよい。
即ちリプレイ時には、リアルタイムに画像を生成する必要はなく、リプレイデータに基づく再生処理を行ってリプレイ画像を生成するだけで済むため、通常のゲームプレイ時に比べて、精細で高品質な画像を生成する場合がある。またリプレイ時には、通常のゲームプレイ時とは異なる仮想カメラの視点でリプレイ画像が生成される場合がある。例えば通常のゲームプレイ時に比べて、オブジェクトと仮想カメラの距離を近づけて、リプレイ画像を生成する場合がある。
この点、図11のように、ヒットチェック処理CH2で取得された詳細なヒットチェック結果情報をリプレイデータとして保存し、この詳細なヒットチェック結果情報に基づいてリプレイ画像を生成すれば、リプレイモードに最適な精細で高品質な画像の生成が可能になる。例えばプレーヤの戦闘機からの弾が敵戦闘機に当たった場面のリプレイ画像を生成する場合に、仮想カメラの視点を、ゲームプレイ時よりも敵戦闘機に近づけてリプレイ画像を生成する。そして、この時に、ヒットチェック結果情報である弾のヒット位置に基づいて、弾痕が表示されたリプレイ画像を生成する。このようにすれば、敵戦闘機に弾が当たっている様子を弾痕表示によりリアルに表現できるようになるため、プレーヤの仮想現実感や満足度を向上できる。
なおリプレイデータとして保存するヒットチェック結果情報はヒット位置の情報に限定されない。例えば図7(A)、図7(B)で説明した形状変形の情報や、図8(A)、図8(B)で説明した領域の特定情報や、図9(A)、図9(B)で説明したオブジェクトの回転に関する情報を、リプレイデータとして保存するようにしてもよい。このようにすれば、リプレイ時に、パンチのヒット位置が腫れて膨らんで見えるリプレイ画像や、スライディングで芝が削れて見えるリプレイ画像や、ボールが回転して見えるリプレイ画像を生成できるようになり、リプレイ画像の品質を向上できる。またリプレイ時に、ゲームプレイ時には見ることができなかった画像を生成してプレーヤに見せることが可能になり、リプレイモードの付加価値を高めることができる。
なお図11ではH/Wスレッド処理HS2(第2のハードウェアスレッド処理部)が、リプレイデータの保存を行っているが、H/Wスレッド処理HS1(第1のハードウェアスレッド処理部)がリプレイデータの保存を行うようにしてもよい。即ちH/Wスレッド処理HS2がヒットチェック結果情報を通知すると、H/Wスレッド処理HS1がこのヒットチェック結果情報を受けてゲーム処理を行う。それと同時にH/Wスレッド処理HS1は、このヒットチェック結果情報をリプレイデータとしてリプレイデータ記憶部に保存する。この場合、戦闘機とミサイルや弾とが実際にヒットしたことを表すヒットイベントフラグF2を、リプレイデータに関連づけて保存する。こうすることで、リプレイモード時に、これらのリプレイデータとヒットイベントフラグF2を用いることで、弾痕表示等が表現された精細な画像を生成できるようになる。
2.8 詳細な処理例
次に本実施形態の詳細な処理例を図12、図13のフローチャートを用いて説明する。図12は、ゲームスレッドであるH/Wスレッド処理HS1のフローチャートである。
まずフレーム(1/60秒)の更新タイミングか否かを判断する(ステップS21)。そしてフレームの更新タイミングである場合には、図5(B)で説明したヒットイベントフラグF2がオンか否かを判断する(ステップS22)。即ちステップS22では、少なくともステップS32の画像描画指示の前に、H/Wスレッド処理HS2からのヒットチェック結果情報であるヒットイベントフラグF2の監視処理を行っている。
そしてヒットイベントフラグF2がオンである場合には、ヒット位置HPに対して弾痕を描画するための処理を行う(ステップS23)。例えば弾痕表示用のポリゴンデータを用意したり、弾痕表示用のテクスチャを用意する処理を行う。そしてヒットイベントフラグF2をオフにする(ステップS24)。なお、ステップS22でヒットイベントフラグF2がオフである判断された場合には、ステップS23、S24の処理は行われない。
次に、操作部により入力された操作データ(入力データ)を取得する(ステップS25)。そして移動体演算等のゲーム処理を行う(ステップS26)。例えば戦闘機、ミサイル、弾等の移動体(モデルオブジェクト)の移動処理を行う。即ち移動体の速度、加速度等に基づいて移動体の位置、方向(姿勢)を更新する。
次に、オブジェクトOB1、OB2(SP1、SP2)のヒット半径をR1、R2とし、OB1、OB2間の距離をRとした場合に、R≦R1+R2か否かを判断する(ステップS27)。即ち図4(A)の簡易なヒットチェック処理CH1を行う。そしてR≦R1+R2である場合には、オブジェクトOB1にOB2がヒットしたと判断して、図5(A)で説明したようにオブジェクトOB1(戦闘機)のモデル情報を保存する(ステップS28)。またオブジェクトOB2(ミサイル、弾)の位置P2とベクトルV2を保存する(ステップS29)。そしてヒットイベントが発生したことをH/Wスレッド処理HS1に通知するために、ヒットイベントフラグF1をオンにする(ステップS30)。なお、ステップS27でR>R1+R2であると判断され、オブジェクトOB1に対してOB2がヒットしていないと判断された場合には、ステップS28、S29、S30の処理は行われない。
次に、ヒットチェックの結果等に応じてゲーム結果の演算処理を行う(ステップS31)。即ち戦闘機にミサイルや弾がヒットした判断された場合には、戦闘機の耐久力を低下させたり、戦闘機を墜落させるなどのゲーム結果の演算処理を行う。そして、描画データを送信すると共に描画コマンドを発行して、当該フレームの画像の描画開始を描画部に指示する(ステップS32)。
図13は、コリジョンスレッドであるH/Wスレッド処理HS2のフローチャートである。まずヒットイベントフラグF1がオンか否かを判断する(ステップS41)。即ちH/Wスレッド処理HS1からヒットイベントの発生が通知されたか否かを監視する。そして、ポリゴンの番号を表す変数であるnを1に設定する(ステップS42)。
次に、オブジェクトOB1(戦闘機)のモデル情報と、OB2(ミサイル、弾)の位置P2とベクトルV2を読み出す(ステップS43)。これらのモデル情報、位置P2、ベクトルV2は、図12のステップS28、S29で保存されたものである。
次に、図4(B)で説明した詳細なヒットチェック処理CH2を行う。即ち、n番のポリゴンの法線をN、そのポリゴンの頂点の1つをPVとした場合に、t=(PV−P2)・N/(V2・N)を求める(ステップS44)。そして、V2・Nが0ではなく、かつ、t≧0か否かを判断する(ステップS45)。
例えば図14(A)において、直線LNの開始点をP2とし、直線LNの傾きのベクトルをV2とすると、直線LNの方程式は、
P=P2+tV2 (1)
と表せる。
またポリゴンPLの頂点の1つをPVとし、ポリゴンPLの法線をNとした場合に、ポリゴンPLを含む平面の方程式は、
(P−PV)・N=0 (2)
と表される。
従って上式(1)、(2)の連立方程式を解いてPを消去することで、開始点P2からポリゴンPLへの距離に相当するtは、下式のように求められる。
t=(PV−P2)・N/(V2・N) (3)
そしてV2・N=0である場合には、ポリゴンPLの法線Nと直線LNとが垂直であり、直線LNの方向がポリゴンPLの平面に平行になるため、直線LNとポリゴンPLの平面は交わらない。またt<0の場合には、直線LNの開始点V2の後ろ側に交点が存在するため、この場合にも直線LNとポリゴンPLの平面は交わらない。従って、ステップS45により、直線LNとポリゴンPLの平面が交わるか否かを判断できる。
次にステップS45で、「Yes」と判断された場合には、図14(B)に示すように、交点Pとポリゴンの頂点PVとを結ぶベクトルをd0とし、ポリゴンの3辺のベクトルをd1、d2、d3とした場合に、外積であるOP1=d0×d1、OP2=d0×d2、OP3=d0×d3を求める(ステップS46)。そして、OP1>0かつOP2>0かつOP3>0、または、OP1<0かつOP2<0かつOP3<0か否かを判断する(ステップS47)。そしてステップS47で「Yes」と判断された場合には、交点Pの座標をヒット位置HPとして保存する(ステップS48)。そしてヒットイベントフラグF2をオンにして(ステップS49)、ヒットイベントフラグF1をオフに戻す(ステップS50)。
即ち外積OP1、OP2、OP3のベクトルは、ポリゴンPLの法線Nと同じ方向を向くか、或いは反対の方向を向く。そして、この向きは、交点Pが三角形のポリゴンPLの内部にあるか外部にあるかで、その符号が変わる。従って、ポリゴンPLの全ての辺について符号が同じである場合には、交点PはポリゴンPLの内部に存在すると判断できる。
ステップS4又はステップS47で「No」と判断された場合には、nを1だけインクリメントする(ステップS51)。そしてnがオブジェクトOB1の総ポリゴン数よりも小さいか否かを判断し(ステップS52)、小さい場合にはステップS50に移行し、小さくないならばステップS43に移行する。
3.ハードウェア構成
図15(A)に本実施形態を実現できるハードウェアの構成例を示す。
CPU900(メインプロセッサ)は、複数のCPUコア1、CPUコア2、CPUコア3を含むマルチコアプロセッサである。またCPU900は図示しないキャッシュメモリを含む。CPUコア1、2、3の各々にはベクタ演算器等が設けられている。そしてCPUコア1、2、3の各々は、例えば2つのH/Wスレッド処理をコンテクストスイッチをすることなしに並列実行でき、マルチスレッド機能がハードウェアでサポートされている。そして3つのCPUコア1、2、3の合計で、6つのH/Wスレッド処理を並列実行できる。
GPU910(描画プロセッサ)は、頂点処理やピクセル処理を行って、描画(レンダリング)処理を実現する。具体的には、シェーダプログラムに従って、頂点データの作成・変更やピクセル(フラグメント)の描画色の決定を行う。1フレーム分の画像がVRAM920(フレームバッファ)に書き込まれると、その画像はビデオ出力を介してTVなどのディスプレイに表示される。なおメインメモリ930はCPU900やGPU910のワークメモリとして機能する。またGPU910では、複数の頂点スレッド、複数のピクセルスレッドが並列実行され、描画処理のマルチスレッド機能がハードウェアでサポートされている。またGPU910にはハードウェアのテッセレータも備えられている。またGPU910は、頂点シェーダとピクセルシェーダとがハードウェア的に区別されていないユニファイド・シェーダ・タイプとなっている。
ブリッジ回路940(サウスブリッジ)は、システム内部の情報流通を制御する回路であり、USBコントローラ(シリアルインターフェース)、ネットワーク(イーサネット(登録商標))の通信コントローラ、IDEコントローラ、或いはDMAコントローラなどのコントローラを内蔵する。そしてこのブリッジ回路940により、ゲームコントローラ942、メモリーカード944、HDD946、DVDドライブ948との間のインターフェース機能が実現される。
なお本実施形態を実現できるハードウェア構成は図15(A)に限定されず、例えば図15(B)のような構成であってもよい。
図15(B)ではCPU902が、プロセッサエレメントPPと8つのプロセッサエレメントPE1〜PE8を含む。プロセッサエレメントPPは汎用的なプロセッサコアであり、プロセッサエレメントPE1〜PE8は比較的シンプルな構成のプロセッサコアである。そしてプロセッサエレメントPPとプロセッサエレメントPE1〜PE8のアーキテクチャは異なっており、プロセッサエレメントPE1〜PE8は、複数のデータに対して1命令で同じ処理を同時にできるSIMD型のプロセッサコアとなっている。これによりストリーミング処理などのマルチメディア処理を効率的に実行できる。プロセッサエレメントPPは、2つのH/Wスレッド処理を並列実行でき、プロセッサエレメントPE1〜PE8の各々は、1つのH/Wスレッド処理を実行できる。従って、CPU902では、合計で10個のH/Wスレッド処理の並列実行が可能になる。
図15(B)では、GPU912とCPU902の連携が密になっており、GPU912は、CPU902側のメインメモリ930に直接にレンダリング処理を行うことができる。また例えばCPU902がジオメトリ処理を行って、頂点データを転送したり、GPU912からCPU902にデータを戻すことも容易にできる。またCPU902が、レンダリングのプリプロセッシング処理やポストプロセッシング処理を行うことも容易であり、テッセレーション(平面分割)やドットフィルをCPU902が実行できる。例えば抽象度の高い処理はCPU902が行い、抽象度が低い細かな処理はGPU912が行うというような役割分担が可能である。
なお本実施形態の各部の処理をハードウェアとプログラムにより実現する場合には、情報記憶媒体には、ハードウェア(コンピュータ)を本実施形態の各部として機能させるためのプログラムが格納される。より具体的には、上記プログラムが、ハードウェアであるプロセッサ(CPU、GPU)に処理を指示すると共に、必要であればデータを渡す。そして、プロセッサは、その指示と渡されたデータとに基づいて本発明の各部の処理を実現する。
なお、上記のように本実施形態について詳細に説明したが、本発明の新規事項および効果から実体的に逸脱しない多くの変形が可能であることは当業者には容易に理解できるであろう。従って、このような変形例はすべて本発明の範囲に含まれるものとする。例えば、明細書又は図面において、少なくとも一度、より広義または同義な異なる用語(装飾画像、ヒット方向、ヒット速度等)と共に記載された用語(弾痕画像、キック方向、キック速度等)は、明細書又は図面のいかなる箇所においても、その異なる用語に置き換えることができる。
また、ヒットチェック処理手法、情報の保存手法、画像の生成手法も本実施形態で説明したものに限定されず、これらと均等な手法も本発明の範囲に含まれる。
また本発明は種々のゲームに適用できる。また本発明は、業務用ゲームシステム、家庭用ゲームシステム、多数のプレイヤが参加する大型アトラクションシステム、シミュレータ、マルチメディア端末、ゲーム画像を生成するシステムボード、携帯電話等の種々の画像生成システムに適用できる。