以下では、本発明の作用・効果をより明確に説明するために、本発明の実施の形態を、次のような順序に従って説明する。
A.装置構成 :
A−1.ゲーム機の構成 :
A−2.カラープリンタの構成 :
B.ゲーム画面の表示の概要 :
C.第1実施例 :
C−1.画像印刷処理 :
C−2.印刷データ出力処理 :
C−3.印刷処理 :
C−4.第1の変形例 :
C−5.第2の変形例 :
D.第2実施例 :
A.装置構成 :
A−1.ゲーム機の構成 :
図1は、本実施例の画像データ生成装置を備えたゲーム機100の構成を示す説明図である。本実施例のゲーム機100は、CPU101を中心として、メインメモリ110、座標変換器(以下、GTE:Geometry Transfer Engine)112、フレームバッファ114、画像処理器(以下、GPU:Graphic Proccesing Unit)116、ROM108、ドライバ106、通信制御部103などが、バスを介して相互にデータをやり取り可能に接続されて構成されている。また、ゲーム機100には、ゲーム機100の操作を行うためのコントローラ102などが接続されている。更に、本実施例のゲーム機100にはカラープリンタ200も接続されており、ゲーム中の画面をカラープリンタ200に出力することも可能となっている。
CPU101は、いわゆる算術演算や論理演算を実行する中央演算装置であり、ゲーム機100全体の制御を司っている。ROM108は、読み出し専用のメモリであり、ゲーム機100の電源投入後にCPU101が初めに実行するプログラム(ブートプログラム)を始めとして、各種のプログラムが格納されている。メインメモリ110は、データの読み出しおよび書き込みが可能なメモリであり、CPU101が算術演算や論理演算を実行する際に一時的な記憶領域として使用される。GTE112は、CPU101の制御の下で、メインメモリ110にアクセスしながら、幾何学的形状を三次元空間で移動、回転させるための演算を高速に実行する。GPU116は、CPU101からの命令を受けて、モニタ150上に表示される画面を生成する処理を高速に実行する。フレームバッファ114は、GPU116が、モニタ150上に表示される画面を生成するために使用する専用メモリである。GPU116は、フレームバッファ114上に生成した画面のデータを読み出してモニタ150に出力することにより、ゲーム中の画面を表示する。また、ゲーム中の画面を印刷する場合には、フレームバッファ114上に生成されたデータがGPU116を介してカラープリンタ200に供給されることによって、ゲーム中の画像が印刷される。
ゲームを実行するためのプログラムや各種のデータは、いわゆるコンパクトディスクやデジタルビデオディスクなどの記憶ディスク105に記憶されている。これら記憶ディスク105をゲーム機100にセットすると、記憶ディスク105に記憶されているプログラムおよびデータがドライバ106によって読み出され、メインメモリ110に一旦記憶される。そして、コントローラ102の操作内容が通信制御部103を介してCPU101に入力されると、CPU101が、メインメモリ110に記憶されているプログラムを読み出して所定の処理を実行することにより、ゲームが実行される。
A−2.カラープリンタの構成 :
図2は、本実施例のゲーム機100に接続されているカラープリンタ200の概略構成を示す説明図である。カラープリンタ200はシアン,マゼンタ,イエロ,ブラックの4色インクのドットを形成可能なインクジェットプリンタである。もちろん、これら4色のインクに加えて、染料または顔料濃度の低いシアン(淡シアン)インクと、染料または顔料濃度の低いマゼンタ(淡マゼンタ)インクとを含めた合計6色のインクドットを形成可能なインクジェットプリンタを用いることもできる。尚、以下では場合によって、シアンインク,マゼンタインク,イエロインク,ブラックインク,淡シアンインク,淡マゼンタインクのそれぞれを、Cインク,Mインク,Yインク,Kインク,LCインク,LMインクと略称することがあるものとする。
カラープリンタ200は、図示するように、キャリッジ240に搭載された印字ヘッド241を駆動してインクの吐出およびドット形成を行う機構と、このキャリッジ240をキャリッジモータ230によってプラテン236の軸方向に往復動させる機構と、紙送りモータ235によって印刷用紙Pを搬送する機構と、ドットの形成やキャリッジ240の移動および印刷用紙の搬送を制御する制御回路260などから構成されている。
キャリッジ240には、Kインクを収納するインクカートリッジ242と、Cインク,Mインク,Yインクの各種インクを収納するインクカートリッジ243とが装着されている。インクカートリッジ242,243をキャリッジ240に装着すると、カートリッジ内の各インクは図示しない導入管を通じて、印字ヘッド241の下面に設けられた各色毎のインク吐出用ヘッド244ないし247に供給される。
図3は、インク吐出用ヘッド244ないし247におけるインクジェットノズルNzの配列を示す説明図である。図示するように、インク吐出用ヘッドの底面には、C,M,Y,Kの各色のインクを吐出する4組のノズル列が形成されており、1組のノズル列あたり48個のノズルNzが、一定のノズルピッチkで配列されている。
制御回路260は、CPUや、ROM、RAM、PIF(周辺機器インターフェース)等がバスで相互に接続されて構成されている。制御回路260は、キャリッジモータ230および紙送りモータ235の動作を制御することによってキャリッジ240の主走査動作および副走査動作を制御するとともに、外部から供給される印刷データに基づいて、各ノズルから適切なタイミングでインク滴を吐出する制御を行う。こうして、制御回路260の制御の下、印刷媒体上の適切な位置に各色のインクドットを形成することによって、カラープリンタ200はカラー画像を印刷することができる。
また、インク滴を吐出するためにノズルに供給される駆動信号波形を制御してやれば、吐出されるインク滴の大きさを変更して、大きさの異なるインクドットを形成することもできる。このようにしてインクドットの大きさを制御することができれば、印刷しようとする画像の領域に応じて異なる大きさのインクドットを使い分けてやることで、より高画質の画像を印刷することも可能となる。
尚、各色のインク吐出ヘッドからインク滴を吐出する方法には、種々の方法を適用することができる。すなわち、ピエゾ素子を用いてインクを吐出する方式や、インク通路に配置したヒータでインク通路内に泡(バブル)を発生させてインク滴を吐出する方法などを用いることができる。また、インクを吐出する代わりに、熱転写などの現象を利用して印刷用紙上にインクドットを形成する方式や、静電気を利用して各色のトナー粉を印刷媒体上に付着させる方式のプリンタを使用することも可能である。
以上のようなハードウェア構成を有するカラープリンタ200は、キャリッジモータ230を駆動することによって、各色のインク吐出用ヘッド244ないし247を印刷用紙Pに対して主走査方向に移動させ、また紙送りモータ235を駆動することによって、印刷用紙Pを副走査方向に移動させる。制御回路260は、キャリッジ240の主走査および副走査の動きに同期させながら、適切なタイミングでノズルを駆動してインク滴を吐出することによって、カラープリンタ200は印刷用紙上にカラー画像を印刷することが可能となっている。
B.ゲーム画面の表示の概要 :
本実施例のゲーム機100では、ゲームの舞台として設定された仮想的な三次元空間の中で、メインキャラクタを操作することによってゲームが進行するようになっている。図4は、モニタ150上にゲーム中の画面が表示されている様子を例示した説明図である。図示されている画面には、想像上の惑星表面が表示されており、惑星の表面には各種の建造物が設定されている様子が仮想的に表示されている。このようなゲームの舞台の中を、メインキャラクタである飛行艇を操縦しながら進んでいくことによってゲームが行われる。
モニタ150の画面では二次元の形状しか表現し得ないが、ゲーム機100の内部では、惑星表面や、飛行艇、各種の建造物などについては三次元的な形状を伴った物体として表現されている。このように、ゲーム機100の内部で三次元的な形状を伴うものとして扱われている物体を、本明細書中では「オブジェクト」と呼ぶことにする。図4に例示した画面では、画面のほぼ中央に大きく表示された飛行艇ob1 や、惑星表面ob2 、ドーム状の建造物ob3 、遠方に見えるピラミッド状の2つの建造物ob11、ob12、更には、惑星の表面上を飛行する6つの飛行円盤ob4 ないしob9 などがオブジェクトであり、これらについては、物体の表面形状を三次元的に表すデータが記憶されている。このため、メインキャラクタである飛行艇ob1 を操作することにより、飛行艇ob1 に対して、他のオブジェクト(例えば建造物や飛行円盤等)の位置関係が変化すると、これに伴って、モニタ150上でのオブジェクトの見え方も変化することになる。この結果、飛行艇ob1 や、惑星表面ob2 などのオブジェクトは、想像によって作り出されたものであるにも拘わらず、あたかも現実に存在しているかのように、モニタ150に表示することが可能となっている。また、詳細には後述するが、本実施例のゲーム機100では、モニタ150に表示された画面を印刷することで、あたかも写真で撮影したかのような画像を印刷することも可能となっている。
尚、図4に示した例では、惑星の空の部分や、空に浮かぶ衛星は、オブジェクトではなく二次元的な画像がそのままモニタ150に表示されたものとなっている。従って、これらについては、飛行艇ob1 を操作しても、モニタ150上での見え方が変化することはない。これは、ゲームのメインキャラクタである飛行艇ob1 の移動範囲に対して極めて遠方にあるため、飛行艇ob1 の位置が変わっても見え方はほとんど変化せず、従って二次元画像として扱えば十分であることによる。図5は、モニタ150の画面上で、二次元画像がそのまま表示されている領域を、ハッチングを付して表した説明図である。このように、本実施例のゲーム機100では、モニタ150に表示される画面の一部に、二次元画像を嵌め込んで表示することも可能となっている。
次に、ゲーム機100が、物体を三次元的な形状を伴ったオブジェクトとして取り扱う方法について説明する。図6は、メインキャラクタである飛行艇ob1 の形状を示す斜視図である。図の左側には、飛行艇ob1 を斜め後方から見た様子が示されており、図の右側には、飛行艇ob1 を斜め前方から様子が示されている。図示されているように、飛行艇ob1 は、表面のほとんどの部分が滑らかな曲面によって構成されている。ゲーム機100の内部では、このような三次元的な曲面を有する物体を、平面多角形を用いて表現する。すなわち、三次元的な曲面を細かな平面多角形に分割し、これら平面多角形によって近似的に表現するのである。
図7は、メインキャラクタの飛行艇ob1 の形状を細かな平面多角形によって表現した様子を概念的に示した説明図である。このように、細かな多角形に分割すれば三次元的な曲面を持った物体形状を、平面多角形によって表現することが可能である。尚、このような平面多角形は「ポリゴン」と呼ばれている。本実施例のゲーム機100では、全てのオブジェクトがポリゴンの集まりとして表現されており、ポリゴンを構成する各頂点の三次元座標値によってオブジェクトの形状が表現されている。本明細書においては、ポリゴンの頂点の座標によってオブジェクトの形状を表現したデータを、「ポリゴンデータ」と呼ぶことにする。また、本実施例のゲーム機100においては、各オブジェクトのポリゴンデータは、オブジェクトテーブルと呼ばれるテーブルによって管理されている。
図8は、本実施例のゲーム機100において、各オブジェクトのポリゴンデータを管理するために用いられるオブジェクトテーブルを概念的に示した説明図である。図示されているように、オブジェクトテーブルには、各オブジェクトを識別するためのオブジェクト番号と、オブジェクトの形状を示したポリゴンデータが格納されているメインメモリ110の先頭アドレスと、オブジェクトを構成するポリゴン数とが記憶されている。オブジェクトテーブルには、このようなオブジェクト番号とポリゴンデータの先頭アドレスとポリゴン数とを一組とするレコードが、オブジェクトの数だけ設定されている。
図9は、オブジェクトの形状を示したポリゴンデータのデータ構造を示す説明図である。図示されているようにポリゴンデータは、ポリゴンの通し番号と、各ポリゴンを構成する頂点のXYZ座標値と、ポリゴンに付与されるテクスチャの番号と、オブジェクトに設定されている基準点のXYZ座標値などから構成されている。このうち、ポリゴンの番号、頂点座標、テクスチャ番号についてはポリゴン毎に一組ずつ設定されており、一方、基準点のXYZ座標値はオブジェクトについて設定されている。
各ポリゴンに設定されている頂点座標の個数は、ポリゴンの形状に応じた個数が設定されている。例えば、ポリゴンが三角形であれば3つの頂点から構成されているから、そのポリゴンについては3つの頂点座標が設定される。同様に、ポリゴンが四角形であれば4つの頂点座標が設定されることになる。本実施例では、全てのオブジェクトが三角形のポリゴンで構成されており、従って、各ポリゴンには3つずつ頂点座標が設定されている。
また、テクスチャ番号は、簡単に言えば、ポリゴン内を塗りつぶすべき色彩を示す番号のようなものと考えることができる。例えば、オブジェクトの表面が赤ければ、そのオブジェクトを構成する全てのポリゴンを赤色としておけばよい。この場合、ポリゴンのテクスチャ番号には、赤色を示す番号が指定されることになる。もっとも、このように色彩だけでなく、アルミや真鍮などの各種の金属表面や、ガラスのような透明な表面、更には木肌のような表面を、テクスチャ番号として指定することも可能である。テクスチャ番号は、このようにポリゴンに付与される表面の状態を指定する番号である。
一方、オブジェクトについて設定されている基準点は、三次元空間におけるオブジェクトの位置と姿勢とを表すために用いられるXYZ座標値である。本実施例のゲーム機100では、ゲーム中に表示されるモニタ150の画面を、あたかも写真のような鮮明な画像として印刷することが可能となっており、詳細には後述するが、対象とするオブジェクトの位置および向きの情報を用いることによって、このような鮮明な画像を印刷することを可能としている。このため本実施例のオブジェクトには、そのオブジェクトが三次元空間内のどの位置に存在していて、どちらの方向を向いているかを特定するために、基準点が設定されている。図7に示した飛行艇(オブジェクト番号ob1 )については、機体先頭部に設けられた基準点P1と、左右の尾翼の後端にそれぞれ設けられた基準点P2、P3の、合計3つの基準点が設けられている。このように、最低3つの基準点が設けられていれば、三次元空間内でのオブジェクトの位置および向きを特定することができる。もちろん、基準点の個数は3つに限らず、より多数の基準点を設けておくこととしても良い。図9に示したポリゴンデータには、これら基準点のXYZ座標値が設定されている。尚、基準点は、必ずしも全てのオブジェクトに設けられている必要はない。この点については、後ほど詳しく説明する。
以上に説明したように、本実施例のゲーム機100では、全てのオブジェクトにオブジェクト番号が付与されており、オブジェクトの表面形状はポリゴンの頂点座標を示すポリゴンデータによって表現されている。そして、オブジェクト番号からオブジェクトテーブルを引くことによって対応するポリゴンデータの先頭アドレスを取得すれば、メインメモリ110の該当アドレス以降に書き込まれているデータを読み出すことによって、オブジェクトの三次元的な形状を表した頂点座標を取得することが可能となっている。ゲーム機100のモニタ150に表示するための画像データは、このようにして取得した三次元形状を示すポリゴンデータに、後述する処理を施すことによって生成されている。
尚、図8に例示したオブジェクトテーブルでは、ポリゴンデータの先頭アドレス、およびオブジェクトを構成するポリゴン数の2つの項目だけが、オブジェクト番号に対応付けて設定されているが、これら以外の項目も設定することとしても良い。例えば、オブジェクトを構成するポリゴンのタイプ、すなわちポリゴンが何角形であるかを示すデータや、ポリゴンに基準点が設けられているか否か、更には基準点の個数を示すデータなどを、オブジェクト番号に対応付けて設定しておくことも可能である。
図10は、本実施例のゲーム機100が、ゲーム中の画面をモニタ150に表示する処理の概要を示したフローチャートである。かかる処理は、CPU101を中心として、メインメモリ110、GTE112、フレームバッファ114、GPU116などが協動しながら実行される処理である。以下、フローチャートに従って説明する。
ゲーム画面表示処理を開始すると、CPU101は、コントローラ102からの入力があったか否かを判断する(ステップS10)。前述したように、ゲーム中は、ゲーム機100に対する操作は専らコントローラ102によって行われるので、先ず初めにコントローラ102からの操作入力があったか否かを判断するのである。そして、入力がなかった場合は(ステップS10:no)、フレームバッファ114に記憶されている画像データをモニタ150に出力して、画面の表示を更新する処理(画面更新処理)を行う(ステップS50)。フレームバッファ114には、モニタ150に表示すべき画像データが生成されて記憶されている。画像データを生成してフレームバッファ114に記憶するための処理、およびフレームバッファ114に記憶されている画像データをモニタ150に出力する画面更新処理の内容については後述する。一方、コントローラ102からの入力があったと判断された場合には(ステップS10:yes)、コントローラ102による操作の内容をモニタ150の画面に反映させるべく、後述する一連の処理を行う。
コントローラ102からの入力が検出されると、コントローラ102によって操作されたオブジェクトを、ゲームの舞台として設定されている三次元空間内で、操作に応じた距離および方向に移動させる処理を行う(ステップS20)。一例として、コントローラ102による操作が、メインキャラクタである飛行艇ob1 を前進させるものであった場合について説明する。前述したように飛行艇ob1 は、ゲーム機100の内部では複数のポリゴンによって表現されており(図7参照)、各ポリゴンの頂点座標はポリゴンデータに設定されている(図9参照)。また、ポリゴンデータが記憶されているメモリ領域の先頭アドレスは、オブジェクトテーブルを参照することによって取得することができる。
そこで、メインキャラクタである飛行艇ob1 を前進させる場合は、先ずオブジェクトテーブルを参照して、飛行艇(オブジェクト番号ob1 )に対応するポリゴンデータの先頭アドレスを取得する。次いで、メインメモリ110上の取得したアドレスを先頭とするメモリ領域に記憶されているポリゴンデータを読み出すことによって、各ポリゴンを構成する頂点座標を取得する。こうして得られた頂点座標は、ゲームの舞台として設定された三次元空間内において、現時点での飛行艇ob1 の位置を表す座標となっている。
この点について、若干補足して説明する。記憶ディスク105には、各オブジェクトについてのポリゴンデータの初期値が記憶されている。ゲームの開始時には、初期値のポリゴンデータが、記憶ディスク105から読み込まれてメインメモリ110に記憶されるとともに、ポリゴンデータを記憶した先頭アドレス値が、オブジェクトテーブルに設定される。そして、ゲームの進行に伴って、オブジェクトが移動、回転、あるいは変形すると、後述する処理によって、メインメモリ110に記憶されているポリゴンデータの内容が更新されていく。従って、オブジェクトテーブルを参照して先頭アドレスを取得すれば、各オブジェクトの現時点での頂点座標を読み出すことが可能となっているのである。
ここでは、飛行艇ob1 が前進するように、コントローラ102が操作されたものとしているから、図10に示したゲーム画面表示処理のS20では、オブジェクトテーブルを参照することにより、現在の飛行艇ob1 の位置を示すポリゴンデータをメインメモリ110から取得する。次いで、コントローラ102の操作量から、三次元空間内で飛行艇ob1 を移動させる向きと移動量とを決定し、移動後の飛行艇ob1 の座標値を算出する。かかる演算は、CPU101の制御の下でGTE112によって高速に実行される。具体的には、CPU101は飛行艇ob1 の移動方向および移動量を決定すると、ポリゴンデータの先頭アドレスの値と共にGTE112に供給する。GTE112は、供給された先頭アドレスに基づいて飛行艇ob1 のポリゴンデータを読み出した後、このポリゴンデータの頂点座標に対して座標変換を行うことにより、移動後の頂点座標を算出する。こうして得られた変換後の頂点座標によって、メインメモリ110のポリゴンデータを更新する。以上では、メインキャラクタである飛行艇ob1 を前進させた場合について説明したが、コントローラ102によって他のオブジェクトが操作された場合は、操作されたオブジェクトについて同様の処理が実行される。この結果、メインメモリ110に記憶されている各オブジェクトのポリゴンデータには、常に最新のオブジェクトの座標値が記憶されていることになる。
このようにして、コントローラ102の操作をオブジェクト位置に反映させたら、各オブジェクトのポリゴンデータから二次元画像のデータを生成する処理(レンダリング処理)を開始する(ステップS30)。レンダリング処理では、ポリゴンデータによって表現された三次元的なオブジェクトを、モニタ150の画面に相当する平面上に投影するような処理を行うことによって、三次元的なオブジェクトから二次元的な画像を生成する。
図11は、レンダリング処理の概要を示した説明図である。図11では、サイコロ形状のオブジェクトにレンダリング処理を施すことにより、二次元的な画像を生成する様子が示されている。レンダリング処理に際しては、先ず初めに、オブジェクトを観察するための視点Qを設定し、次いで、オブジェクトと視点Qとの間に、モニタ150の画面に相当する投影面Rを設定する。そして、オブジェクトの表面から選択した任意の点と視点Qとを直線で結び、この直線が投影面Rと交差する交点を決定する。例えば、図11に示したように、オブジェクト上のa点を選択したとすると、a点と視点Qとを結ぶ直線が投影面Rと交わる交点としてRa点を決めることができる。ここで、周知のように光は直進する性質を有するから、a点から出て視点Qに向かう光は、投影面R上のRa点に像を結ぶことになる。換言すれば、投影面R上のRa点は、オブジェクト上のa点が投影される点と考えることができる。従って、オブジェクトの表面の全ての点について、このような操作を行えば、投影面R上に投影されたオブジェクトの二次元像を得ることができる。
もっとも、前述したようにオブジェクトはポリゴンによって表現されているから、オブジェクト表面の全ての点についてこうした操作を行う必要はなく、ポリゴンの頂点座標についてのみ実行すればよい。例えば、図11に示すように、オブジェクト表面のb点およびc点が、投影面R上のRb点、Rc点にそれぞれ投影されたものとする。この場合、オブジェクト上のa点、b点、c点を頂点とする三角形のポリゴンは、投影面R上では、Ra点、Rb点、Rc点を頂点とする三角形の領域に投影されるものと考えて良い。また、オブジェクト上のポリゴンが例えば赤色であったとすると、このポリゴンが投影面R上に投影された三角形の領域も赤色になると考えて良い。すなわち、オブジェクト上のポリゴンが有するテクスチャ番号は、投影面R上に投影された領域にも引き継がれると考えることができる。
更に、レンダリング処理では、いわゆる陰面消去と呼ばれる処理も行われる。陰面消去とは、オブジェクト表面の中で、他の表面の陰になっている部分を消去する処理である。例えば、図11に示した例では、オブジェクト表面のb点、d点、e点を頂点とするポリゴンは、視点Qから見てオブジェクトの裏側にあり、全体が他の表面の陰になっているため投影面R上に像を結ぶことはない。そこで、このようなポリゴンについては、投影面R上に投影像が表示されないようにするのである。尚、オブジェクトの形状および視点Qの設定によっては、あるポリゴンの一部の領域だけが他の表面の陰になる場合もある。このような場合は、そのポリゴンの陰になっている部分だけの表示が省略されて、陰になっていない部分についてだけ、投影像が表示されることになる。
このように、レンダリング処理では、オブジェクトを構成するポリゴンの頂点を投影面Rに投影したときの座標値を算出する処理が行われる。このような座標値の算出は、比較的簡単に行うことができる。図12(a)は、オブジェクト上の座標点(X,Y,Z)を投影して得られる投影面R上の座標値(U,V)を求める計算式を示した説明図である。ここで、図12(a)中のα、β、γ、δは、視点Qから投影面R、あるいはオブジェクトまでの距離によって定まる係数である。あるいは、簡易的には、図12(b)に示すように、除算を含まない計算式を用いることもできる。ここで、図12(b)中のε、ζ、η、θ、ι、κは、それぞれ視点Qから投影面R、あるいはオブジェクトまでの距離によって定まる係数である。
また、詳細な説明は省略するが、レンダリング処理では、三次元空間内の予め設定された位置に光源を置いて、オブジェクト表面に陰影を付けるシェーディングと呼ばれる処理や、遠近感を強調するために、遠方にある部分ほど輝度を低下させたり、投影像をぼかす処理などが行われることもある。こうした一連の処理からなるレンダリング処理は、GTE112がCPU101からの命令を受け取って、メインメモリ110に記憶されているポリゴンデータに対して所定の演算を実行し、得られた結果を用いて、メモリ上のポリゴンデータを更新することによって行われる。そして、モニタ150の画面に現れる全てのオブジェクトについて、以上のような処理を行ったら、図10のステップS30に示したレンダリング処理を終了する。
上述したレンダリング処理に続いて、ゲーム機100のCPU101は、描画処理を開始する(図10のステップS40)。描画処理とは、レンダリング処理によって生成された投影像から、画素毎に階調値が設定された画像データを生成する処理である。すなわち、レンダリング処理で得られた投影像は、ポリゴンが投影された多角形の頂点の座標と、その多角形に付与すべきテクスチャ番号とを用いた形式で表現されている。これに対して、モニタ150上で表示可能な画像データは、画像を画素と呼ばれる微細な領域に細分し、画素毎に階調データ(通常は、輝度を表すデータ)を設定した形式で表現されている。各画素に1種類の輝度データを設定した場合には、モノクロ画像の画像データとなり、光の三原色を構成するRGB各色の輝度データを設定した場合には、カラー画像の画像データとなる。尚、RGB各色の輝度データの代わりに、明度に対応する階調データと、色差に対応する2種類の階調データを用いてカラー画像を表現することも可能である。いずれにしても、レンダリング処理によって得られた投影像を表すデータは、そのままではモニタ150上に表示することができないので、モニタ150で表示可能なデータ形式に変換する処理を行う。このような処理が描画処理と呼ばれる処理である。また、図5を用いて前述したように、画面に二次元画像が嵌め込まれている場合は、描画処理の中で二次元画像のデータを嵌め込んでやればよい。
描画処理を開始すると、ゲーム機100のCPU101は、GPU116に向かって描画命令を出力する。この描画命令を受けて、GPU116が画像データを生成してフレームバッファ114に記憶することによって描画処理が行われる。
図13は、描画命令によって描画しようとする画像、すなわち、前述したレンダリング処理によって生成された投影像を、概念的に示した説明図である。また、図14は、このような画像を描画するために、CPU101からGPU116に向かって出力される描画命令のデータ構造を概念的に示した説明図である。先ず、図13を参照しながら、描画の対象となる投影像について説明する。描画の対象となる投影像は、前述したように、オブジェクトを構成するポリゴンを投影面R上に投影することによって得られた二次元画像である。本実施例では、オブジェクトは全て三角形のポリゴンを用いて構成されているものとしているから、原則として全てのポリゴンが、三角形の画像として投影面R上に投影される。尚、ポリゴンとは、前述したようにオブジェクトを構成する平面多角形を指しており、ポリゴンが投影面Rに投影された多角形は、厳密にはポリゴンとは異なるものである。しかし、以下では説明の便宜から、このようなポリゴンの投影像も、ポリゴンと呼ぶことがあるものとする。また、特にこれらを区別する場合は、「オブジェクトを構成するポリゴン」、および「投影像を構成するポリゴン(あるいは二次元画像のポリゴン)」などと称することがあるものとする。
図13に示されている投影像は、ポリゴン1、ポリゴン2、ポリゴン3の3つのポリゴンから構成されている。また、投影像がいずれも三角形のポリゴンによって構成されているのは、オブジェクトを構成するポリゴンが全て三角形のポリゴンによって構成されており、これら三角形のポリゴンを投影面R上に投影すると三角形の投影像が得られることに対応したものである。そして、図11を用いて前述したように、これら投影像を構成するポリゴンには、オブジェクトを構成するポリゴンと同じテクスチャ番号が付与されている。
このような投影像を描画する場合、CPU101は図14に示すようなデータ構造の描画命令を出力する。図示されているように描画命令は、「CODE」と、テクスチャ番号と、投影面R上での頂点の座標値とを一組とするデータが、投影像を構成するポリゴン毎に設定された構造となっている。ここで、「CODE」は、この命令が描画命令であることを表すとともに、描画の対象としているポリゴンの形状を指定するデータとなっている。すなわち、オブジェクトを構成するポリゴンは、三角形に限らず、四角形や五角形などのポリゴンが使用される場合もあり、これに伴って投影像を構成するポリゴンの形状も変わってくる。また、オブジェクトのポリゴンが三角形であったとしても、一部が他のポリゴンの陰になった場合などには投影面Rの上のポリゴンを、例えば四角形のポリゴンとして扱うことも可能である。このようなことを考慮して、本実施例の描画命令では、ポリゴン毎にポリゴンの形状を指定可能となっているのである。
本実施例の描画命令には、「CODE」に続いて、テクスチャ番号が設定されている。このテクスチャ番号は、投影像を構成するポリゴンに付与されているテクスチャ番号であり、ほとんどの場合は、オブジェクトを構成するポリゴンに付与されたテクスチャ番号と同じものとなる。尚、テクスチャ番号の代わりに、ポリゴンに付与すべき色情報(例えば、R,G,B各色の階調値)を設定しておくことも可能である。
テクスチャ番号に続いて、ポリゴンを構成する頂点の投影面R上での座標値が設定されている。頂点座標の個数は上述した「CODE」によって決定される。例えば、「CODE」においてポリゴンの形状が三角形と指定されている場合は、3つの頂点座標が設定され、四角形のポリゴンと指定されている場合は、4つの頂点座標が設定されることになる。描画命令は、このような「CODE」、テクスチャ番号、頂点座標を一組とするデータが、投影像を構成するポリゴン毎に設定されたデータ構造となっている。
図14に例示した描画命令では、描画の対象としている投影像が、ポリゴン1ないしポリゴン3の3つのポリゴンから構成されていることと対応して、「CODE」、テクスチャ番号、頂点座標からなる三組のデータが設定されている。すなわち、ポリゴン1については、「CODE」およびテクスチャ番号に続いて、ポリゴン1を構成する3つの頂点A、B、Cの座標値が設定されている。また、ポリゴン2については、「CODE」およびテクスチャ番号に続いて、ポリゴン2を構成する3つの頂点B、C、Dの座標値が設定され、ポリゴン3については、「CODE」、テクスチャ番号に続いて、ポリゴン3を構成する3つの頂点C、D、Eの座標値が設定されている。これらポリゴンの頂点座標およびテクスチャ番号は、前述したレンダリング処理の中でGTE112によって生成された後、メインメモリ110に記憶されている。CPU101は、メインメモリ110に記憶されているデータの中から、モニタ150の画面上に表示すべき全てのオブジェクトについて、これらのデータを読み出すことにより、図14に示すようなデータ構造の描画命令を生成してGPU116に供給する。
GPU116は、このような描画命令を受け取ると、各頂点を結んだ多角形の内部を、テクスチャ番号が示す色彩あるいは模様で塗り潰した二次元画像に展開する。そして、得られた二次元画像を、画像を構成する画素毎に階調データを設定した表現形式のデータに変換して、画像データとしてフレームバッファ114に記憶する。この結果、投影面R上でのポリゴンの頂点座標と、ポリゴンのテクスチャ番号とによって表現された投影像が、モニタ150で表示可能なデータ形式の画像データに変換されて、フレームバッファ114に記憶されたことになる。尚、本実施例のゲーム機100では、R,G,B各色の階調値が画素毎に設定された画像データを生成するものとする。モニタ150の画面に現れる全ての投影像について、以上のような処理を行ったら、図10のステップS40に示した描画処理を終了する。
描画処理を終了すると、今度は、フレームバッファ114上に得られた画像データをモニタ150に出力して、モニタ150の画面を更新する処理を行う(ステップS50)。すなわち、画面解像度や、インターレースあるいはノンインターレースと言った走査方式など、モニタ150の仕様に合わせて、フレームバッファ114から画像データを読み出してビデオ信号としてモニタ150に供給する。こうすることで、フレームバッファ114に展開した二次元画像をモニタ150の画面に表示させることができる。
また、モニタ150の表示を少なくとも1秒間に24回以上の頻度で更新してやれば、人間の網膜が有する残像現象により、あたかも連続して動いているかのような画像を表示することができる。本実施例のゲーム機100では、図10に示したゲーム画面表示処理を1秒間に30回程度の頻度で実行して画面の表示を更新することで、あたかもモニタ150の画面内で飛行艇ob1 などの各種オブジェクトが連続して動いているかのように表示することが可能となっている。そして、このような高速な処理を可能とするために、本実施例のゲーム機100では、座標変換を始めとする各種の演算を高速に実行可能なGTE112や、演算に用いる大量のデータを高速に読み書き可能なメインメモリ110、CPU101から受け取った描画命令に基づいて画像データを迅速に生成するGPU116、更には、生成した画像データを高速に記憶するとともにモニタ150に高速に出力可能なフレームバッファ114などが搭載されている。
もっとも、処理対象とするポリゴン数があまりに多くなると、図10に示したゲーム画面表示処理を、1秒間に30回程度の頻度で実行することは困難となる。そこで、飛行艇ob1 を始めとする各種のオブジェクトは、ポリゴン数があまり多くならないように、若干大きめのポリゴンによって構成されている。前述したようにポリゴンは平面多角形なので、ポリゴンが大きくなると、オブジェクトの表面がゴツゴツしてしまうという弊害がある。しかし、幸いにも、ゲームの画面ではオブジェクトは動いていることが多く、加えて、モニタ150は写真の様には高い描画力を有していないため、オブジェクト表面がゴツゴツしていることが目立つことはなく、従って、ゲームの臨場感を損なってしまうといった弊害が生じることはない。
しかし、モニタ150の画面を印刷装置で印刷すると、こうした状況は一変することがある。すなわち、印刷して得られる画像は静止画像であることに加えて、近年の印刷装置は写真に迫る高い描画力を有していることから、印刷画像を見ればオブジェクトの表面がゴツゴツしていることがハッキリと分かってしまうことがある。そして、このような印刷画像を見てしまった後では、たとえゲーム中のモニタ150に表示されたオブジェクトでさえも、表面がゴツゴツしている様に見えてしまい、ゲームの臨場感が大きく損なわれてしまう畏れも生じる。これに対して本実施例のゲーム機100では、モニタ150の画面を印刷装置で出力した場合でも、あたかも実物を写真で撮影したかのような、鮮明な画像を出力することが可能となっている。以下では、こうしたことを可能とする処理について詳しく説明する。
C.第1実施例 :
C−1.画像印刷処理 :
図15は、第1実施例のゲーム機100によって行われる画像印刷処理の流れを示すフローチャートである。以下、フローチャートに従って、画像印刷処理について説明する。
ゲーム機100のCPU101は、コントローラ102に設けられた所定の印刷ボタンが押されたことを検出すると、割り込みを発生させて、図15に示す画像印刷処理を開始する。尚、割り込みを発生させると、それまでCPU101が行っていた処理は一旦中断され、これに伴ってゲームの進行も、画像印刷処理を終了するまで中断されることになる。
画像印刷処理を開始すると、先ず初めにCPU101は、コントローラ102の印刷ボタンが押された時点でモニタ150に表示されていた画像の、元となったポリゴンデータ(表示用ポリゴンデータ)を取得する(ステップS100)。すなわち、前述したように、モニタ150に表示される画像は、オブジェクトを投影面Rに投影して得られた画像であり、オブジェクトを構成するポリゴンの頂点の座標値はポリゴンデータとして、メインメモリ110に記憶されている。そこで、ステップS100では、コントローラ102の印刷ボタンが押された時点でモニタ150に表示されている各オブジェクトについて、オブジェクトの表示に用いられた表示用ポリゴンデータを取得する。
次いで、画像の撮影条件を設定する処理を開始する(ステップS102)。すなわち、本実施例のゲーム機100では、モニタ150に表示された画面を単にカラープリンタ200で印刷するだけではなく、あたかもカメラを操作して写真を撮影するかのように、印刷画像を構成することも可能となっている。ステップS102では、そのためにゲーム機100に対して撮影条件を設定する処理を行う。撮影条件の設定は、ゲーム機100の操作者が、モニタ150に表示された画面を確認しながら行うことができる。
図16は、画像の撮影条件を設定するための画面が、モニタ150に表示されている様子を例示した説明図である。図示されているように、撮影条件を設定する画面のほぼ中央には、印刷ボタンを押したときにモニタ150に表示されていた画面を表示するモニタ領域151が設けられている。また、モニタ領域151の周辺には、焦点距離や、絞り、焦点を合わせる位置などを設定するボタンが設けられている。
焦点距離の設定は、モニタ領域151の右側に設けられたツマミ153を上下に動かすことで、望遠から広角までの焦点距離を選択することによって行う。また、絞りの設定は、モニタ領域151の右下に設けられたツマミ154を上下に動かすことで、開放側から絞り側までの絞り値を選択することで行う。また、焦点を合わせる位置の設定は、コントローラ102の十字カーソルを操作しながら、モニタ領域151に表示されているカーソル152を、焦点を合わせたい位置まで移動した後、設定画面上の「焦点位置設定」と表示されたボタンを押すことによって設定することができる。こうした設定した撮影条件による効果は、モニタ領域151に表示されている画像に反映されるので、効果を確認しながら撮影条件を設定することができる。そして、所望の撮影条件が決まったら、設定画面上の「OK」と表示されたボタンを押すことによって、設定した撮影条件を確定することができる。図15に示した画像印刷処理のステップS102では、以上のようにして、各種の撮影条件を設定する処理を行う。
ゲーム機100のCPU101は、撮影条件を設定したら、続いて印刷条件を設定する処理を開始する(ステップS104)。この印刷条件設定処理も、上述したステップS102の撮影条件設定処理と同様に、ゲーム機100の操作者が、モニタ150に表示された画面を確認しながら行うことができる。
図17は、画像の印刷条件を設定するための画面が、モニタ150に表示されている様子を例示した説明図である。図示されているように、本実施例のゲーム機100では、印刷条件として、印刷に用いる用紙サイズ、用紙種類、および印刷に際しての印刷モードの3つの項目を設定することが可能となっている。ここで、印刷モードとは、印刷を行うに際して印刷速度を優先させるか、印刷画質を優先させるかを設定するモードである。すなわち、一般的に、印刷速度と印刷画質とは相反する関係にあり、迅速に印刷しようとすると画質が低下し、高画質に印刷しようとすると印刷時間が長くなる傾向にある。そこで、特に迅速に印刷したい場合、あるいは特に高画質に印刷したい場合には、それぞれ印刷モードを「速い」あるいは「きれい」に設定することで、望んだ通りの印刷が行えるようになっているのである。
用紙サイズ及び用紙種類の設定は、コントローラ102の十字カーソルを操作することにより、画面上に表示されたカーソル152を用いて用紙サイズを選択することによって行う。また、印刷モードについては、画面に表示されたツマミ158を「きれい」から「速い」までの間で動かすことによって設定することができる。また、これらの条件に加えて、印刷枚数や、いわゆる縁なし印刷を行うか否か、といった項目を設定可能としても良い。以上のようにして、印刷条件を設定したら、設定画面上の「OK」と表示されたボタンを押すことによって、設定した印刷条件を確定する。
以上のようにして、モニタ150に表示された画面の撮影条件および印刷条件を設定したら、印刷用ポリゴンデータが記憶されているか否かを判断する(ステップS106)。ここで、印刷用ポリゴンデータとは、前述したゲーム画面表示処理で用いたポリゴンよりも小さなポリゴンを用いて、オブジェクトの三次元形状を表したデータである。
図18は、メインキャラクタである飛行艇ob1 の三次元的な形状が、小さなポリゴンを用いて表現されている様子を概念的に表した説明図である。図7と図18とを比較すれば、ゲーム画面表示処理で用いたポリゴンデータと比べて、印刷用ポリゴンデータは小さなポリゴンが用いられていることが分かる。また、オブジェクト表面の曲率が大きい(曲率半径が小さい)部分ほど、小さなポリゴンによって構成されていることが分かる。このように、小さなポリゴンを用いれば、オブジェクトの形状をより正確に表現することができ、表面の曲率が大きな部分でも、見る者にゴツゴツした印象を与えることがない。
また、印刷用ポリゴンデータにも、図7および図9に示した画面の表示に用いられる通常のポリゴンデータ(表示用ポリゴンデータ)と同様に、複数(本実施例では3つ)の基準点が設けられている。これら基準点は、印刷用ポリゴンデータの場合でも、表示用ポリゴンデータの場合でも、オブジェクトに対する位置関係では同じ位置に設けられている。例えば、図7に示したように、飛行艇ob1 の表示用ポリゴンデータでは、機体の先端と、左右の尾翼の後端とに、それぞれ基準点P1、P2、P3が設けられている。これと同様に、飛行艇ob1 の印刷用ポリゴンデータでも、機体先端と、左右の尾翼の後端とに、それぞれ基準点P1、P2、P3が設けられている。このように、印刷用ポリゴンデータが存在するオブジェクトについては、表示用ポリゴンデータおよび印刷用ポリゴンデータのそれぞれについて、オブジェクトに対して同じ位置に基準点が設けられている。逆に言えば、印刷用ポリゴンデータが存在しないオブジェクトについては、オブジェクトデータに必ずしも基準点が設定されている必要はない。
このような印刷用ポリゴンデータが存在するか否かは、印刷用ポリゴンデータの有無が予め設定されたテーブル(印刷用ポリゴンデータテーブル)を参照することによって判断することができる。図19は、印刷用ポリゴンデータの有無を判断するために参照されるテーブルを概念的に示した説明図である。図示されているように、印刷用ポリゴンデータテーブルには、印刷用ポリゴンデータが存在するオブジェクトのオブジェクト番号と、ポリゴン数とが設定されている。従って、印刷用ポリゴンデータテーブルを参照してオブジェクト番号が設定されていれば、そのオブジェクトについては印刷用ポリゴンデータが存在すると判断することができる。逆に、印刷用ポリゴンデータテーブルにオブジェクト番号が設定されていなければ、そのオブジェクトについては、印刷用ポリゴンデータは存在しないと判断することができる。
尚、図8を用いて前述したオブジェクトテーブルには、全てのオブジェクトについて、固有のオブジェクト番号と、ポリゴンデータの先頭アドレスとが設定されていた。これに対して印刷用ポリゴンデータテーブルでは、複数のオブジェクト番号に対して同じ先頭アドレスが設定される場合がある。例えば、図4に示したように、オブジェクトob4 〜ob9 の6つのオブジェクトは何れも飛行円盤を表しており、これら飛行円盤は同じ形状となっている。このような場合、印刷用ポリゴンデータテーブルには、図19に示すように、オブジェクト番号ob4 〜ob9 の6つのオブジェクトについては、同じ先頭アドレスおよびポリゴン数が設定される。このように、印刷用ポリゴンデータテーブルでは、異なるオブジェクト番号に対しても、同じ先頭アドレスおよびポリゴン数が設定されることがある理由については、後述する。
図15のステップS106において、印刷用ポリゴンデータが存在すると判断されたオブジェクトについては、図19に示した印刷用ポリゴンデータテーブルを参照して印刷用ポリゴンデータを読み込んでやる(ステップS108)。読み込んだ印刷用ポリゴンデータは、メインメモリ110の連続するアドレスに記憶する。次いで、ステップS100で先に取得しておいた表示用ポリゴンデータの基準点と、読み込んだ印刷用ポリゴンデータの基準点とを一致させた後、表示用ポリゴンデータを印刷用ポリゴンデータで差し替える処理を行う(ステップS110)。以下、この処理の内容について詳しく説明する。尚、読み込まれた印刷用ポリゴンデータは、メインメモリ110上のアドレス値Appd 以降の連続した領域に記憶されているものとする。
先ず、読み出した印刷用ポリゴンデータに対して、オブジェクトを移動あるいは回転させる座標変換を行うことにより、印刷用ポリゴンデータの基準点の座標を、ステップS100で取得しておいた表示用ポリゴンデータの基準点の座標に一致させる。このような座標変換は、図19に示した印刷用ポリゴンデータテーブルの先頭アドレスで示されているデータに対して行うのではなく、この印刷用ポリゴンデータを読み出してメインメモリ110のアドレスAppd 以降に展開したデータに対して実行する。そして、印刷用ポリゴンデータの基準点の座標を、表示用ポリゴンデータの基準点の座標と一致させたら、メインメモリ110上で、この印刷用ポリゴンデータが記憶されているメモリ領域の先頭アドレスAppd および印刷用ポリゴンデータを構成するポリゴン数によって、図8を用いて前述したオブジェクトテーブルの先頭アドレスおよびポリゴン数を書き換えてやる。このようにオブジェクトテーブルに設定されている先頭アドレスおよびポリゴン数を書き換えておけば、続いて実行するレンダリング処理および描画処理においては、表示用ポリゴンデータではなく、印刷用ポリゴンデータが参照されることになる。図15のステップS110において、表示用ポリゴンデータを印刷用ポリゴンデータで差し替える処理とは、具体的には、このようにオブジェクトテーブルに設定されている先頭アドレスおよびポリゴン数を、位置合わせした印刷用ポリゴンデータの先頭アドレスおよびポリゴン数に書き換える処理のことである。
ここで、図19に示したように、印刷用ポリゴンデータテーブルでは、異なるオブジェクト番号に対しても、同じ先頭アドレスおよびポリゴン数が設定されることがある理由について説明する。上述したように、印刷用ポリゴンデータが存在するオブジェクトについては、印刷用ポリゴンデータを読み込んだ後、基準点の座標が表示用ポリゴンデータの基準点の座標に一致するように、印刷用ポリゴンデータを移動あるいは回転させる。ここで、異なるオブジェクトは必ず異なる三次元座標値を持っているから、たとえ同じアドレス値から印刷用ポリゴンデータを読み込んだ場合でも、移動あるいは回転後は、異なった印刷用ポリゴンデータとなっている。従って、オブジェクト毎にメインメモリ110の異なる領域でこうした操作を行っておけば、元の印刷用ポリゴンデータは同じデータを使用することが可能であり、このため、印刷用ポリゴンデータテーブルでは、同じ形状のオブジェクトについては、同じ先頭アドレスおよびポリゴン数が設定されているのである。
尚、全ての表示用ポリゴンデータに印刷用ポリゴンデータが記憶されているわけではないから、印刷用ポリゴンデータに差し替えられる表示用ポリゴンデータは、一部のポリゴンデータのみである。すなわち、差し替え後のポリゴンデータは、表示用ポリゴンデータと印刷用ポリゴンデータとが混在したデータとなっている。そこで以下では、このようなポリゴンデータを、精密ポリゴンデータと呼ぶことがあるものとする。
以上のようにして、印刷用ポリゴンデータが存在するオブジェクトについては、表示用ポリゴンデータを印刷用ポリゴンデータに差し替えて精密ポリゴンデータを生成した後、今度は、レンダリング処理を開始する(ステップS112)。前述したようにレンダリング処理とは、各オブジェクトのポリゴンデータから二次元画像のデータを生成する処理である。かかる処理は、図11を用いて前述したように、視点Qと各オブジェクトとの間に設定した投影面Rへの、各オブジェクトの投影像を算出することによって行うことができる。レンダリング処理については、図11および図12を用いて既に説明しているため、ここでは詳細な説明は省略するが、撮影条件設定処理で設定された内容は、レンダリング処理における視点Qおよび投影面Rの設定に反映される。また、視点Qに対して遠方あるいは近くにあるオブジェクトに対しては、絞りの設定に応じて、投影像をぼやかすようなフィルタを施すなどの特殊な操作が行われることもある。
図10を用いて前述したゲーム画面表示処理と同様に、レンダリング処理は、CPU101の制御の下でGTE112がオブジェクトテーブルを参照しながら実行し、得られた二次元画像のデータはメインメモリ110に記憶される。尚、ステップS106において、印刷用ポリゴンデータが存在すると判断されたオブジェクトについては、続くステップS110においてオブジェクトテーブル(図8参照)が書き換えられていることから、図15のステップS122で行われるレンダリング処理は、コントローラ102の印刷ボタンを押したときにモニタ150に表示されていた表示用ポリゴンデータではなく、一部が印刷用ポリゴンデータに置き換えられた精密ポリゴンデータに対してレンダリング処理が実行される。
こうしてレンダリング処理を終了すると、今度は、メインメモリ110上に記憶されているデータを読み出して、印刷データとしてカラープリンタ200に出力する処理を開始する(ステップS200)。かかる印刷データ出力処理については、後ほど詳しく説明するが、大まかには次のような処理を行う。
先ず、レンダリング処理によって得られるデータは、投影面上に投影された二次元的なポリゴンの各頂点の座標値と、そのポリゴンに付与すべきテクスチャ番号とを示すデータである。しかし、カラープリンタ200は、画素毎の階調データによって表現された形式でデータを受け取ることから、図10を用いて前述したゲーム画面表示処理と同様に、描画処理を行って、レンダリング処理によって得られたデータを、画素毎の階調データによって表現されたデータに展開しておく必要がある。こうして展開された画素毎の階調データは、画面の表示時と同様にフレームバッファ114に記憶される。
ここで、上述したように、画像の印刷時には表示用ポリゴンデータが印刷用ポリゴンデータに差し替えられているために、ポリゴン数が増加している。このため、フレームバッファ114のメモリ容量の関係で、全てのポリゴンのデータを一度に展開することはできず、複数回に分割して展開する必要がある。そこで、印刷データ出力処理(図15のステップS200)では、精密ポリゴンデータをレンダリング処理することによって得られたデータを、先ず、メインメモリ110からポリゴン所定個数分だけ読み出して描画処理を行い、フレームバッファ114上に展開する。そして、得られたデータを印刷データとしてカラープリンタ200に出力した後、再び、レンダリング処理済みのデータをポリゴン所定個数分だけメインメモリ110から読み出して、フレームバッファ114に展開する。こうした操作を繰り返すことによって、フレームバッファ114のメモリの制約の範囲で少しずつ描画処理を行いながら、印刷データをカラープリンタ200に出力する処理を行うのである。印刷データ出力処理の詳細な内容については後述する。
全ての印刷データをカラープリンタ200に出力したら、印刷データ出力処理を終了して、図15の画像印刷処理に復帰する。続いて、画像印刷処理では、ゲーム復帰処理を行う(ステップS114)。ゲーム復帰処理は、画像印刷処理を終了して、ゲームを再開するための処理である。すなわち、上述した画像印刷処理は、前述したようにコントローラ102の印刷ボタンが押されると、ゲーム機100のCPU101が割り込みを発生させて、進行中のゲームを一旦、中断した状態で開始される。そこで、画像印刷処理の終了に先立って、CPU101は、プログラムカウンタや各種データを、ゲームの中断前の状態に復帰させて、ゲームを再開するための準備を行うのである。前述したように、精密ポリゴンデータが存在するオブジェクトについては、画像印刷処理の中でオブジェクトテーブルの設定値も書き換えられているので、これらについても、ゲーム復帰処理で元の設定値に戻されることになる。
こうしてゲーム復帰処理を終了したら(ステップS114)、図15に示した画像印刷処理を終了する。プログラムカウンタを始めとする各種の変数およびデータは、ゲーム中断前の状態に戻っているので、中断したところからゲームを再開することが可能となる。
C−2.印刷データ出力処理 :
図20は、印刷データ出力処理の流れを示すフローチャートである。かかる処理は、図15を用いて前述した画像印刷処理の中で、CPU101によって実行される処理である。以下、フローチャートに従って説明する。
印刷データ出力処理を開始すると、先ず初めに、メインメモリ110から精密ポリゴンデータを所定ポリゴン数分だけ読み込む処理を行う(ステップS202)。すなわち、フレームバッファ114のメモリ容量の制約から、精密ポリゴンデータに含まれる全てのポリゴンに対して描画命令を行うことはできないので、メモリ容量の許容範囲内で描画命令を実行するべく、次のようにして、所定数ずつポリゴンのデータを読み出してやるのである。
図21は、精密ポリゴンデータから所定数のポリゴンのデータを読み出す様子を示す説明図である。図15を用いて前述したように、印刷データ出力処理に先立って行われるレンダリング処理では、三次元的なオブジェクトを構成するポリゴンのデータから、二次元的な投影像を構成するポリゴンのデータが生成されて、メインメモリ110上に記憶されている。図21に破線で示されている三角形は、レンダリング処理によって生成された投影像を構成するポリゴンを概念的に表したものである。尚、実際の画像はもっと小さなポリゴンによって表現されているが、ここでは図示が煩雑となることを避けるために、大きなポリゴンを用いて表現されている。
また、図21中では、比較的小さなポリゴンばかりで構成された領域と、比較的大きなポリゴンばかりで構成された領域とが存在している。これは、前述した画像印刷処理において一部が印刷用ポリゴンデータに差し換えられており、得られた精密ポリゴンデータに対してレンダリング処理が行われていることに対応したものである。すなわち、図中で、小さなポリゴンばかりで構成されている領域は、印刷用ポリゴンデータに差し換えられたオブジェクトに対してレンダリング処理が施されて生成されたことを概念的に表したものである。また、大きなポリゴンばかりで構成された領域は、表示用ポリゴンデータで表現されたオブジェクトに対してレンダリング処理が施されて生成されたことを概念的に表したものである。
図20に示した印刷データ出力処理においてポリゴンデータを読み出す処理(ステップS202)では、ポリゴンの読み取りラインを設定し、この読み取りラインの設定位置を移動させながら、所定ポリゴン数ずつポリゴンデータを読み取る処理を行う。図21では、ポリゴンの読み取りラインは太い一点鎖線で示されている。また、ポリゴンの読み取りラインは、初めは画像の上端部分に設定され、ポリゴンデータの読み取りが進むに従って、順次、読み取りラインが下方に移動していく。これは、実際に画像を印刷するカラープリンタ200では、画像の印刷は上端から下端に向かって行われることに対応したものである。
図21(a)は、印刷データ出力処理を開始した直後で、先ず初めに、ポリゴンの読み取りラインが画像の上端に設定された状態を概念的に表したものである。精密ポリゴンデータを読み込む処理では、設定した読み取りラインが通過するポリゴンを検出して、これらポリゴンのデータを読み出していく。図21(a)に示した例では、こうして読み出されたポリゴンは、ハッチングを付して表示されている。また、説明の便宜上、各ポリゴンには、ポリゴンを読み出した順序を示す番号を付して表示している。ポリゴンに付した番号を見れば明らかなように、図21(a)に設定した読み取りラインの位置では、14個分のポリゴンのデータを読み出したことになる。
ここで、読み出し可能なポリゴン数には上限が存在している。これは、読み出したポリゴンデータに対して描画命令が実行されると、画素毎の階調データに変換された画像データがフレームバッファ114上に展開されるので、ポリゴン数があまりに多くなると、フレームバッファ114のメモリ容量の制約から画像データを展開できなくなってしまうためである。実際には、読み出し可能なポリゴン数は、図10に示したゲーム画面表示処理中で、モニタ150に表示される一画面を構成するためには、十分なポリゴン数に設定されているが、ここでは説明の便宜から、一度に読み出し可能なポリゴン数が「20」であるものとする。
ポリゴンの読み取りラインが、図21(a)に示した位置に設定されている場合は、読み出されるポリゴン数は14個であるから、あとポリゴン6個分のデータを読み出すことが可能である。そこで、読み取りラインの位置を少しずつ下方に移動させて、新たなポリゴンのデータを読み出しながら、20個分のポリゴンのデータを読み出してやる。図21(b)は、このようにして、20個分のポリゴンのデータを読み出した様子が概念的に示されている。すなわち、ポリゴンの読み取りラインの位置を図21(a)に示した位置から少しずつ下げていくと、先ず初めに、図21(b)中で「15番」、「16番」、「17番」と符番したポリゴンのデータが読み出される。更に、読み取りラインを下げていくと、今度は「18番」、「19番」と符番したポリゴンのデータが読み出される。そして、図21(b)に示した位置まで読み取りラインを下げると、「20番」目のポリゴンのデータが読み出されることになる。また、この時の読み取りライン上には、「21番」と符番したポリゴンや、「22番」と符番したポリゴンも存在する。しかし、読み出したポリゴン数が既に「20」に達しているので、これら2つのポリゴンについてはデータの読み出しは行わない。図20に示した印刷データ出力処理のステップS202では、このようにして、所定ポリゴン数(図21に示した例では、20個)ずつ、精密ポリゴンデータを読み出す処理を行うのである。
こうして読み出したポリゴンデータに対して描画処理を行うことにより、画素毎の階調データに展開した画像データをフレームバッファ114上に記憶する(ステップS204)。描画処理の内容については、図13および図14を用いて既に詳細に説明しているため、ここでは説明を省略する。
次いで、フレームバッファ114上に展開した画像データを、ラスタ単位でカラープリンタ200に出力する処理を行う(図20のステップS206)。図22は、フレームバッファ114上の画像データをラスタ単位で出力する様子を示す説明図である。先ず、所定ポリゴン数だけ読み出されたポリゴンデータに対して描画処理が実行されると、各ポリゴンに含まれる画素にポリゴンのテクスチャ番号に応じた階調データが付与されて、フレームバッファ114上に展開される。図22(a)は、こうしてフレームバッファ114上に画像データが展開されている様子を概念的に示したものである。ここでは、図21(b)中でハッチングを付して示したポリゴンが読み出されているものとしているから、このポリゴンが存在する領域内の各画素について、画像データが展開されることになる。
次いで、展開された画像データを、画像の上端の画素から一列分ずつ読み出して、カラープリンタ200に出力する。すなわち、図22(a)にハッチングを付して示した領域から、画像の上端の画素一列分の画像データを読み出してカラープリンタ200に出力し、次は、上端から2列目にある画素の画像データを読み出してカラープリンタ200に出力する。次いで、上端から3列目にある画素の画像データを読み出して出力する。このような一列分の画素はラスタと呼ばれる。従って、フレームバッファ114上に展開された画像データが、ラスタ単位でカラープリンタ200に出力されることになる。
図22(b)は、フレームバッファ114上に展開された画像データを、ラスタ単位で出力する様子を概念的に示した説明図である。図中で細かいハッチングを付した部分は、ラスタ単位で画像データを出力可能な領域である。ところが、この領域の一列下のラスタ(図中では太い破線によって表示)については、画像データが展開されていない画素が含まれており、ラスタ単位で画像データを出力することはできない。そこで、図20のステップS206では、このような画像データの欠落したラスタが発生するまで、フレームバッファ114上に展開された画像データをラスタ単位で読み出して、印刷データとしてカラープリンタ200に出力する処理を行う。
以上のようにして、ラスタ単位の画像データを印刷データとして出力したら、レンダリング処理が施された精密ポリゴンデータの全ポリゴンについて、処理が終了したか否かを判断する(ステップS208)。そして、未だ処理していないポリゴンが残っている場合は(ステップS208:no)、ステップS202に戻って、メインメモリ110上に記憶されている精密ポリゴンデータから、新たに所定ポリゴン数のデータを読み出してやる。
図23は、こうしてメインメモリ110上に記憶されている精密ポリゴンデータから、新たなポリゴンのデータを読み出した様子を示した説明図である。前述したように、ポリゴンのデータを読み出すに際しては、先ず初めにポリゴンの読み取りラインを設定する。ここでは、前回の処理でポリゴンデータを読み出しているから、その時に設定した読み取りラインの位置から開始する。図23中に一点鎖線で示した読み取りラインは、前回の処理で最後に読み取りラインが設定された位置(すなわち、図21(b)に示した位置)を示している。
そして、このような読み取りラインが通過するポリゴンを検出して、検出したポリゴンについてのポリゴンデータを読み出してやる。読み出したポリゴン数が所定数(ここでは、20個)に満たない場合は、読み取りラインの位置を下方に向かって移動させながら、所定個数分のポリゴンのデータを読み出してやる。このようにして、図23にハッチングで示したポリゴンについてのデータが、メインメモリ110上から読み出されることになる。次いで、このポリゴンデータに対して描画処理を行い(図20のステップS204)、フレームバッファ114上に展開された画像データをラスタ単位で読み出して印刷データとしてカラープリンタ200に出力した後(ステップS206)、全ポリゴンについての処理を終了したか否かを判断する(ステップS208)。そして、未処理のポリゴンが残っている場合は(ステップS208:no)、再び、ステップS202に戻って新たなポリゴンデータを読み出してやる。その結果、今度は、図24にハッチングで示したポリゴンについてのポリゴンデータが読み出されることになる。
図20印刷データ出力処理では、全ポリゴンについての処理を終了するまで、こうした処理を繰り返す。そして、最終的に、全ポリゴンについての処理を終了したと判断されたら(ステップS208:yes)、印刷データ出力処理を終了して、図15に示した画像印刷処理に復帰する。
図15を用いて前述したように、画像印刷処理では、印刷データ出力処理から復帰すると、ゲームを再開するためにゲーム復帰処理(図15のステップS114)を行った後、中断したゲームを再開させる。その結果、中断したところからゲームが再開されることになる。
C−3.印刷処理 :
一方、カラープリンタ200は、このようにしてゲーム機100から供給された印刷データに従って、印刷用紙上に画像を印刷する。以下では、カラープリンタ200が、印刷データを受け取って画像を印刷する処理について簡単に説明する。尚、以下では、印刷処理は、カラープリンタ200に搭載されたCPUによって実行されるものとして説明するが、カラープリンタ200では、後述するインターレース処理や、ドットを形成する処理のみを行い、他の処理についてはゲーム機100の側で行うこととしても良い。
図25に示した印刷処理を開始すると、カラープリンタ200に搭載されたCPUは、先ず初めに、ゲーム機100から出力されてきた印刷データを読み込む処理を行う(ステップS300)。次いで、解像度変換処理を開始する(ステップS302)。解像度変換処理とは、フレームバッファ114上に展開されて、印刷データとして供給された画像データの解像度を、カラープリンタ200が実際に画像を印刷しようとする解像度(印刷解像度)に変換する処理である。そして、画像データの解像度よりも印刷解像度の方が高い場合は、補間演算を行って画素間に新たな画像データを生成することにより解像度を増加させる。逆に、画像データの解像度の方が印刷解像度よりも高い場合は、読み込んだ画像データを一定の比率で間引くことによって解像度を低下させる。解像度変換処理では、ゲーム機100から供給された印刷データに対して、このような操作を行うことにより、画像データの解像度を印刷解像度に変換する。
こうして画像データの解像度を印刷解像度に変換したら、今度は、色変換処理を行う(ステップS304)。色変換処理とは、R,G,Bの階調値の組合せによって表現されているRGBカラー画像データを、印刷のために使用される各色の階調値の組合せによって表現された画像データに変換する処理である。前述したように、本実施例のゲーム機100では、画素毎にR,G,B各色の階調値が設定された画像データを生成しているのに対して、カラープリンタ200は、図2に示した様に、C,M,Y,Kの4色のインクを用いて画像を印刷する。そこで、RGB各色によって表現された画像データを、C,M,Y,Kの各色の階調値によって表現されたデータに変換する処理(色変換処理)を行うのである。
色変換処理は、色変換テーブル(LUT)を参照することで、迅速に行うことができる。図26は、色変換処理のために参照されるLUTを概念的に示した説明図である。LUTとは、次のように考えれば、三次元の数表の一種と考えることができる。先ず、図26示されているように、直交する3つの軸にR軸、G軸、B軸を取って色空間を考える。すると、全てのRGB画像データは、必ず色空間内の座標点に対応付けて表示することができる。このことから、R軸、G軸、B軸のそれぞれを細分して色空間内に多数の格子点を設定してやれば、それぞれの格子点はRGBの画像データを表していると考えることができ、RGBの画像データに対応するC,M,Y,K各色の階調値を、各格子点に対応付けてやることができる。LUTは、こうして色空間内に設けた格子点に、C,M,Y,K各色の階調値を対応付けて記憶した3次元の数表の様なものである。LUTに記憶されているRGBの画像データとC,M,Y,K各色の階調データとの対応関係に基づいて色変換処理を行えば、RGB各色の階調値によって表現された画像データを、C,M,Y,K各色の階調データに迅速に変換することが可能となる。
以上のようにして色変換処理を行ったら、カラープリンタ200に搭載されたCPUは、ハーフトーン処理を開始する(ステップS306)。ハーフトーン処理とは、次のような処理である。色変換処理によって得られた画像データは、データ長を1バイトとすると、画素毎に、階調値0から階調値255までの値を取り得る階調データである。これに対してカラープリンタ200はドットを形成することによって画像を表示しているから、それぞれの画素については「ドットを形成する」か「ドットを形成しない」かのいずれかの状態しか取り得ない。このためカラープリンタ200では、画素毎の階調値を変化させる代わりに、所定領域内で形成されるドットの密度を変化させることによって中間階調を表現している。ハーフトーン処理とは、画像データの階調値に応じて適切な密度でドットが発生するように、画素毎にドット形成の有無を判断する処理である。
階調値に応じた適切な密度でドットを発生させる手法としては、誤差拡散法やディザ法などの種々の手法を適用することができる。誤差拡散法は、ある画素についてドットの形成有無を判断したことでその画素に発生する階調表現の誤差を、周辺の画素に拡散するとともに、周囲から拡散されてきた誤差を解消するように、各画素についてのドット形成の有無を判断していく手法である。発生した誤差を周辺の各画素に拡散させる割合は、誤差拡散マトリックスに予め設定されている。また、ディザ法は、ディザマトリックスに設定されている閾値と画像データの階調値とを画素毎に比較して、画像データの方が大きい画素にはドットを形成すると判断し、逆に閾値の方が大きい画素についてはドットを形成しないと判断することで、各画素についてドット形成の有無を判断していく手法である。本実施例の印刷処理では、いずれの手法を用いることもできるが、ここではディザ法と呼ばれる手法を用いてハーフトーン処理を行うものとする。
図27は、ディザ法で参照される一般的なディザマトリックスの一部を拡大して例示した説明図である。図示したマトリックスには、縦横それぞれ64画素、合計4096個の画素に、階調値0〜255の範囲から万遍なく選択された閾値が設定されている。ここで、閾値の階調値が0〜255の範囲から選択されているのは、本実施例では画像データが1バイトデータであり、画素に設定される階調値が0〜255の値を取り得ることに対応するものである。尚、ディザマトリックスの大きさは、図27に例示したように縦横64画素分に限られるものではなく、縦と横の画素数が異なるものも含めて種々の大きさとすることができる。
図28は、ディザマトリックスを参照しながら、画素毎にドット形成の有無を判断している様子を概念的に示した説明図である。ドット形成有無の判断に際しては、先ず、判断の対象として着目している画素(着目画素)についての画像データの階調値と、ディザマトリックス中の対応する位置に記憶されている閾値とを比較する。図中に示した細い破線の矢印は、着目画素の階調値を、ディザマトリックス中の対応する位置に記憶されている閾値と比較していることを模式的に表したものである。そして、ディザマトリックスの閾値よりも着目画素の階調値の方が大きい場合には、その画素にはドットを形成するものと判断する。逆に、ディザマトリックスの閾値の方が大きい場合には、その画素にはドットを形成しないものと判断する。
図28に示した例では、画像データの左上隅にある画素の画像データは階調値180であり、ディザマトリックス上でこの画素に対応する位置に記憶されている閾値は1である。従って、左上隅の画素については、画像データの階調値180の方がディザマトリックスの閾値1よりも大きいから、この画素にはドットを形成すると判断する。図28中に実線で示した矢印は、この画素にはドットを形成すると判断して、判断結果をメモリに書き込んでいる様子を模式的に表したものである。一方、この画素の右隣の画素については、画像データの階調値は130、ディザマトリックスの閾値は177であり、閾値の方が大きいので、この画素についてはドットを形成しないものと判断する。ディザ法では、このようにディザマトリックスを参照しながらドットを発生させる。図25に示した印刷処理のステップS306では、色変換処理によって変換されたC,M,Y,K各色の階調値毎に、以上のようにしてドット形成の有無を判断する処理を行う。
以上のようにしてハーフトーン処理を終了すると、カラープリンタ200のCPUは、インターレース処理を開始する(ステップS308)。インターレース処理とは、ドットの形成有無による表現形式に変換された画像データを、カラープリンタ200が実際に印刷用紙上にドットを形成する順番を考慮して並べ替える処理である。
こうしてインターレース処理を行ったら、得られたデータに従って、印刷用紙上にドットを形成することにより画像を印刷する。すなわち、図2を用いて前述したように、キャリッジモータ230および紙送りモータ235を駆動することによってキャリッジ240の主走査および副走査を行い、これらの動きに合わせて印字ヘッド241を駆動してインク滴を吐出することによりインクドットを形成する。その結果、モニタ150の画面に表示されているものと、同じ場面の印刷画像が得られることになる。
以上に説明したように、本実施例のゲーム機100では、モニタ150に表示された画面を印刷するに際して、画面の表示用に用いられる粗いポリゴンのポリゴンデータ(表示用ポリゴンデータ)を、印刷用に用いられる細かなポリゴンによるポリゴンデータ(印刷用ポリゴンデータ)に差し替えることによって精密ポリゴンデータを生成する。そして、この精密ポリゴンデータに基づいて印刷データを生成することにより画像を印刷している。このため、印刷された画像では、オブジェクトは小さなポリゴンによって形成されることになるので、表面がゴツゴツすることがなく、あたかも実在する対象を写真で撮影したかのような画像が得られることになる。
もちろん、印刷用ポリゴンデータは細かなポリゴンによって構成されているので、表示用ポリゴンデータよりはポリゴン数が多く、従って、表示用ポリゴンデータを印刷用ポリゴンデータに差し換えると、1枚の画像を構成するポリゴン数は増加する。そして、ポリゴン数が多くなると、ゲーム機100に搭載しているメモリ容量の制約から、全てのポリゴンのデータに対して一度に描画処理を実行することが困難となる。特に、用紙サイズがA3以上の、いわゆる大判印刷を行う場合には、画質を維持するためにより細かなポリゴンが使用されることが多く、それだけポリゴン数も増加するので、こうした傾向が顕著となる。しかし、本実施例のゲーム機100では、所定のポリゴン数ずつポリゴンデータを読み出して描画処理を実行し、その度に、フレームバッファ114上に展開された画像データを印刷データとしてカラープリンタ200に供給することが可能である。このため、たとえ大判印刷を行うような場合でも、搭載しているメモリ容量の制約を受けることなく、画像を印刷することが可能となるのである。
上述した第1実施例のゲーム機100には、種々の変形例が存在している。以下では、これら変形例について簡単に説明する。
C−4.第1の変形例 :
上述した実施例では、印刷データ出力処理において、精密ポリゴンデータを所定ポリゴン数ずつ読み込んで描画処理を実行し、得られた画像データを印刷データとして出力するものとして説明した。こうすれば、たとえフレームバッファ114のメモリ容量が十分ではない場合でも、メモリ容量の範囲内で描画処理を実行して印刷データを出力することが可能である。しかし、読み込むポリゴン数を所定数に固定してしまうのではなく、フレームバッファ114に展開したデータ量が所定量に達するまで、ポリゴンを読み込んで描画処理を行うこととしても良い。
図29は、このような第1の変形例の印刷データ出力処理の流れを示すフローチャートである。かかる処理は、図20を用いて前述した第1実施例の印刷データ出力処理に対して、フレームバッファ114に展開したデータ量が許容値に達するまで、ポリゴン1つ分ずつポリゴンデータを読み込んで描画処理を行う点が大きく異なっている。以下、かかる相違点を中心に、第1の変形例の印刷データ出力処理について説明する。
第1の変形例の印刷データ出力処理を開始すると、先ず初めに、メインメモリ110から精密ポリゴンデータを読み込む処理を行う(ステップS250)。前述した第1実施例の印刷データ出力処理では、ポリゴンデータを所定ポリゴン数ずつ読み込んでいたが、第1の変形例では、ポリゴン1つ分だけポリゴンデータを読み込む。
次いで、読み込んだポリゴンデータに対して描画処理を行う(ステップS252)。その結果、フレームバッファ114上には、読み込んだポリゴン1つ分の画像データが展開されることになる。
こうしてポリゴンデータを展開したら、フレームバッファ114上に展開されているデータが、所定の許容値に達したか否かを判断する(ステップS254)。許容値は、フレームバッファ114のメモリ容量に対して、ある程度の余裕を持たせた値(例えば、メモリ容量の9割程度の値)に設定されている。そして、展開されている画像データがメモリの許容値に達していなければ(ステップS254:no)、新たなポリゴンのデータを展開可能と判断して、精密ポリゴンデータからもう1つ分のポリゴンのデータを読み込み(ステップS250)、読み込んだデータに対して描画処理を行って画像データを展開した後(ステップS252)、展開したデータがメモリの許容値に達したか否かを判断する(ステップS254)。こうした操作を繰り返し、フレームバッファ114上に展開したデータが許容値に達したと判断されたら(ステップS254:yes)、展開した画像データをラスタ単位で読み出して、印刷データとして出力する(ステップS256)。かかる処理は、図20および図22を用いて前述した第1実施例の印刷データ出力処理と同様であるため、ここでは説明を省略する。
以上のようにして、ラスタ単位の画像データを印刷データとして出力したら、レンダリング処理が施された精密ポリゴンデータの全ポリゴンについて、処理が終了したか否かを判断する(ステップS258)。そして、未だ処理していないポリゴンが残っている場合は(ステップS258:no)、ステップS250に戻って、メインメモリ110上に記憶されている精密ポリゴンデータから、新たにポリゴン1つ分のデータを読み出した後、上述した一連の処理を繰り返す。そして、最終的に、全ポリゴンについての処理を終了したと判断されたら(ステップS258:yes)、図29に示した第1の変形例の印刷データ出力処理を終了して、図15に示した画像印刷処理に復帰する。
以上に説明した第1の変形例の印刷データ出力処理では、読み込んだポリゴンの大きさに拘わらず、常にフレームバッファ114のメモリ容量を効率よく使用して印刷データを出力することが可能となる。このため、印刷データ出力処理を迅速に行うことができ、延いては、画像を迅速に印刷することが可能となる。
C−5.第2の変形例 :
以上に説明した第1実施例の印刷データ出力処理では、フレームバッファ114上に画像データを展開すると、出力可能なラスタを検出して印刷データとして出力した。そして、次回の処理では、フレームバッファ114上に新たに展開した画像データの中から、新たなラスタを検出して印刷データとして出力した。従って、フレームバッファ114上に新たな画像データを展開する度に、重複することなく新たな印刷データが順番に出力されることになる。これに対して、フレームバッファ114上に毎回、画像データを展開して印刷データを出力する度に、前回に展開して出力した印刷データの一部を重ねて出力することとしても良い。
図30は、こうした第2の変形例の印刷データ出力処理において、印刷データをオーバーラップさせて出力する様子を概念的に示した説明図である。図中にハッチングを付した領域は、フレームバッファ114上に画像データが展開されている領域を示している。図30では、粗いハッチングから細かいハッチングまで種々のハッチングが付された領域が存在するが、これら全ての領域が画像データの展開された領域となっている。
印刷データを出力するに際しては、このような領域の中からラスタ単位で画像データを読み出して、印刷データとして出力する。図中に細かいハッチングを付した領域、および中間のハッチングを付した領域では、ラスタ単位で画像データを読み出すことが可能であり、これらの領域の画像データが印刷データとして出力される。
ここで、第2の変形例の印刷データ出力処理では、印刷データとして出力した領域の後半部分(図30では、細かいハッチングを付した示した領域)については、印刷データの出力後もデータを破棄することなく記憶しておく。そして、次回にポリゴンのデータを読み込んでフレームバッファ114上に展開し、新たな印刷データを出力するに先立って、記憶しておいた印刷データをカラープリンタ200に出力してから、新たな印刷データを出力する。結局、この部分については2回、印刷データを出力することになる。
このように、毎回読み込まれて展開される画像データの繋ぎ目部分では、印刷データを重複してカラープリンタ200に出力してやれば、印刷データを分割した状態で受け取っても、繋ぎ目部分で印刷画質が悪化することを回避することが可能となる。
D.第2実施例 :
以上に説明した第1実施例の画像印刷処理では、細かなポリゴンによって構成された印刷用ポリゴンデータを予め記憶しておき、画像の印刷に際しては、表示用ポリゴンデータを印刷用ポリゴンデータに置き換えて精密ポリゴンデータを生成した後、得られた精密ポリゴンデータを含む各オブジェクトに対して、レンダリング処理や描画処理などの一連の処理を行って画像を印刷した。もっとも、印刷用ポリゴンデータを予め用意しておくのではなく、表示用ポリゴンデータから印刷用ポリゴンデータを生成し、このデータに対して、レンダリング処理を始めとする一連の処理を行うこととしても良い。以下では、このような第2実施例の画像印刷処理について説明する。
図31は、第2実施例の画像印刷処理の流れを示すフローチャートである。かかる処理は、前述した第1実施例の画像印刷処理に対して、表示用ポリゴンデータから、細かなポリゴンによって構成された印刷用ポリゴンデータを生成している点が大きく異なっており、他の部分の処理は、第1実施例の処理とほぼ同様である。以下では、こうした相違点を中心として、第2実施例の画像印刷処理について説明する。
第2実施例の画像印刷処理においても、前述した第1実施例と同様に、ゲーム機100のCPU101は、コントローラ102に設けられた所定の印刷ボタンが押されたことを検出すると、割り込みを発生させて画像印刷処理を開始する。そして、先ず初めに、コントローラ102の印刷ボタンが押された時点でモニタ150に表示されていた画像の、元となったポリゴンデータ(表示用ポリゴンデータ)を取得する(ステップS400)。
次いで、画像の撮影条件および印刷条件を設定する(ステップS402、ステップS404)。撮影条件は、モニタ150に表示された画面(図16参照)を見ながら、焦点距離、焦点位置、絞りなどについて設定する。また、印刷条件は、モニタ150に表示された画面(図17参照)を見ながら、用紙サイズ、用紙種類、印刷モードなどについて設定する。
続いて、モニタ150に表示された各オブジェクトについて、オブジェクトを構成するポリゴンを分割するか否かを決定する(ステップS406)。ポリゴンを分割するか否かは、印刷条件設定処理で設定された「用紙サイズ」および「印刷モード」の組合せに応じて決定する。例えば、印刷モードが「速い」に設定されており、用紙サイズが「写真普通版」あるいは「写真L版」の場合は、ポリゴンの分割は行わない。これは、印刷モードが「速い」に設定されており、いわゆる大判印刷も行わない場合は、印刷画質もさほど高くはなく、印刷画像も小さいので、表示用ポリゴンデータのまま(すなわち粗いポリゴンのまま)画像を印刷しても、ポリゴンが目立つことはないからである。これに対して、印刷モードが「きれい」に設定されていたり、印刷用紙がA4サイズ以上のいわゆる大判印刷が行われる場合は、ポリゴンが目立って画質を悪化させることの無いように、ポリゴンを分割するものと判断する。
次いで、分割するものと決定されたポリゴンについては、ポリゴンを分割することにより、表示用ポリゴンデータから印刷用ポリゴンデータを生成する処理を行う(ステップS408)。
図32は、ポリゴンを分割している様子を概念的に示した説明図である。図中に太い実線で示した3つの三角形は、分割する前のポリゴンを表している。これらポリゴンを分割する場合には、ポリゴンを構成する各辺の中点を結ぶことにより、それぞれのポリゴンを4つの小さなポリゴンに分割する。図32に示した三角形ABCのポリゴンについて説明すると、辺ABの中点abと、辺BCの中点bcと、辺ACの中点acとをそれぞれ結ぶことにより、三角形ABCをより小さな4つの三角形に分割することができる。隣接するポリゴンBCDについても同様にして、辺BCの中点bcと、辺CDの中点cdと、辺BDの中点bdとをそれぞれ結べば、三角形BCDを4つの三角形に分割することができる。レベル2の分割では、オブジェクトを構成する全てのポリゴンについて、このような操作を繰り返すことにより、それぞれのポリゴンを4つの小さなポリゴンに分割する。第2実施例の画像印刷処理におけるステップS408では、分割すると決定したポリゴンを、このように4つのポリゴンに分割する処理を行う。
また、このようにして分割して生成された小さなポリゴンのテクスチャ番号は、元になったポリゴンのテクスチャ番号と、隣接するポリゴンのテクスチャ番号とに基づいて決定する。例えば、図32に示した三角形BCDのポリゴンを用いて説明する。中央に生成された小さなポリゴンc1については、元になったポリゴンのテクスチャ番号をそのまま付与しておく。一方、隣接する2つのポリゴン(三角形ABC、三角形CDE)に挟まれた小さなポリゴンc2については、隣接する2つのポリゴンのテクスチャと、元になったポリゴン(三角形BCD)のテクスチャとの中間的なテクスチャとなるテクスチャ番号を設定する。同様に、分割して生成した小さなポリゴンc3については、隣接するポリゴン(三角形ABC)と、元になったポリゴン(三角形BCD)との中間的なテクスチャとなるテクスチャ番号を設定してやればよい。以上のようにして、ポリゴンを小さなポリゴンに分割し、分割して生成したポリゴンの頂点を検出するとともに、各ポリゴンのテクスチャ番号を設定してやれば、通常のポリゴンデータから、ポリゴンがより小さなポリゴンに分割されたポリゴンデータを生成することができる。
尚、ここでは、ポリゴンの分割方法は図32に示したように、1つのポリゴンを4分割する方法のみについて説明したが、ポリゴンをより多くのポリゴンに分割したり、あるいはより少ないポリゴンに分割することとしても良い。
図33は、ポリゴンの異なる分割方法を例示した説明図である。図32に示した場合と同様に、図中に太い実線で示した3つの三角形は、分割する前のポリゴンを表している。図33に示した分割方法では、ポリゴンの頂点と、その頂点に対抗する辺(対辺)の中点を結ぶことにより、1つのポリゴンを6つの小さなポリゴンに分割する。図33に示した三角形ABCのポリゴンについて説明すると、頂点Aと、これに対する対辺BCの中点bcとを結び、頂点Bと対辺ACの中点acとを結び、頂点Cと対辺ABの中点abとを結ぶことにより、三角形ABCを分割する。頂点と対辺の中点とを結ぶ直線は三角形の重心で交わることから、このようにして三角形のポリゴンを分割すれば、6つの小さなポリゴンに分割することができる。印刷用紙のサイズが大きい場合など、印刷条件に応じて、適切な方法を選択してポリゴンを分割することとしてもよい。
以上のようにしてポリゴンを分割すると、表示用ポリゴンデータが印刷用ポリゴンデータに変換され、その結果、精密ポリゴンデータが得られることになる。こうして精密ポリゴンデータを生成したら、以降は、前述した第1実施例の画像印刷処理と同様にして画像を印刷する。以下、簡単に説明する。
先ず、生成した精密ポリゴンデータに対してレンダリング処理を行う(ステップS410)。図11を用いて前述したように、レンダリング処理とは、各オブジェクトのポリゴンデータから二次元画像のデータを生成する処理である。レンダリング処理によって得られる二次元画像のデータは、ポリゴンを構成する頂点を、投影面上に投影して得られる頂点の二次元座標と、投影されたポリゴンに付与すべきテクスチャ番号とによって表現されており、メインメモリ110には、このような形式のデータが記憶される。
レンダリング処理に続いて、印刷データ出力処理を行うことにより、フレームバッファ114上に展開した画像データをラスタ単位で読み出して、印刷データとしてカラープリンタ200に出力する(ステップS200)。かかる処理は、前述した第1実施例における印刷データ出力処理と全く同様であるため、ここでは説明を省略する。
第2実施例の画像印刷処理においても、印刷データ出力処理から復帰すると、ゲーム復帰処理を行う(ステップS412)。すなわち、第2実施例の画像印刷処理も、進行中のゲームを一旦、中断させて開始されるので、画像印刷処理を終了させる前に、プログラムカウンタや各種データをゲームの中断前の状態に復帰させて、ゲームを再開するための準備を行うのである。そして、ゲーム復帰処理を終了したら、図31に示した第2実施例の画像印刷処理を終了する。
以上に説明した第2実施例の画像印刷処理では、モニタ150に表示された画像を印刷するに際して、オブジェクトを構成するポリゴンを、印刷条件に応じて細かなポリゴンに分割して精密ポリゴンデータを生成する。そして、得られた精密ポリゴンデータに基づいて画像を印刷しているために、ポリゴンが目立ち難い高画質な画像を印刷することができる。もちろん、ポリゴンを細かなポリゴンに分割するだけでは、オブジェクト形状の表現精度が向上するわけではないが、このようにして細かなポリゴンに分割しておけば、各ポリゴンに適切なテクスチャを付与することで、オブジェクト表面がゴツゴツした印象を大幅に緩和することができる。このため、カラープリンタ200から画像を出力した場合でも、実在する対象を写真で撮影したかのような印刷画像を得ることが可能となる。
また、かかる第2実施例の画像印刷処理では、取得したポリゴンデータから、各ポリゴンを分割することによって印刷用ポリゴンデータを生成するため、前述した第1実施例の画像印刷処理のように、取得したポリゴンデータと印刷用ポリゴンデータとを、基準点を用いて位置合わせする処理が不要となり、メモリ容量や処理能力が比較的小さなゲーム機100を用いた場合でも、迅速に画像を印刷することが可能となる。
ポリゴンを細かなポリゴンに分割すれば、全体のポリゴン数が増加するため、全ポリゴンのデータをフレームバッファ114上に一度に展開することが困難となるが、上述した第2実施例の印刷データ出力処理においても、所定のポリゴン数ずつ(あるいは展開した画像データが所定になるポリゴン数ずつ)ポリゴンデータを読み出して描画処理を実行する。そして、フレームバッファ114上に展開された画像データを、順次、印刷データとしてカラープリンタ200に供給する。このため、たとえ大判印刷を行うような場合でも、搭載しているメモリ容量の制約を受けることなく、画像を印刷することが可能となる。
以上、各種の実施例について説明してきたが、本発明は上記すべての実施例に限られるものではなく、その要旨を逸脱しない範囲において種々の態様で実施することができる。
例えば、上述した各種の実施例では、モニタ150に表示された画面を印刷する場合、画像を印刷するための細かなポリゴンに基づく画像データを生成すると、この画像データは印刷データを生成するためだけに用いられるものとして説明した。しかし、生成した画像データを用いてモニタ150に画像を表示することとしても良い。例えば、印刷データの生成を開始するとともに、細かなポリゴンに基づいて生成された画像データを、モニタ150の画面に表示することとしても良い。印刷のために生成された画像データは、モニタ150に表示するために生成された画像データよりも高画質な画像を表示可能であり、加えて、撮影条件などを考慮して各種の処理が施された画像データとなっている。従って、印刷データの生成中に、この細かなポリゴンに基づく画像データをモニタ150に表示してやれば、こうした効果をモニタ150の上でも確認することが可能となる。
あるいは、印刷データの生成を開始する前に、細かなポリゴンに基づく画像データをモニタ150の画面上に表示することとしても良い。こうすれば、撮影条件などの各種の設定項目を、細かなポリゴンに基づく画像データによって、効果を確認しながら設定することができるので、より適切な設定を行うことが可能となる。