(57)【特許請求の範囲】
【請求項１】
複数の頂点により形状が定められる三次元オブジェクトを変形する、ビデオゲーム用のプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記コンピュータに、
複数のジョイントにより構成され、且つ前記複数の頂点の各々が前記複数のジョイントのいずれか１つに対応付けられている前記三次元オブジェクトの仮想スケルトンにおける各前記ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する第１ステップと、
前記第１ステップで取得された各前記ジョイントの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って前記頂点を前記フレーム表示周期毎に移動する第２ステップと、
を実行させるためのプログラムであることを特徴とするビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項２】
前記第２ステップが、
前記第１ステップで取得された前記ジョイントの回転角により定まる１つの回転軸に対する１つの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、前記１つの回転軸に沿って、当該回転角だけ当該頂点を回転させて得られる位置に前記頂点を前記フレーム表示周期毎に移動するステップ
であることを特徴とする請求項１記載のビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項３】
前記第１ステップにおいて、互いに直交する３つの回転軸毎の各前記ジョイントの回転角を取得し、
前記第２ステップが、
前記第１ステップで取得された前記ジョイントの前記３つの回転軸毎の回転角に基づき、一つの回転軸と一つの回転角とを計算する第３ステップと、
前記第３ステップで計算された前記一つの回転角を、前記頂点に予め定義された重みに従って補間し、当該頂点の回転角を計算する第４ステップと、
前記第４ステップで計算された回転角と前記一つの回転軸とに従って前記頂点を前記フレーム表示周期毎に移動させる第５ステップと、
を含むことを特徴とする請求項１記載のビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項４】
前記第４ステップが、
前記一つの回転角を、前記頂点に予め定義された重みに従って球状線形補間し、当該頂点の回転角を計算するステップ
であることを特徴とする請求項３記載のビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項５】
１つの前記ジョイントに対応する頂点は当該頂点に予め定義された重みによりソートされており、
前記第２ステップは、
直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されているか判断する第３ステップと、
前記第３ステップにおいて直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されていないと判断された場合には、前記移動すべき頂点に対応する前記ジョイントの前記第１ステップで取得された回転角と当該移動すべき頂点に予め定義された重みとに基づいて当該移動すべき頂点の回転角を算出し、当該回転角に関する情報を格納する第４ステップと、
前記第４ステップにおいて格納された回転角に従って、前記移動すべき頂点を移動させる第５ステップと、
前記第３ステップにおいて直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されていると判断された場合には、前記第５ステップで格納された回転角に従って前記移動すべき頂点を移動させる第６ステップと、
を含むことを特徴とする請求項１記載のビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項６】
前記第２ステップは、
同一の前記ジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されているか判断する第３ステップと、
前記第３ステップにおいて同一の前記ジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されていないと判断された場合には、前記移動すべき頂点に対応する前記ジョイントの前記第１ステップで取得された回転角と当該移動すべき頂点に予め定義された重みとに従って当該頂点の回転角を算出し、当該回転角に関する情報を当該頂点の重みと関係付けて格納する第４ステップと、
前記第４ステップにおいて算出された回転角に従って、前記移動すべき頂点を移動させる第５ステップと、
前記第３ステップにおいて同一の前記ジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されていると判断された場合には、前記移動すべき頂点に予め定義された重みに関係付けて前記第４ステップで格納された回転角を取得し、当該回転角に従って、当該移動すべき頂点を移動させる第６ステップと、
を含むことを特徴とする請求項１記載のビデオゲーム用のコンピュータ読み取り可能な記録媒体。
【請求項７】
複数の頂点により形状が定められる三次元オブジェクトを変形する、ビデオゲームにおける三次元オブジェクト変形方法であって、
複数のジョイントにより構成され、且つ前記複数の頂点の各々が前記複数のジョイントのいずれか１つに対応付けられている前記三次元オブジェクトの仮想スケルトンにおける各前記ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する第１ステップと、
前記第１ステップで取得された各前記ジョイントの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って前記頂点を前記フレーム表示周期毎に移動する第２ステップと、
を含むことを特徴とするビデオゲームにおける三次元オブジェクト変形方法。
【請求項８】
前記第２ステップが、
前記第１ステップで取得された前記ジョイントの回転角により定まる１つの回転軸に対する１つの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、前記１つの回転軸に沿って、当該回転角だけ当該頂点を回転させて得られる位置に前記頂点を前記フレーム表示周期毎に移動するステップ
であることを特徴とする請求項７記載のビデオゲームにおける三次元オブジェクト変形方法。
【請求項９】
前記第１ステップにおいて、互いに直交する３つの回転軸毎の各前記ジョイントの回転角を取得し、
前記第２ステップが、
前記第１ステップで取得された前記ジョイントの前記３つの回転軸毎の回転角に基づき、一つの回転軸と一つの回転角とを計算する第３ステップと、
前記第３ステップで計算された前記一つの回転角を、前記頂点に予め定義された重みに従って補間し、当該頂点の回転角を計算する第４ステップと、
前記第４ステップで計算された回転角と前記一つの回転軸とに従って前記頂点を前記フレーム表示周期毎に移動させる第５ステップと、
を含むことを特徴とする請求項７記載のビデオゲームにおける三次元オブジェクト変形方法。
【請求項１０】
複数の頂点により形状が定められる三次元オブジェクトを変形するビデオゲーム装置であって、
複数のジョイントにより構成され、且つ前記複数の頂点の各々が前記複数のジョイントのいずれか１つに対応付けられている前記三次元オブジェクトの仮想スケルトンにおける各前記ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する取得手段と、
前記取得手段により取得された各前記ジョイントの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って前記頂点を前記フレーム表示周期毎に移動する移動手段と、
を含むことを特徴とするビデオゲーム装置。
【請求項１１】
複数の頂点により形状が定められる三次元オブジェクトを変形するビデオゲーム装置であって、
コンピュータと、
前記コンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体と、
を有し、
前記プログラムは、前記コンピュータに、
複数のジョイントにより構成され、且つ前記複数の頂点の各々が前記複数のジョイントのいずれか１つに対応付けられている前記三次元オブジェクトの仮想スケルトンにおける各前記ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する取得処理と、
前記取得処理により取得された各前記ジョイントの回転角と当該ジョイントに対応する前記頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って前記頂点を前記フレーム表示周期毎に移動する移動処理と、
を実行させるビデオゲーム装置。
【発明の詳細な説明】
【０００１】
【発明が属する技術分野】
本発明は、コンピュータ・グラフィックス（ＣＧ：Ｃｏｍｐｕｔｅｒ  Ｇｒａｐｈｉｃｓ）に関し、より詳しくは、仮想三次元空間における三次元オブジェクトを変形する技術に関する。
【０００２】
【従来の技術】
ＣＧにおいて、複数の頂点により形状が定められている三次元オブジェクトの動作を表現するために、当該三次元オブジェクトを変形する技術としては、従来からスケルトン変形という技術が知られている。スケルトン変形では、三次元オブジェクトに対して仮想的に複数の関節（以下ジョイントと呼ぶ）と複数の骨（以下ボーンと呼ぶ）を設定し、ジョイントとボーンを階層的に接続した骨格情報（以下スケルトンと呼ぶ）を作成する。そして、スケルトンを変形することにより三次元オブジェクトを変形する。
【０００３】
例えば、人型の三次元オブジェクトにおいて首の部分に首ジョイントを設ける。また、首ジョイントには頭部ボーンが接続され、頭部ボーンには人型の三次元オブジェクトの頭部が対応付けられているとする。この場合、首ジョイントが回転すれば、頭部ボーンも回転する。頭部ボーンに対応する人型の三次元オブジェクトの頭部は頭部ボーンの回転に応じて回転する。結果としてスケルトンを変形することにより、対応する三次元オブジェクトを変形することができる。
【０００４】
但し、単純に、スケルトンを変形することにより、対応する三次元オブジェクトを変形させると、三次元オブジェクトの頂点が三次元オブジェクト内部にめり込んだり、一部のポリゴンが大きくなりすぎて、滑らかな三次元オブジェクトを表示できなくなる場合がある。
【０００５】
そこで、特開平１０−７４２７０号等に示されるような技術が発明された。特開平１０−７４２７０号公報には、子仮想スケルトンの方向情報θ１を変化させる場合、子仮想スケルトンに対応するポリゴンの頂点の位置情報を、変化前の頂点の位置情報と、影響度情報を用いずに方向情報θ１により求められた頂点の位置情報と、各頂点に設定された子仮想スケルトン及び親仮想スケルトンからの影響度情報とに基づいて求めるという技術が開示されている。
【０００６】
なお、特開平１０−７４２７０号では、変化前の頂点の位置情報を用いるとしているが、子仮想スケルトンより上の階層の仮想スケルトンの移動が無ければ、変化前の頂点の位置情報を用いることができる。しかし、もしそうでなければ親仮想スケルトンまでの全ての移動を考慮した状態における頂点の位置情報を計算しなければならない。多くの場合、親仮想スケルトンまでの全ての移動を考慮した状態における頂点の位置情報、および影響度情報を用いずに方向情報θ１により求められた頂点の位置情報の２つの位置情報を頂点変換により求めなければならない。
【０００７】
すなわち、特開平１０−７４２７０号公報の技術では、形状の滑らかさを要求しない場合に比べて、各頂点に対して頂点変換が１回ずつ多く行われる。そのため、三次元オブジェクトを表現する頂点数の増加に伴い、形状を滑らかに保つために必要な処理量も増大する。
【０００８】
【発明が解決しようとする課題】
一般に、三次元オブジェクトの形状の滑らかさを追求するほど、三次元オブジェクトの形状を定義する頂点数が増加する。そのため、三次元オブジェクトの頂点数が増加した場合であっても、変形後の形状を滑らかにするために必要な処理の増加量は、極力低く抑えられる事が望まれている。
【０００９】
本発明の目的は、三次元オブジェクトの頂点数の増加に伴う処理負荷の増加量を極力少なくして、滑らかな形状を保った三次元オブジェクトの変形を行うことが可能な三次元オブジェクト変形技術を提供することである。
【００１０】
【課題を解決するための手段】
本発明の第１の態様に係る、複数の頂点により形状が定められる三次元オブジェクトを変形する、ビデオゲームにおける三次元オブジェクト変形方法は、複数のジョイントにより構成され、且つ複数の頂点の各々が複数のジョイントのいずれか１つに対応付けられている三次元オブジェクトの仮想スケルトンにおける各ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する第１ステップと、第１ステップで取得された各ジョイントの回転角と当該ジョイントに対応する頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って頂点をフレーム表示周期毎に移動する第２ステップとを含む。
【００１１】
頂点に予め定義された重みに従って当該頂点に対応するジョイントの回転角を変更することにより、当該頂点の回転角が求められる。頂点の回転角に従って頂点を移動することで、頂点変換は１度で済むようになる。
【００１２】
上で述べた第２ステップを、第１ステップで取得されたジョイントの回転角により定まる１つの回転軸に対する１つの回転角と当該ジョイントに対応する頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、１つの回転軸に沿って、当該回転角だけ当該頂点を回転させて得られる位置に頂点をフレーム表示周期毎に移動するステップとする構成も可能である。頂点を最短距離にて移動させるものである。
【００１３】
また上で述べた第１ステップにおいて、互いに直交する３つの回転軸毎の各ジョイントの回転角を取得し、上で述べた第２ステップを、第１ステップで取得されたジョイントの３つの回転軸毎の回転角に基づき、一つの回転軸と一つの回転角とを計算する第３ステップと、第３ステップで計算された一つの回転角を、頂点に予め定義された重みに従って補間し、当該頂点の回転角を計算する第４ステップと、第４ステップで計算された回転角と一つの回転軸とに従って頂点をフレーム表示周期毎に移動させる第５ステップとを含むような構成とすることも可能である。
【００１４】
また、上で述べた第４ステップを、一つの回転角を、頂点に予め定義された重みに従って球状線形補間し、当該頂点の回転角を計算するステップとすることも可能である。
【００１５】
本発明の第１の態様において、１つのジョイントに対応する頂点は当該頂点に予め定義された重みによりソートされており、上で述べた第２ステップを、直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されているか判断する第３ステップと、第３ステップにおいて直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されていないと判断された場合には、移動すべき頂点に対応するジョイントの第１ステップで取得された回転角と当該移動すべき頂点に予め定義された重みとに基づいて当該移動すべき頂点の回転角を算出し、当該回転角に関する情報を格納する第４ステップと、第４ステップにおいて格納された回転角に従って、移動すべき頂点を移動させる第５ステップと、第３ステップにおいて直前に移動された頂点に予め定義された重みと同じ重みが移動すべき頂点に定義されていると判断された場合には、第５ステップで格納された回転角に従って前記移動すべき頂点を移動させる第６ステップとを含むような構成にすることも可能である。
【００１６】
また、上で述べた第２ステップを、同一の前記ジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されているか判断する第３ステップと、第３ステップにおいて同一のジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されていないと判断された場合には、移動すべき頂点に対応するジョイントの第１ステップで取得された回転角と当該移動すべき頂点に予め定義された重みとに従って当該頂点の回転角を算出し、当該回転角に関する情報を当該頂点の重みと関係付けて格納する第４ステップと、第４ステップにおいて算出された回転角に従って、移動すべき頂点を移動させる第５ステップと、第３ステップにおいて同一のジョイントに対応した頂点のうち既に移動された頂点に予め定義されている重みと同一の重みが移動すべき頂点に定義されていると判断された場合には、移動すべき頂点に予め定義された重みに関係付けて第４ステップで格納された回転角を取得し、当該回転角に従って、当該移動すべき頂点を移動させる第６ステップとを含むような構成も可能である。
【００１７】
本発明の第１の態様に係るビデオゲームにおける三次元オブジェクト変形方法をコンピュータに実行させるプログラムを作成することは可能である。その際、第１の態様に対する上記のような変形は、当該プログラムに対しても応用可能である。本発明に係るプログラムは、例えばＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  −  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）、フロッピーディスク、メモリカートリッジ、メモリ、ハードディスクなどの記録媒体又は記憶装置に格納される。記録媒体又は記憶装置に格納されるプログラムをコンピュータに読み込ませることで以下で述べるビデオゲーム装置を実現できる。また、記録媒体によって本発明に係るプログラムをソフトウエア製品として装置と独立して容易に配布、販売することができるようになる。さらに、コンピュータなどのハードウエアを用いて本発明に係るプログラムを実行することにより、コンピュータ等のハードウエアで本発明のグラフィックス技術が容易に実施できるようになる。
【００１８】
本発明の第２の態様に係る、複数の頂点により形状が定められる三次元オブジェクトを変形するビデオゲーム装置は、複数のジョイントにより構成され、且つ複数の頂点の各々が複数のジョイントのいずれか１つに対応付けられている三次元オブジェクトの仮想スケルトンにおける各ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する取得手段と、取得手段により取得された各ジョイントの回転角と当該ジョイントに対応する頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って頂点をフレーム表示周期毎に移動する移動手段とを含む。
【００１９】
さらに本発明の第３の態様に係るビデオゲーム装置は、コンピュータと、コンピュータに実行させるプログラムを記録したコンピュータ読み取り可能な記録媒体とを有する。そして、当該プログラムは、コンピュータに、複数のジョイントにより構成され、且つ複数の頂点の各々が複数のジョイントのいずれか１つに対応付けられている三次元オブジェクトの仮想スケルトンにおける各ジョイントの回転角を、当該仮想スケルトンの動きが定義されたアニメーション・データに基づいてフレーム表示周期毎に取得する取得処理と、取得処理により取得された各ジョイントの回転角と当該ジョイントに対応する頂点に予め定義された重みとに基づいて当該頂点の回転角を算出し、当該回転角に従って頂点をフレーム表示周期毎に移動する移動処理とを実行させる。
【００２０】
【発明の実施の形態】
本発明をコンピュータ・プログラムにより実施する場合において当該コンピュータ・プログラムを実行する家庭用ゲーム機１０１の一例を図１に示す。家庭用ゲーム機１０１は、例えば内部バス１１９に接続されたＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０３、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０４、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１０５、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）１０７、サウンド処理部１０９、グラフィックス処理部１１１、ＣＤ−ＲＯＭドライブ１１３、通信インターフェース１１５、及びインターフェース部１１７を備える。グラフィックス処理部１１１は、フレームバッファ１１２を備える。
【００２１】
家庭用ゲーム機１０１のサウンド処理部１０９及びグラフィックス処理部１１１は表示画面１２０を有するＴＶセット１２１に接続されている。また、ＣＤ−ＲＯＭドライブ１１３には着脱可能なＣＤ−ＲＯＭ１３１が装着される。ＣＤ−ＲＯＭ１３１には、本発明にかかるゲームプログラム１３３及びデータ１３５が記録されている。通信インターフェース１１５はネットワーク１５１と通信媒体１４１を介して接続される。インターフェース部１１７には、操作ボタンを備えたキーパッド１６１及びメモリカード１７１が接続される。
【００２２】
ＣＰＵ１０３は、ＲＯＭ１０４に格納されたプログラム、及びＣＤ−ＲＯＭ１３１上に記録されたゲームプログラム１３３を実行し、家庭用ゲーム機１０１の制御を行う。ＲＡＭ１０５は、ＣＰＵ１０３のワークエリアである。ＨＤＤ１０７は、例えばＣＤ−ＲＯＭ１３１上に記録されたゲームプログラム１３３及びデータ１３５を保管するための記憶領域である。メモリカード１７１は、ゲームプログラム１３３により参照されるデータを保存するための記憶領域である。サウンド処理部１０９は、ＣＰＵ１０３により実行されているプログラムがサウンド出力を行うよう指示している場合に、その指示を解釈して、ＴＶセット１２１にサウンド信号を出力する。
【００２３】
グラフィックス処理部１１１は、ＣＰＵ１０３から出力される描画命令に従って、画像データを生成してフレームバッファ１１２に書き込む。そして、書き込んだ画像データを表示画面１２０に表示するための信号をＴＶセット１２１に出力する。ＣＤ−ＲＯＭドライブ１１３は、ＣＤ−ＲＯＭ１３１上のゲームプログラム１３３及びデータ１３５を読み出す。通信インターフェース１１５は、通信媒体１４１を介してネットワーク１５１に接続され、他のコンピュータ等との間で行われるデータ通信の入出力制御を行う。インターフェース部１１７は、キーパッド１６１からの入力をＲＡＭ１０５に出力し、ＣＰＵ１０３がキーパッド１６１からの入力を解釈して演算処理を実施する。
【００２４】
本発明に係るゲームプログラム１３３及びデータ１３５は最初例えばＣＤ−ＲＯＭ１３１に記録されている。そして、ゲームプログラム１３３及びデータ１３５は実行時にＣＤ−ＲＯＭドライブ１１３により読み出されて、ＲＡＭ１０５にロードされる。ＲＡＭ１０５にロードされるデータ１３５としては、図１に示したように、頂点座標リスト２００、法線ベクトル・リスト３００、三角形ポリゴン・リスト４００、頂点グループ・リスト５００、クラスタ・データ６００、及びアニメーション・データ７００である。また、本発明に係るプログラムの処理途中で使用されるデータとして、マトリックス・バッファ８００、頂点バッファ８５０、法線ベクトル・バッファ８７０、マトリックス・キャッシュ９００、及びフレーム・カウンタ１１００とがある。これらについては以下に詳しく説明する。なお、ＣＤ−ＲＯＭ１３１に記録されている本発明に係るゲームプログラム１３３及びデータ１３５を、予めＣＤ−ＲＯＭドライブ１１３により読み出し、ＨＤＤ１０７に格納しておくようにしてもよい。ＨＤＤ１０７に本発明に係るゲームプログラム１３３及びデータ１３５が格納されている場合には、ＨＤＤ１０７からＲＡＭ１０５にゲームプログラム１３３及びデータ１３５がロードされる。
【００２５】
ＣＰＵ１０３はＲＡＭ１０５にロードされた、本発明に係るゲームプログラム１３３及びデータ１３５を処理し、描画命令をグラフィックス処理部１１１に出力する。なお、中間的なデータはＲＡＭ１０５に記憶される。グラフィックス処理部１１１はＣＰＵ１０３からの描画命令に従って処理を行い、画像データをフレームバッファ１１２に書き込み、表示画面１２０に表示するための信号をＴＶセット１２１に出力する。
【００２６】
以上のような家庭用ゲーム機１０１において実行される本発明のプログラムのアルゴリズム及び使用されるデータについて以下で詳しく述べる。
【００２７】
図２乃至図９に本発明で使用されるデータの説明を行う。
【００２８】
三次元オブジェクトが三角形ポリゴンにより構成される場合において、三次元オブジェクトの頂点の頂点座標リスト２００を図２に示す。頂点座標リスト２００は、頂点座標インデックス（ｉｎｄｅｘ）の欄２１０と、座標（ｘ，ｙ，ｚ）の欄２２０とを含む。
【００２９】
図２において、頂点インデックスｖｔｘ０の頂点の座標は（０，０，０）である。頂点インデックスｖｔｘ１の頂点の座標は（０，０，１００）である。頂点インデックスｖｔｘ２の頂点の座標は（０，１００，０）である。頂点インデックスｖｔｘ３の頂点の座標は（０，１００，１００）である。頂点インデックスｖｔｘ４の頂点の座標は（１００，０，０）である。頂点座標リスト２００における頂点座標は、仮想スケルトンにおいて対応するジョイントからの相対的な位置座標である。
【００３０】
図３に法線ベクトル・リスト３００を示す。法線ベクトル・リスト３００は、三角形ポリゴンの各頂点における法線ベクトルを定義するためのリストである。法線ベクトル・リスト３００は、法線ベクトル・インデックス（ｉｎｄｅｘ）の欄３１０と法線ベクトル（ｘ，ｙ，ｚ）の欄３２０とを含む。
【００３１】
図３において、法線ベクトル・インデックスｎｍｌ０の法線ベクトルは（１，０，０）である。法線ベクトル・インデックスｎｍｌ１の法線ベクトルは（−１，０，０）である。法線ベクトル・インデックスｎｍｌ２の法線ベクトルは（０，０，−１）である。法線ベクトル・インデックスｎｍｌ３の法線ベクトルは（−１，−１，０）である。法線ベクトル・インデックスｎｍｌ４の法線ベクトルは（０，−１，０）である。
【００３２】
図４に三角形ポリゴン・リスト４００を示す。三角形ポリゴン・リスト４００は、各三角形ポリゴンを構成する頂点０乃至２の頂点インデックス及び法線ベクトル・インデックスを格納する。三角形ポリゴン・リスト４００は、三角形ポリゴン・インデックス（ｉｎｄｅｘ）の欄４１０と、頂点０を構成する頂点の頂点インデックス及び法線ベクトルの法線ベクトル・インデックスのための頂点０の欄４２０と、頂点１を構成する頂点の頂点インデックス及び法線ベクトルの法線ベクトル・インデックスのための頂点１の欄４３０と、頂点２を構成する頂点の頂点インデックス及び法線ベクトルの法線ベクトル・インデックスのための頂点２の欄４４０とを含む。
【００３３】
図４において、三角形ポリゴン・インデックスｐｌｇ０の三角形ポリゴンの頂点０は、頂点インデックスｖｔｘ０の頂点及び法線ベクトル・インデックスｎｍｌ０の法線ベクトルにて構成される。三角形ポリゴン・インデックスｐｌｇ０の三角形ポリゴンの頂点１は、頂点インデックスｖｔｘ１の頂点及び法線ベクトル・インデックスｎｍｌ２の法線ベクトルにて構成される。三角形ポリゴン・インデックスｐｌｇ０の三角形ポリゴンの頂点２は、頂点インデックスｖｔｘ２の頂点及び法線ベクトル・インデックスｎｍｌ３の法線ベクトルにて構成される。
【００３４】
三角形ポリゴン・インデックスｐｌｇ１の三角形ポリゴンの頂点０は、頂点インデックスｖｔｘ０の頂点及び法線ベクトル・インデックスｎｍｌ１の法線ベクトルにて構成される。三角形ポリゴン・インデックスｐｌｇ１の三角形ポリゴンの頂点１は、頂点インデックスｖｔｘ２の頂点及び法線ベクトル・インデックスｎｍｌ３の法線ベクトルにて構成される。三角形ポリゴン・インデックスｐｌｇ０の三角形ポリゴンの頂点２は、頂点インデックスｖｔｘ３の頂点及び法線ベクトル・インデックスｎｍｌ４の法線ベクトルにて構成される。
【００３５】
頂点座標リスト２００と法線ベクトル・リスト３００とを設け、頂点インデックス及び法線ベクトル・インデックスとを格納する三角形ポリゴン・リスト４００を別途用意することにより、同じ頂点座標のデータや同じ法線ベクトルのデータを三角形ポリゴン・リスト４００において共用することができる。また、同じ頂点にも法線ベクトルを別途定義することが容易になる。但し、１つの法線は１つの頂点にしか対応させることができない。
【００３６】
三次元オブジェクトの形状を定める頂点はグループ分けされている。図５に頂点グループ・リスト５００を示す。頂点グループ・リスト５００には、頂点グループ数と、頂点グループ毎に、頂点グループに属する頂点（メンバ）の数、その頂点グループに属する頂点の各頂点インデックス、各頂点に予め定義された重み、各頂点に定義される法線数、及び各頂点の法線インデックスとが格納される。よって、頂点グループ・リスト５００には、グループ数の欄５１０と、頂点数の欄５２０乃至５２４と、頂点インデックスの欄５３０乃至５５４と、頂点の重みの欄５４０乃至５６４と、法線数の欄５７０乃至５８４と、法線ベクトル・インデックスの欄５８６乃至５９９とが設けられている。頂点数の欄が出てくると新たな頂点グループについてのデータが始まる。頂点グループ番号は頂点グループ・リスト５００の先頭のデータ（図中上に位置するデータ）から順に割り付けられる。
【００３７】
図５において、グループ数の欄５１０はグループ数が３であることを示している。頂点グループ０の頂点数の欄５２０は頂点グループ０の頂点数が５であることを示している。頂点グループ０に属する頂点の頂点インデックスの欄５３０には頂点インデックスｖｔｘ０が格納されている。頂点インデックスｖｔｘ０に対する重みの欄５４０には重み１．０が格納されている。頂点インデックスｖｔｘ０に対する法線数の欄５７０には２が格納されている。頂点インデックスｖｔｘ０に対する法線ベクトル・インデックスの欄５８６には、法線ベクトル・インデックスｎｍｌ０及びｎｍｌ１が格納されている。
【００３８】
頂点グループ０に属する頂点の頂点インデックスの欄５３２には頂点インデックスｖｔｘ５が格納されている。頂点インデックスｖｔｘ５に対する重みの欄５４２には重み１．０が格納されている。頂点インデックスｖｔｘ５に対する法線数の欄５７２には１が格納されている。頂点インデックスｖｔｘ５に対する法線ベクトル・インデックスの欄５８８には、法線ベクトル・インデックスｎｍｌ１０が格納されている。
【００３９】
頂点グループ０に属する頂点の頂点インデックスの欄５３４には頂点インデックスｖｔｘ１が格納されている。頂点インデックスｖｔｘ１に対する重みの欄５４４には重み０．７が格納されている。頂点インデックスｖｔｘ１に対する法線数の欄５７４には１が格納されている。頂点インデックスｖｔｘ１に対する法線ベクトル・インデックスの欄５９０には、法線ベクトル・インデックスｎｍｌ２が格納されている。
【００４０】
頂点グループ０に属する頂点の頂点インデックスの欄５３６には頂点インデックスｖｔｘ２が格納されている。頂点インデックスｖｔｘ２に対する重みの欄５４６には重み０．６が格納されている。頂点インデックスｖｔｘ２に対する法線数の欄５７６には２が格納されている。頂点インデックスｖｔｘ２に対する法線ベクトル・インデックスの欄５９２には、法線ベクトル・インデックスｎｍｌ３及びｎｍｌ１が格納されている。
【００４１】
頂点グループ０に属する頂点の頂点インデックスの欄５３８には頂点インデックスｖｔｘ３が格納されている。頂点インデックスｖｔｘ３に対する重みの欄５４８には重み０．５が格納されている。頂点インデックスｖｔｘ３に対する法線数の欄５７８には１が格納されている。頂点インデックスｖｔｘ３に対する法線ベクトル・インデックスの欄５９４には、法線ベクトル・インデックスｎｍｌ４が格納されている。
【００４２】
頂点グループ１の頂点数の欄５２２は頂点グループ１の頂点数が２であることを示している。頂点グループ１に属する頂点の頂点インデックスの欄５５０には頂点インデックスｖｔｘ４が格納されている。頂点インデックスｖｔｘ４に対する重みの欄５６０には重み０．３が格納されている。頂点インデックスｖｔｘ４に対する法線数の欄５８０には１が格納されている。頂点インデックスｖｔｘ４に対する法線ベクトル・インデックスの欄５９６には、法線ベクトル・インデックスｎｍｌ５が格納されている。
【００４３】
頂点グループ１に属する頂点の頂点インデックスの欄５５２には頂点インデックスｖｔｘ６が格納されている。頂点インデックスｖｔｘ６に対する重みの欄５６２には重み０．２が格納されている。頂点インデックスｖｔｘ６に対する法線数の欄５８２には３が格納されている。頂点インデックスｖｔｘ６に対する法線ベクトル・インデックスの欄５９８には、法線ベクトル・インデックスｎｍｌ６、ｎｍｌ８及びｎｍｌ９が格納されている。
【００４４】
頂点グループ２の頂点数の欄５２２は頂点グループ２の頂点数が１であることを示している。頂点グループ２に属する頂点の頂点インデックスの欄５５４には頂点インデックスｖｔｘ７が格納されている。頂点インデックスｖｔｘ７に対する重みの欄５６４には重み０．５が格納されている。頂点インデックスｖｔｘ７に対する法線数の欄５８４には１が格納されている。頂点インデックスｖｔｘ７に対する法線ベクトル・インデックスの欄５９９には、法線ベクトル・インデックスｎｍｌ７が格納されている。
【００４５】
本実施の形態では、重みは０以上１以下の実数である。また、頂点は一つの頂点グループに属している。
【００４６】
図６には、人型の三次元オブジェクト１０を前方から見たときの仮想スケルトンの例を示している。人型の三次元オブジェクト１０に対応する仮想スケルトン２０には、ルート・ジョイントＪ２と、ジョイントＪ３乃至Ｊ１５と、ルート・ボーンＢ２と、ボーンＢ３乃至Ｂ１５とが含まれる。
【００４７】
ボーンＢ３は、ジョイントＪ４とジョイントＪ５との間に観念される。ボーンＢ５は、ジョイントＪ５とジョイントＪ６との間に観念される。ボーンＢ８は、ジョイントＪ６に接続されるように観念される。ルート・ボーンＢ２は、ジョイントＪ３とジョイントＪ７との間に観念される。ボーンＢ６は、ジョイント７とジョイントＪ８との間に観念される。ボーンＢ７は、ジョイントＪ８に接続されるように観念される。
【００４８】
ボーンＢ４は、ルート・ジョイントＪ２とジョイントＪ９との間に観念される。ボーンＢ９は、ジョイントＪ９に接続されるように観念される。ボーンＢ１１は、ジョイントＪ１１とジョイントＪ１４との間に観念される。ボーンＢ１４は、ジョイントＪ１４とジョイントＪ１５との間に観念される。ボーンＢ１５は、ジョイントＪ１５に接続されるように観念される。ボーンＢ１０は、ジョイントＪ１０とジョイントＪ１２との間に観念される。ボーンＢ１２は、ジョイントＪ１２とジョイントＪ１３の間に観念される。ボーンＢ１３は、ジョイントＪ１３に接続されるように観念される。
【００４９】
仮想スケルトン２０は文字通り仮想的なスケルトンであり、表示画面１２０には表示されない。また、人型の三次元オブジェクト１０であっても、実際の人間には存在しないジョイントが設けられ、またボーンも観念されている。
【００５０】
なお、図６にはボーンは示されているが、仮想スケルトン２０を容易に理解できるようにするために示されているだけであって、本実施の形態では仮想スケルトン２０においてボーンのデータは無い。よって、上においてボーンについては「観念される」としている。
【００５１】
各ジョイントは階層構造を成している。図６の例では、図７に示すような階層構造である。ルート・ジョイントＪ２は、腰の付け根に存在するジョイントであり、最上位階層に属する。このルート・ジョイントＪ２の子ジョイントは、右足の付け根のジョイントＪ３、左足の付け根のジョイントＪ４、首の付け根のジョイントＪ９、左腕の付け根のジョイントＪ１０、及び右腕の付け根のジョイントＪ１１である。ジョイントＪ３は三次元オブジェクト１０の右足の付け根のジョイントである。よって、ジョイントＪ３の子ジョイントは、三次元オブジェクト１０の右膝のジョイントであるジョイントＪ７である。ジョイントＪ７の子ジョイントは、三次元オブジェクト１０の右足首のジョイントであるジョイントＪ８である。
【００５２】
ジョイントＪ４は三次元オブジェクト１０の左足付け根のジョイントである。よって、ジョイントＪ４の子ジョイントは、三次元オブジェクト１０の左膝のジョイントであるジョイントＪ５である。ジョイントＪ５の子ジョイントは、三次元オブジェクト１０の左足首のジョイントであるジョイントＪ６である。
【００５３】
ジョイントＪ１０は、三次元オブジェクト１０の左腕の付け根のジョイントである。よって、ジョイントＪ１０の子ジョイントは、三次元オブジェクト１０の左肘のジョイントであるジョイントＪ１２である。ジョイントＪ１２の子ジョイントは、三次元オブジェクトの左手首のジョイントであるジョイントＪ１３である。
【００５４】
ジョイントＪ１１は、三次元オブジェクト１０の右腕の付け根のジョイントである。よって、ジョイントＪ１１の子ジョイントは、三次元オブジェクト１０の右肘のジョイントであるジョイントＪ１４である。ジョイントＪ１４の子ジョイントは、右手首のジョイントであるジョイントＪ１５である。
【００５５】
図７に示したように、ルート・ジョイントＪ２を除く各ジョイントには、必ず１つのジョイントが親ジョイントとして対応付けられている。なお子ジョイントはいくつであってもよいし、無くてもよい。
【００５６】
各ジョイントの持つ変化量に従って当該ジョイントに対応付けられた頂点は移動する。同時に、当該ジョイントの子ジョイントもすべて移動する。例えばルート・ジョイントＪ２が平行移動すれば、ルート・ジョイントＪ２の下位のジョイント全て、すなわち仮想スケルトン２０全体が平行移動する。これにより対応する三次元オブジェクト１０全体が平行移動する。なお、ルート・ジョイントＪ２の移動は全てのジョイントに影響を及ぼすので、ルート・ジョイントＪ２は三次元オブジェクト１０の配置等にも用いられる。
【００５７】
本実施の形態では上で述べたような仮想スケルトンを使用する。そして、各仮想スケルトンのジョイントについては、図８に示すようなジョイント・データ６００が用意される。ジョイント・データ６００には、ジョイントのデータと、ジョイントに対応付けられる頂点グループのデータとがジョイントごとに格納される。ジョイントのデータには、ジョイントの階層構造に関するデータも含まれる。
【００５８】
ジョイント・データ６００において、ルート・インデックス（ｉｎｄｅｘ）の欄６１０には、ルート・ジョイントのジョイント・インデックスが格納される。図８の例ではｒｏｏｔである。ルート・ジョイントの基準平行移動量（ｘ，ｙ，ｚ）の欄６１２には、仮想スケルトンの基準姿勢におけるルート・ジョイントの基準となる位置が格納される。図８の例では（０，０，０）である。ルート・ジョイントの基準回転角（Ｒｘ，Ｒｙ，Ｒｚ）の欄６１４には、ルート・ジョイントの基準となる回転角が格納される。図８の例では（０，０，９０）である。ジョイント数の欄６１６には、ルート・ジョイント以下の階層に属するジョイントの数が格納される。図８の例では４である。
【００５９】
ジョイント・インデックス（ｉｎｄｅｘ）の欄６２０には、ルート・ジョイントより下位の階層に属するジョイントのジョイント・インデックスｊｏｉｎｔ０が格納される。親インデックス（ｉｎｄｅｘ）の欄６２２には、ジョイントｊｏｉｎｔ０の親ジョイントのジョイント・インデックスｒｏｏｔが格納される。基準平行移動量の欄６２４には、仮想スケルトンの基本姿勢におけるジョイントｊｏｉｎｔ０の親ジョイントｒｏｏｔからの基準となる相対座標（９０，２０，０）が格納される。基準回転角の欄６２６には、仮想スケルトンの基本姿勢におけるジョイントｊｏｉｎｔ０の親ジョイントからの基準となる相対的な回転角（０，０，１３５）が格納される。
【００６０】
頂点グループ数の欄６２８には、ジョイントｊｏｉｎｔ０に対応する頂点グループの数が格納される。図８の例では２である。頂点グループ番号の欄６３０及び６３２には、具体的にジョイントｊｏｉｎｔ０に対応する頂点グループ・リスト５００における頂点グループ番号が格納される。図８の例では、頂点グループ０と、頂点グループ２である。
【００６１】
ジョイント・インデックスの欄６４０には、ルート・ジョイントｒｏｏｔ及びジョイントｊｏｉｎｔ０以外の仮想スケルトンに属するジョイントのジョイント・インデックス（ｉｎｄｅｘ）が格納される。図８の例では、ジョイント・インデックスｊｏｉｎｔ１である。ジョイントｊｏｉｎｔ１の親ジョイントのインデックスを格納する親インデックス（ｉｎｄｅｘ）の欄６４２には、ジョイント・インデックスｊｏｉｎｔ０が格納される。
【００６２】
基準平行移動量の欄６４４には、仮想スケルトンの基本姿勢におけるジョイントｊｏｉｎｔ１の親ジョイントｊｏｉｎｔ０からの基準となる相対座標（４０，０，０）が格納される。基準回転角の欄６４６には、仮想スケルトンの基本姿勢におけるジョイントｊｏｉｎｔ１の親ジョイントｊｏｉｎｔ０からの基準となる相対的な回転角（０，０，４５）が格納される。
【００６３】
頂点グループ数の欄６４８には、ジョイントｊｏｉｎｔ１に対応する頂点グループの数が格納される。図８の例では１である。頂点グループ番号の欄６５０には、具体的にジョイントｊｏｉｎｔ１に対応する頂点グループ・リスト５００における頂点グループ番号が格納される。図８の例では、頂点グループ１である。
【００６４】
仮想スケルトンの各ジョイントに対して変形を行うための操作は、図９に示されたアニメーション・データ７００に従って行われる。すなわち、クラスタ数及びフレーム数を定義するアニメーション・データ７００Ａ（図９（ａ））と、変形開始から終了までの各フレーム表示周期毎に移動する各クラスタの回転角を定義するアニメーション・データ７００Ｂ（図９（ｂ））とが含まれる。なお、アニメーション・データ７００Ｂにおいてジョイントは、ルート・ジョイントから順に最下位の階層へ並べられる。
【００６５】
図９（ａ）においては、移動するジョイントの数がジョイント数の欄７１０に格納される。図９（ａ）の例では２である。そして、変形開始から終了までのタイム・フレーム数は、フレーム数の欄７２０に格納される。図９（ａ）の例では１０である。以下、移動するジョイントの数２に対応して２行毎にフレーム表示周期のジョイントの回転角がアニメーション・データ７００Ｂ（図９（ｂ））に規定される。ジョイント・インデックス（ｉｎｄｅｘ）の欄７３には、移動するジョイントのインデックスが格納される。回転角（Ｒｘ，Ｒｙ，Ｒｚ）の欄７４０には、基準姿勢からの回転角が格納される。
【００６６】
フレーム０において、移動するジョイントｊｏｉｎｔ０の回転角は（０，０，０）である。また移動するジョイントｊｏｉｎｔ１の回転角も（０，０，０）である。これは、基本姿勢のままであるということを意味する。次に、フレーム１において、ジョイントｊｏｉｎｔ０の回転角は（１０，０，１３５）である。またジョイントｊｏｉｎｔ１の回転角は（−１０，５，４５）である。このようなデータがフレーム９まで続く。フレーム９において、ジョイントｊｏｉｎｔ０の回転角は（９０，０，１５０）である。ジョイントｊｏｉｎｔ１の回転角は（−９０，４５，４５）である。
【００６７】
なお、本実施の形態では、回転角はＲｘ，Ｒｙ，Ｒｚの３つのパラメータを有する。Ｒｘは、ジョイントを通るｘ軸を中心にＲｘだけ回転することを意味する。Ｒｙは、ジョイントを通るｙ軸を中心にＲｙだけ回転することを意味する。Ｒｚは、ジョイントを通るｚ軸を中心にＲｚだけ回転することを意味する。ここではｘｙｚの順番に回転することとするが、回転の順番は任意である。但し、回転の順番が異なれば回転後の位置も異なるので、データ作成時と仮想スケルトン変形時において回転の順序は統一されている必要がある。
【００６８】
以上述べたようなデータを本実施の形態では用いる。本実施の形態におけるプログラムの処理について説明する前に、動作の原理について図１０を用いて説明しておく。
【００６９】
図１０（ａ）は、二次元の仮想スケルトンを変形する前の状態を示している。仮想スケルトンはジョイントＡ及びＢと、ボーンＢ１及びＢ２により構成される。ポリゴンの頂点Ｖ１乃至Ｖ４はジョイントＡに対応している。ポリゴンの頂点Ｖ５乃至Ｖ８はジョイントＢに対応している。頂点Ｖ１乃至Ｖ４の重みは皆１００％すなわち１．０である。頂点Ｖ５及びＶ６の重みは５０％すなわち０．５である。頂点Ｖ７及びＶ８の重みは１００％すなわち１．０である。図１０（ａ）において頂点記号の下の括弧内は対応するジョイントの記号と重みを示している。
【００７０】
図１０（ｂ）は、仮想スケルトンのジョイントＢを６０度回転した状態を示している。但し、図１０（ａ）のように頂点Ｖ５及びＶ６の重みを５０％ではなく１００％とした場合である。頂点Ｖ６ａは三次元オブジェクト内部にめり込んでしまうことが分かる。これでは、滑らかな三次元オブジェクトの表示を行うことができない。
【００７１】
一方、図１０（ａ）において頂点Ｖ５及びＶ６のジョイントＡに対する影響度を５０％、ジョイントＢに対する影響度を５０％として、例えば特開平１０−７４２７０号公報に述べられている方法で変形した場合を図１０（ｃ）に示す。図１０（ｂ）において頂点Ｖ５及びＶ６は、変形前の図１０（ａ）と同じである。Ｖ５ａ及びＶ６ａは、ジョイントＢからの影響度を１００％とした場合の頂点Ｖ５及びＶ６の変形後の頂点位置を示している。図１０（ｃ）に示したＶ５ａ及びＶ６ａと同じである。図１０（ｃ）における点線は図１０（ｂ）に示された頂点を結ぶ線である。
【００７２】
特開平１０−７４２７０号公報記載の技術では、Ｖ５とＶ５ａの位置座標をジョイントＡ及びＢへの影響度により補間する。Ｖ６とＶ６ａの位置座標もジョイントＡ及びＢへの影響度により補間する。補間により求められた頂点位置Ｖ５ｂ及びＶ６ｂが、頂点Ｖ５及びＶ６の変形後の位置となる。従来技術の説明の欄においても述べたが、ジョイントＢの親ジョイントであるジョイントＡが移動しなければ上のような処理を実施することになるが、実際にはジョイントＡが移動する可能性もあるので、Ｖ５及びＶ６の位置を得るため、及びＶ５ａ及びＶ６ａの位置を得るために、２度頂点変換を実施する必要がある。
【００７３】
本発明においては、図１０（ａ）に示したように、頂点Ｖ５及びＶ６には対応する１つのジョイントと１つの重みしか定義されない。図１０（ａ）の例では頂点Ｖ５及びＶ６の重みは５０％であった。本発明をしごく簡単にしてしまえば、ジョイントＢを６０度回転する場合には、頂点Ｖ５及びＶ６については６０（度）×０．５（重み）＝３０度だけジョイントＢを回転させた場合における位置を計算し、当該位置を頂点Ｖ５及びＶ６の変形後の頂点位置とするものである。
【００７４】
図１０（ｄ）において点線で示されたボーンＢ２ａが回転を３０度にした場合を示している。ボーンＢ２を３０度回転させた場合における頂点Ｖ５及びＶ６の移動先は、Ｖ５ｂ及びＶ６ｂである。頂点Ｖ７及びＶ８はジョイントＢに対して重み１００％であるから、ボーンＢ２のように６０度回転した場合に対応する位置に配置される。このようにすればＶ６が三次元オブジェクト内部にめり込むことなく、且つ変形後の三次元オブジェクトは滑らかである。
【００７５】
なお、図１０では回転の方向を１つの軸を中心にしたものに限定していたため、簡単に重みに対応する回転角が求められた。しかし、三次元空間において回転を処理する場合には、問題が生じ得るので注意が必要となる。
【００７６】
例えば、ｘ軸を中心に０度、ｙ軸を中心に０度、ｚ軸を中心に９０度の順番で回転させる変換と、ｘ軸を中心に１８０度、ｙ軸を中心に１８０度、ｚ軸を中心に−９０度の順番で回転させる変換とは全く同じ変換となる。回転変換マトリックスも同じになる。
【００７７】
しかし、重み５０％の頂点のために、各軸の角度を重みに応じて単純に変更すると、好ましくない結果が現れる。すなわち、前者はｘ軸を中心に０度、ｙ軸を中心に０度、ｚ軸を中心に４５度の順番で回転させる変換となる。後者はｘ軸を中心に９０度、ｙ軸を中心に９０度、ｚ軸を中心に−４５度の順番で回転させる変換となる。変更前では同じ変換であったのにもかかわらず、変更後では全く異なる変換となる。
【００７８】
よって本実施の形態では、重みの反映をクォータニオン及び球状線形補間を用いて行う。以下、クォータニオン及び球状線形補間について簡単に説明しておく。
【００７９】
クォータニオンは４元数とも呼ばれ、ベクトルとスカラー値の組み合わせで表現される。例えば、クォータニオンｑはｑ＝ａ＋ｂｉ＋ｃｊ＋ｄｋである。ａ，ｂ，ｃ及びｄはスカラー値でｉ，ｊ及びｋは単位ベクトルである。ｑ＝（ｂ，ｃ，ｄ，ａ）＝ｑ（Ｖ，ａ）（ベクトルＶ＝（ｂ，ｃ，ｄ））といったような表記もされる。クォータニオンは回転軸を定めた回転を表現することができる。
【００８０】
ｉをｘ軸、ｊをｙ軸、ｋをｚ軸とする。ｘ軸を中心にＲｘ回転させる場合のクォータニオンは、ｑｘ＝（ｓｉｎ（Ｒｘ／２），０，０，ｃｏｓ（Ｒｘ／２））である。ｙ軸を中心にＲｙ回転させる場合のクォータニオンは、ｑｙ＝（０，ｓｉｎ（Ｒｙ／２），０，ｃｏｓ（Ｒｙ／２））である。ｚ軸を中心にＲｚ回転させる場合のクォータニオンは、ｑｚ＝（０，０，ｓｉｎ（Ｒｚ／２），ｃｏｓ（Ｒｚ／２））である。ｘ軸ｙ軸ｚ軸の順番で回転させるクォータニオンは、ｑｒｏｔ＝ｑｘ＊ｑｙ＊ｑｚで求められる（クォータニオンの乗算を示す記号を＊とする）。ｑｒｏｔはｘ軸、ｙ軸、ｚ軸の順番での回転結果と同じ回転結果を１回の回転で得るための回転軸と回転角を表す。但し、クォータニオン同士の乗算は以下のようになる。但し、「×」は外積であり、「・」は内積を表している。
0003568861.tif 000002
【００８１】
球状線形補間は図１１のような状況を考えれば理解し易い。図１１においてＡ、Ｐ及びＢは円弧状に位置している。ベクトルＡとベクトルＢの間の角度はθ２であり、ベクトルＡとベクトルＰの間の角度はθ１である場合、ベクトルＰを求める。Ｐ＝αＡ＋βＢ（α及びβは実数）と書くことができ、｜Ｐ｜＝１、Ａ・Ｂ＝ｃｏｓθ２、Ａ・Ｐ＝ｃｏｓθ１であるから以下の式で求められる。
Ｐ＝（Ａｓｉｎ（θ２−θ１）＋Ｂｓｉｎθ１）／ｓｉｎθ２    （２）
【００８２】
なお、θ１＝θ２ｕ（ｕは［０，１］）とすると以下のようになる。
Ｐ＝（Ａｓｉｎ（１−ｕ）θ２＋Ｂｓｉｎ（θ２ｕ））／ｓｉｎθ２    （３）
【００８３】
これと同様のことをクォータニオンにおいても行えばよい。クォータニオンｑ０＝（Ｖ０，ｗ０）とｑ１＝（Ｖ１，ｗ１）をｔ（［０，１］に属する）で球状線形補間したクォータニオンは以下のようになる。
ｑ＝（ｑ０＊ｓｉｎ（（１−ｔ）ω）＋ｑ１＊ｓｉｎ（ｔ＊ω））／ｓｉｎω    （４）
ω＝ａｃｏｓ（ｗ０＊ｗ１＋Ｖ０・Ｖ１）
なお、（ｔ＊ω）は、ｔとωのスカラー積を示す。また、「ａｃｏｓ」はアークコサインを示す記号である。
【００８４】
本実施の形態において図１０（ｄ）で示した頂点Ｖ５及びＶ６の移動先Ｖ５ｂ及びＶ６ｂを求めるには、単位クォータニオンｑｉ＝（０，０，０，１）とジョイントＢに対して行われる回転に対応するクォータニオンとの球状線形補間を行えば良い。但し、簡略化して、ｑ２＝ｑｉとして、ｑ＝（１−ｔ）ｑ１＋ｑｉ＊ｔにて計算を行うことも可能である。
【００８５】
以上の計算にて求められたクォータニオンｑ＝（ｘ，ｙ，ｚ，ｗ）に基づく回転変換マトリックスは、以下のようになる。
【００８６】
【数１】
0003568861.tif 000003
式（５）における「＊」はスカラー積を示す記号である。
クォータニオン及び球状線形補間の詳細については、Ａｄｖａｎｃｅｄ  Ａｎｉｍａｔｉｏｎ  ａｎｄ  Ｒｅｎｄｅｒｉｎｇ  Ｔｅｃｈｎｉｑｕｅｓ  Ｔｈｅｏｒｙ  ａｎｄ  Ｐｒａｃｔｉｃｅ  （Ａｌａｎ  Ｗａｔｔ  ａｎｄ  Ｍａｒｋ  Ｗａｔｔ，  ＡＤＤＩＳＯＮ−ＷＥＳＬＥＹ  ＩＳＢＮ  ０−２０１−５４４１２−１）を参照のこと。
【００８７】
クォータニオン及び球状線形補間を使用して、頂点変換用マトリックスを生成することは、あたかも（ａ）ジョイントの回転角（Ｒｘ，Ｒｙ，Ｒｚ）から定まる１つの回転軸とこの回転軸に対応する回転角とを求め、（ｂ）さらに回転角をジョイントに対応する頂点に予め定義された重みに従い変更し、（ｃ）変更された回転角だけ対応する回転軸を中心に回転させる処理を行ったようなものである。結果として同じような回転を得る方法は多数あるが、クォータニオン及び球状線形補間を使用すると、実施すべき回転を最短距離で実施することになる。
【００８８】
以上のような前提を元にして本実施の形態にかかる処理フローを説明する。
【００８９】
ＣＰＵ１０３は、起動時に、ＲＯＭ１０４等に記憶されているオペレーティングシステムに基づき、ＣＤ−ＲＯＭドライブ１１３を介してＣＤ−ＲＯＭ１３１から画像処理やゲームの実行に必要なゲームプログラム１３３やデータ１３５を読み出し、ＲＡＭ１０５に転送させる。そして、ＣＰＵ１０３は、ＲＡＭ１０５に転送されたゲームプログラム１３３を実行することにより、以下に記載する処理を実現する。
【００９０】
なお、家庭用ゲーム装置１０１で行われる制御及び処理の中には、ＣＰＵ１０３以外の回路がＣＰＵ１０３と協働して実際の制御及び処理を行っている場合もある。説明の便宜上、以下では、ＣＰＵ１０３が関係する制御及び処理は、ＣＰＵ１０３が直接的に実行しているものとして説明する。
【００９１】
また、画像処理やゲームを実行するために必要なゲームプログラム１３３やデータ１３５は、実際にはＣＰＵ１０３からの命令に従って処理の進行状況に応じて順次ＣＤ−ＲＯＭ１３１から読み出されてＲＡＭ１０５に転送される。しかし、以下に示す説明では、発明の理解を容易にするため、ＣＤ−ＲＯＭ１３１からのデータの読み出しや、ＲＡＭ１０５への転送に関する記述は省略している。
【００９２】
もし画像処理やゲームを実行するために必要なゲームプログラム１３３やデータ１３５がＨＤＤ１０７に格納されている場合には、ＣＰＵ１０３からの命令に従って処理の進行状況に応じて順次ＨＤＤ１０７から読み出されてＲＡＭ１０５に転送される。しかし、以下に示す説明では、上で述べたのと同様の理由で、ＨＤＤ１０７からのデータの読み出しや、ＲＡＭ１０５への転送に関する記述は省略している。
【００９３】
図１２に本実施の形態に係るメインフローを示す。最初に初期設定が行われる（ステップＳ１）。この初期設定では、図２乃至図５、図８及び図９において示したようなデータをＲＡＭ１０５に読み出す。また、フレームカウンタを０にリセットしておく。次に、仮想空間内の状態設定を行う（ステップＳ３）。仮想空間内の状態設定では、例えばユーザによるキーパッド１６１の操作により三次元オブジェクトのアニメーションの開始が命令されたり、同じくユーザによるキーパッド１６１の操作により視点位置が変更される場合に、それに応じて仮想空間内の状態を変更する処理である。
【００９４】
そして本発明に係るオブジェクト変形処理が実施される（ステップＳ５）。これについては後に詳しく述べる。変形された三次元オブジェクトに対して描画処理が行われる（ステップＳ７）。光源計算、透視変換等を実施して、フレームバッファ１１２に描画する。本実施の形態では描画処理は従来と変わらない。次にフレーム・カウンタ１１００が１インクリメントされる（ステップＳ９）。そして処理が終了か否かが判断される（ステップＳ１１）。フレーム・カウンタ１１００の値が処理の終了を示している場合には処理を終了する。フレーム・カウンタ１１００の値が処理の終了を示していない場合にはステップＳ３に戻る。
【００９５】
オブジェクト変形処理の詳細を図１３に示す。図１２の説明で分かるように、このオブジェクト変形処理を実施する前に、フレーム番号は分かっている。まず最初に、三次元オブジェクトの元形状を取得する（ステップＳ２１）。ここではＲＡＭ１０５にコピーされた頂点座標リスト２００をコピーしてＲＡＭ１０５内に頂点バッファ８５０を生成する。そして、全ジョイントについて変形処理を実施したか判断する（ステップＳ２３）。全ジョイントについて変形処理が実施されていれば処理を終了する。全てのジョイントについて変形処理が終了しているわけではない場合にはステップＳ２５に移行する。
【００９６】
ステップＳ２５では、アニメーション・データ７００からジョイント・インデックスを取得する（ステップＳ２５）。そして取得したジョイント・インデックスに係るカレントジョイント情報を取得する（ステップＳ２７）。カレントジョイント情報とは、当該ジョイントの回転角（Ｒｘ，Ｒｙ，Ｒｚ）である。アニメーション・データ７００の説明でも述べたが、より上位の階層のジョイントから順番に取得されるようにする。すなわち、より上位の階層のジョイントについては処理が終了しているようにする。このためアニメーション・データ７００においてより上位の階層のジョイントは上のほうに並べられる。
【００９７】
次に取得されたジョイント・インデックスに対応付けられた頂点グループ全てについて移動処理を終了したか判断する（ステップＳ２９）。もし、取得されたジョイント・インデックスに対応付けられた頂点グループ全てについて移動処理を終了している場合には、次のジョイント・インデックスの処理に移行するためステップＳ２３に戻る。一方、取得されたジョイント・インデックスに対応付けられた全ての頂点グループについて移動処理が終了しているわけではない場合には、未処理の頂点グループ番号をジョイント・データ６００から取得する（ステップＳ３１）。
【００９８】
次に、頂点グループ・リスト５００を参照して、取得した頂点グループ番号に属する頂点について全て移動処理が終了したか判断する（ステップＳ３３）。頂点グループ・リスト５００は頂点グループ番号の情報を含んでいない。但し、頂点グループ・リスト５００を上から走査し、頂点数（メンバ数）の行５２０乃至５２４の出現回数により頂点グループ番号を把握することができる。すなわち、頂点数の行５２０乃至５２４の出現回数−１が頂点グループ番号を意味するため、頂点数の行５２０乃至５２４の出現回数−１＝取得した頂点グループ番号となるまで頂点グループ・リスト５００を上から走査すれば、取得した頂点グループ番号に関する頂点の情報を得ることができる。
【００９９】
もし、取得した頂点グループ番号に属する頂点について全て移動処理が終了している場合には、ステップＳ２９に戻る。一方、取得した頂点グループ番号に属する全ての頂点について移動処理が終了しているわけではない場合には、頂点グループ・リスト５００から未処理の頂点インデックスを取得し、同様に頂点グループ・リスト５００から当該頂点の重みｗを取得する（ステップＳ３５）。
【０１００】
そしてカレントジョイント情報（現フレームにおける回転角）と重みｗに基づいて頂点バッファの座標情報を変更する（ステップＳ３７）。ステップＳ３７では、上で述べたクォータニオンの球状線形補間の処理が行われる。すなわち、現フレームにおけるジョイントの回転角によるクォータニオンｑ１と単位クォータニオンｑｉとを重みｗで球状線形補間する。球状線形補間により求められたクォータニオンｑから本ジョイントにおける変換マトリックスＲが上の（５）の式で求められる。
【０１０１】
元の頂点座標ｖからジョイントの回転による回転後の頂点座標ｖａを求めるための全体のマトリックスは、変換マトリックスＲの他に、親ジョイントからの相対座標を表すマトリックスＴ、基準回転角を表すマトリックスＪ、親ジョイントの変換マトリックスＢを用いて、Ｍ＝ＲＪＴＢとなる。すなわち、最終的に求めるべき頂点座標ｖａは以下の式で求められる。
ｖａ＝ｖＭ
【０１０２】
計算されたｖａ＝（ｘａ，ｙａ，ｚａ）を頂点バッファ８５０に書き込む。また、当該頂点の法線ベクトルも法線ベクトル・リスト３００から取り出して、変換マトリックスＭの回転成分のみを用いて変換した法線ベクトルを、法線ベクトル・バッファ８７０に書き込む。これにより、頂点の座標及び法線ベクトルの値が更新される。更新された頂点座標及び法線ベクトルの値はそれぞれ頂点バッファ８５０及び法線ベクトル・バッファ８７０に格納され、頂点バッファ８５０及び法線ベクトル・バッファ８７０の内容に従って三次元オブジェクトがフレームバッファ１１２に描画される。
【０１０３】
ステップＳ３７の後にはステップＳ３３に戻り、頂点グループの全ての頂点について移動処理が終了するまでステップＳ３５及びＳ３７が実施される。
【０１０４】
なお、ステップＳ３７の処理では、マトリックスＭを用いて法線ベクトルを変換しているが、これはリアルタイムで処理を行うための近似手段である。ポリゴンのエッジ情報（隣接するポリゴンと成す角）等を考慮した上で法線ベクトルを生成すれば、より正確な法線ベクトルを求めることができる。
【０１０５】
上で述べたステップＳ３７の処理では全ての頂点について変換マトリックスＭを計算していた。しかし、全てについて変換マトリックスＭを計算する必要は無い。同じジョイントに対応する頂点の場合には、頂点に予め定義されている重みが同じであれば、前に計算された変換マトリックスＭはそのまま使用できる。以下では変換マトリックスＢのバッファ及び変換マトリックスＭのキャッシュについて説明する。
【０１０６】
図１４に親ジョイントの変換マトリックスＢのマトリックス・バッファ８００を示す。アニメーション・データ７００の各タイム・フレームでは、ルート・ジョイントから最下位の階層のジョイントへ順番に処理される。ルート・ジョイントを除く全てのジョイントは親ジョイントからの影響を受けるため、親ジョイントの重み１００％の変換マトリックスＢが必要となる。また親ジョイントに対応する頂点の処理時においても、当該親ジョイントに対応する頂点の重みが１００％であれば、そのまま変換マトリックスＢは使用可能である。
【０１０７】
よって、マトリックス・バッファ８００では、ジョイント毎に重み１００％における変換マトリックスのデータを保持しておく。ジョイント・インデックスの欄８１０には、ルート・ジョイント以下のジョイント・インデックスが格納される。マトリックス・データの欄８２０には、各ジョイントの変換マトリックスのデータが格納される。上ではＭ＝ＲＪＴＢであった。基本的には同じ式で計算できる。ここでは重み１００％でクォータニオンを使用しないで求めた変換マトリックスＲａと、親ジョイントの更に親ジョイントの重み１００％の変換マトリックスをＢａとする。求めるべき変換マトリックスＢはＢ＝ＲａＪＴＢａとなる。
【０１０８】
変換マトリックスＭのキャッシュについてここでは２種類の実施の形態を示しておく。図１５には直前に計算した頂点の重みの値を記憶する欄９１０と当該重みに対応する変換マトリックスＭの欄９２０を設けたマトリックス・キャッシュ９００を示す。同じジョイントについて重みが同じ頂点が複数あれば、１度計算された変換マトリックスＭは再利用可能である。
【０１０９】
よって、新たな頂点を移動処理する場合（図１３：ステップＳ３７）には、まずマトリックス・キャッシュ９００を参照する。新たな頂点の重みの値と、マトリックス・キャッシュ９００の重みの欄９１０に格納された重みの値が一致するか判断する。もし、新たな頂点の重みの値と、マトリックス・キャッシュの重みの欄９１０に格納された重みの値が一致する場合には、変換マトリックスＭの欄９２０に格納された変換マトリックスＭのデータは、新たな頂点に対して使用可能である。よって、マトリックス・キャッシュ９００から読み出して、読み出した変換マトリックスＭにより当該頂点を移動させる。一方、新たな頂点の重みの値と、マトリックス・キャッシュ９００の重みの欄９１０に格納された重みの値が一致しない場合には、上で述べたのと同じように新たに変換マトリックスＭを計算する。そして新たな頂点の重みと、計算された変換マトリックスＭとをマトリックス・キャッシュ９００に格納する。
【０１１０】
ジョイント毎に又は頂点グループ毎に、頂点インデックスが頂点の重みのデータによりソートされていれば本手法は有効である。なお、図５の頂点グループ・リスト５００では頂点インデックスが頂点の重みのデータによりソートされている様子が示されている。
【０１１１】
図１５では１つの変換マトリックスＭのデータしかキャッシュできなかったが、図１６では複数の変換マトリックスＭのデータをキャッシュする方法が示されている。マトリックス・キャッシュ１０００では、１つの重み毎に、重みの値の欄１０１０、１０２０及び１０３０、変換マトリックスのデータの欄１０１２、１０２２及び１０３２、次のデータへのポインタ１０１４、１０２４及び１０３４が含まれる。
【０１１２】
図１６の例では、重み０．４の場合と、重み０．２の場合と、重み０．８の場合の変換マトリックスが格納されている。なお、最後のデータについては次のデータへのポインタではなくｎｕｌｌが格納されている。
【０１１３】
図１６のようなマトリックス・キャッシュ１０００が用意されている場合には、新たな頂点を移動処理する場合（図１３：ステップＳ３７）には、まずマトリックス・キャッシュ１０００を参照する。新たな頂点の重みの値と、マトリックス・キャッシュ１０００の重みの欄１０１０乃至１０３０のいずれかに格納された重みの値が一致するか判断する。
【０１１４】
もし、新たな頂点の重みの値と、マトリックス・キャッシュの重みの欄１０１０乃至１０３０のいずれかに格納された重みの値が一致する場合には、変換マトリックスＭの欄１０１２乃至１０３２に格納された、対応する変換マトリックスＭのデータは、新たな頂点に対して使用可能である。よって、マトリックス・キャッシュ１０００から読み出して、読み出した変換マトリックスにより当該頂点を移動させる。
【０１１５】
一方、新たな頂点の重みの値と、マトリックス・キャッシュ１０００の重みの欄１０１０乃至１０３０に格納された重みの値が全く一致しない場合には、上で述べたのと同じように新たに変換マトリックスＭを計算する。そして新たな頂点の重みと、計算された変換マトリックスＭとをマトリックス・キャッシュ１０００に新たなデータとして付加する。
【０１１６】
図１６のようなマトリックス・キャッシュ１０００を使用する場合には、各頂点の重みが段階的に定義されていると、マトリックス・キャッシュ１０００のヒット率が高まるので、速度・容量共に効率が上がる。段階的な重みとは、例えば重みが０．０から１．０の範囲で設定可能である場合、０．２単位でのみ重みを定義することができるようにするものである。例えば０．１や０．７９等の０．２の単位からはずれる重みを設定不可能とする。
【０１１７】
図１６のようなマトリックス・キャッシュ１０００を使用する場合には、図１５のようなマトリックス・キャッシュ９００のように頂点インデックスが頂点の重みによりソートされていなくとも有効に作用する。但し、マトリックス・キャッシュ１０００には複数のデータが存在するのでサーチの処理が必要となる。
【０１１８】
マトリックス・キャッシュ１０００のサーチ処理を高速化するために、以下のような処理を行うことができる。図１７では、高速にサーチ可能な複数の変換マトリックス・キャッシュの構造を模式的に示している。図１７に示したマトリックス・キャッシュ２０００では、１つの重み毎のデータに、重みの欄２０１０、２０２０及び２０３０、変換マトリックスのデータ欄２０１２、２０２２及び２０３２、次のデータへのポインタ（ｎｅｘｔ）２０１４、２０２４及び２０３４、前のデータへのポインタ（ｐｒｅｖ）２０１６、２０２６及び２０３６が含まれている。
【０１１９】
図１７の例では、重み０．２の場合と、重み０．４の場合と、重み０．８の場合の変換マトリックスのデータが格納されている。なお、重み０．２の場合の変換マトリックスは先頭のデータであり、前のデータへのポインタ２０１６にはｎｕｌｌが格納されている。また、重み０．８の場合の変換マトリックスは最後尾のデータであり、次のデータへのポインタ２０３４にはｎｕｌｌが格納されている。
【０１２０】
マトリックス・キャッシュ２０００は、常に重み値によってソートされている。すなわち、ある重みの変換マトリックスのデータを追加する場合には、追加するデータの重みより低い重みのデータの次、追加するデータの重みより高い重みのデータの前にデータが追加される。
【０１２１】
次のデータへのポインタ２０１４には、重み０．４のデータの位置を示すポインタが格納される。次のデータへのポインタ２０２４には、重み０．８のデータの位置を示すポインタが格納される。前のデータへのポインタ２０３６には、重み０．４のデータの位置を示すポインタが格納される。前のデータへのポインタ２０２６には、重み０．２のデータの位置を示すポインタが格納される。
【０１２２】
例えば、図１７に示したデータが格納されている状態で、更に重み０．６の場合の変換マトリックスのデータを追加するには、重み０．４のデータの次、重み０．８のデータの前に重み０．６のデータが格納される。その際、重み０．４の次のデータへのポインタ２０２４には、重み０．６のデータの位置を示すポインタが格納される。重み０．８の前のデータへのポインタ２０２４には、重み０．６のデータの位置を示すポインタが格納される。
【０１２３】
また、図１７の例ではマトリックス・キャッシュ２０００のほかに、直前に参照したデータを指し示す参照データポインタ２１００が設けられている。参照データポインタ２１００には、マトリックス・キャッシュ２０００にデータを追加した場合、及びマトリックス・キャッシュ２０００のデータを参照した場合に、そのデータへのポインタが格納される。
【０１２４】
図１７に示したデータ構造とし、図５の頂点インデックスを頂点の重みのデータによりソートしておく。新たな頂点を移動処理する場合（図１３：ステップＳ３７）には、まず参照データポインタ２１００が参照される。そして、マトリックス・キャッシュ２０００内の参照データポインタ２１００で指し示されたデータが参照され、処理すべき頂点の重みと参照したデータの重みが比較される。
【０１２５】
比較の結果、２つの重みが一致する場合には、参照したデータの変換マトリックスにより、頂点の座標が変換される。比較の結果、処理すべき頂点の重みが参照したデータの重みより大きい場合には、参照したデータの次のデータが参照される。比較の結果、処理すべき頂点の重みが参照したデータの重みより小さい場合には、参照したデータの前のデータが参照される。
【０１２６】
その後、参照したデータの重みと処理すべき頂点の重みとの比較が順次行われる。処理すべき頂点の重みが参照したデータの重みより大きいとして次のデータを参照し、次のデータと比較の結果、処理すべき頂点の重みが参照したデータの重みより小さいと判断された場合には、マトリックス・キャッシュ２０００内に目的の変換マトリックスが無いと判断される。この場合、最後に参照したデータの前に、新たに計算された重みの変換マトリックスのデータが格納される。
【０１２７】
また、処理すべき頂点の重みが参照したデータの重みより大きいと判断されたが、次のデータへのポインタがｎｕｌｌである場合、マトリックス・キャッシュ２０００内に目的の変換マトリックスが無いと判断される。この場合、最後に参照したデータの次に、新たに計算された重みの変換マトリックスのデータが格納される。
【０１２８】
同様に、処理すべき頂点の重みが参照したデータの重みより小さいとして、前のデータを参照し、前のデータとの比較の結果、処理すべき頂点の重みが参照したデータの重みより大きいと判断された場合には、マトリックス・キャッシュ２０００内に目的の変換マトリックスは無いと判断される。この場合、最後に参照したデータの次に、新たに計算された重みの変換マトリックスのデータが格納される。
【０１２９】
また、処理すべき頂点の重みが参照したデータの重みより小さいと判断されたが、前のデータへのポインタがｎｕｌｌである場合、マトリックス・キャッシュ２０００内に目的の変換マトリックスのデータが無いと判断される。この場合、最後に参照したデータの前に、新たに計算された重みの変換マトリックスのデータが格納される。
【０１３０】
図１７に示したように、参照データポインタ２１００を設け、図５の頂点インデックスを頂点の重みのデータによりソートしておくことで、目的のデータを早い段階で検出することができ、処理の高速化が図れる。
【０１３１】
また、マトリックス・キャッシュ２０００内のデータ配列を重みによってソートし、前のデータと次のデータとの双方に対してデータのポインタを設けたことで、全てのデータをサーチする必要がなくなる。すなわち、データがソートされているため、最初に参照したデータの重みの比較結果から、重みの昇順若しくは降順の何れかの順番でサーチを行えばよい。その結果、サーチ処理が高速化される。
【０１３２】
以上のようにマトリックス・キャッシュを導入することにより、変換マトリックスＭの計算処理の量が削減され、処理速度が高速化される。
【０１３３】
以上述べたように、複数の頂点により形状が定められる三次元オブジェクトを変形する場合には、まず三次元オブジェクトに対応しており、複数のジョイントにより構成され、且つ複数の頂点の各々が複数のジョイントのいずれか１つに対応付けられている仮想スケルトンにおける各ジョイントの回転角をタイム・フレーム毎に取得する（ステップＳ２７）。そして、各頂点に対応し且つ取得されたジョイントの回転角を、当該頂点に予め定義された重みに従って変更し、変更された回転角に従って頂点をタイム・フレーム毎に移動する（ステップＳ３７）。
【０１３４】
頂点に予め定義された重みに従って当該頂点に対応するジョイントの回転角を変更することにより、当該頂点の回転角が求められる。頂点の回転角に従って頂点を移動する。
【０１３５】
よって、仮想三次元空間において１つの頂点について２つの位置情報を計算することなく、三次元オブジェクトを滑らかに変形することができる。特にクォータニオンを使用することにより、最短距離にて頂点の回転がなされる。
【０１３６】
また近年、より写実的なＣＧ画像を得るために、三次元オブジェクトに定義される頂点数は非常に増加している。本発明によれば１つの頂点につき一回の頂点変換で済むため、頂点数が増加しても処理量の増加量は少なくて済む。
【０１３７】
すなわち、変形後の三次元オブジェクトの滑らかさを要求しない場合であっても、形状を変形する際には各頂点に１回ずつの頂点変換は必要である。従って、本発明を適用して滑らかな形状が保たれるようにしても、頂点変換の回数は変わらない。
【０１３８】
なお、本発明を実施する場合、ジョイントの回転角と頂点に与えられた重みとに応じて、変換マトリックスを算出しなければならない。但し、変換マトリックスの算出処理は、図１５乃至図１７に示したマトリックス・キャッシュを用いることで、頂点毎に行う必要が無くなる。従って、本発明では、頂点数が増加しても、変形後の形状を滑らかにするために必要な処理の増加量を抑制することが可能である。
【０１３９】
また、上記実施の形態では、ジョイントの回転角と同じ回転軸で各頂点を回転移動させている。そのため、ジョイントから頂点までの距離を保ったまま、頂点を移動させることができる。例えば、人間の膝には骨があるため、人間を模した三次元オブジェクトの膝の部分のジョイントから膝頭の頂点までの距離は、一定の距離が保たれている必要がある。本発明を適用することで、膝の部分のジョイントの変形を行っても、膝の部分の膨らみを保ったままの変形が可能となる。
【０１４０】
（その他の実施の形態）
（１）アニメーション・データ７００では、全てのフレームについて回転角のデータが格納されていることを前提としていた。しかし、必ずしも全てのフレームについて回転角のデータが格納されている必要は無い。データの無いフレームについては、前後のフレームの回転角を補間することにより求めることができる。
【０１４１】
（２）上の実施の形態では三角形ポリゴンを前提に説明したが、本発明は、四角形以上の多角形ポリゴンであっても、頂点を移動することにより三次元オブジェクトを変形させるモデルにおいては適用することができる。
【０１４２】
（３）上の実施の形態では変換マトリックスを生成する例を示しているが、マトリックスを使用しないで処理することも可能である。但し、変換マトリックスは平行移動も同時に取り扱うことができるので有利である。
【０１４３】
（４）上の実施の形態では、重みの反映をクォータニオン及び球状線形補間を用いて行ったが、球状線形補間に変えて単なる線形補間を用いることも可能である。ここでいう単なる線形補間とは、２つのクォータニオン間の変数同士で、重みに応じた線形補間を行う処理である。単なる線形補間は球状線形補間に比べて簡単な処理で実施可能であるため、単なる線形補間を用いることにより処理が簡略化される。なお、単なる線形補間を用いたとしても、角度の変化がある程度以下に抑えられれば、三次元オブジェクトがビデオゲームの画面に不自然な形状で表示されることは無い。
【０１４４】
（５）使用するハードウエアの変更
図１は一例であって、様々な変更が可能である。通信インターフェース１１５を備えるか否かは任意である。本発明は直接サウンド処理には関係しないので、サウンド処理部１０９を備えている必要は無い。
【０１４５】
また、ＣＤ−ＲＯＭは記録媒体の一例であって、ＲＯＭのような内部メモリ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、メモリカートリッジ、フロッピーディスク、磁気ディスク、ＤＶＤ−ＲＡＭ等の他の記録媒体であってもよい。その場合にはＣＤ−ＲＯＭドライブ１１３を、対応する媒体で読み出し可能なドライブにする必要がある。
【０１４６】
さらに、以上は本発明をコンピュータ・プログラムにより実装した場合であるが、コンピュータ・プログラムと電子回路などの専用の装置の組み合せ、又は電子回路などの専用の装置のみによっても実装することは可能である。
【０１４７】
以上、本発明を実施の形態に基づいて具体的に説明したが、本発明は上記実施の形態に限定されるものではない。要旨を逸脱しない範囲で適宜変更可能である。例えば、上記実施の形態では、家庭用ゲーム機をプラットフォームとして本発明を実現した場合について述べたが、本発明は通常のコンピュータ、アーケードゲーム機などをプラットフォームとして実現しても良い。また、携帯情報端末、カーナビゲーション・システム等をプラットフォームにして実現することも考えられる。
【０１４８】
また、本発明を実現するためのプログラムやデータは、コンピュータやゲーム機に対して着脱可能なＣＤ−ＲＯＭ等の記録媒体により提供される形態に限定されない。すなわち、本発明を実現するためのプログラムやデータを、図１に示す通信インターフェース１１５、通信回線１４１を介して接続されたネットワーク１５１上の他の機器側のメモリに記録し、プログラムやデータを通信回線１４１を介して必要に応じて順次ＲＡＭ１０５に格納して使用する形態であってもよい。
【０１４９】
（表示例）
図１８に、基準姿勢における人型の三次元オブジェクトの脚の部分のポリゴン・モデルを示す。参考のため、仮想スケルトンのジョイントＪ１及びボーンＢ１乃至Ｂ３（符号は右の足のみ）を示している。図１８では、ジョイントＪ１を回転させると影響が大きく表われる部分Ａ及びＢを示しておく。部分Ａの３つの四角形ポリゴンａ１乃至ａ３、部分Ｂの５つの四角形ポリゴンｂ１乃至ｂ５の変化を見る。
【０１５０】
図１９に、本発明を使用してジョイントＪ１を回転させた場合を示す。上で述べたように、三次元オブジェクトの各頂点は、対応するジョイントの回転角を頂点に予め定義された重みによって変更することにより得られる頂点用の回転角により移動される。図１８の部分Ａ及び部分Ｂのポリゴンの各頂点はジョイントＪ１に対応しており、部分Ａは部分Ａａに、部分Ｂは部分Ｂａに移動した。
【０１５１】
部分Ａａのポリゴンａ１ｚは図１８のポリゴンａ１に、ポリゴンａ２ｚは図１８のポリゴンａ２に、ポリゴンａ３ｚは図１８のポリゴンａ３にそれぞれ対応する。ジョイントＪ１の回転に大きく影響を受けたポリゴンａ２ｚは、その面積が非常に小さくなっている。図１９では、ポリゴンａ１ｚ及びａ３ｚもそれぞれ対応するポリゴンａ１及びａ３より小さくなっている。
【０１５２】
部分Ｂａのポリゴンｂ１ｚは図１８のポリゴンｂ１に、ポリゴンｂ２ｚは図１８のポリゴンｂ２に、ポリゴンｂ３ｚは図１８のポリゴンｂ３に、ポリゴンｂ４ｚは図１８のポリゴンｂ４に、ポリゴンｂ５ｚは図１８のポリゴンｂ５にそれぞれ対応する。部分Ａａとは対照的に部分Ｂｚは引き伸ばされる部分である。ジョイントＪ１の回転に大きく影響を受けたポリゴンｂ３ｚ及びｂ４ｚは、対応するｂ３及びｂ４ｂり大きくなっている。また、ポリゴンｂ１ｚ、ｂ２ｚ及びｂ５ｚも、対応するポリゴンｂ１、ｂ２及びｂ５より大きくなっている。
【０１５３】
図１８のポリゴン・モデルを描画すると図２０のような画像を得ることができる。滑らかな三次元オブジェクトが表現できている。一方、図１９のポリゴン・モデルを描画すると図２１のような画像を得ることができる。本発明を使用して三次元オブジェクトを変形しても、図２１で分かるように、部分Ａａでポリゴンの頂点が三次元オブジェクトにめり込むことはなく、ポリゴンが大きくなりすぎたりしない。全体として三次元オブジェクトは滑らかに描画されるようになる。
【０１５４】
【発明の効果】
以上述べたように本発明により、ジョイントの回転角と頂点に定義された重みとに基づいて頂点の回転角度を算出し、算出された角度だけその頂点を回転させることで、変形後の三次元オブジェクトの形状を滑らかにすることができる。しかも、各頂点に対する頂点変換は１回しか行われず、三次元オブジェクトの頂点数が増加した場合の処理の増加量を、少なく抑えることが可能となる。
【図面の簡単な説明】
【図１】家庭用ゲーム機のブロック構成図である。
【図２】頂点座標リストの一例を示す図である。
【図３】法線ベクトル・リストの一例を示す図である。
【図４】三角形ポリゴン・リストの一例を示す図である。
【図５】頂点グループ・リストの一例を示す図である。
【図６】三次元オブジェクトと仮想スケルトンの一例を示すための模式図である。
【図７】図６における仮想スケルトンのジョイントの階層構造を示すための模式図である。
【図８】ジョイント・データの一例を示す図である。
【図９】アニメーション・データの一例を示す図である。
【図１０】本発明の動作原理を説明するための模式図である。（ａ）はジョイントを回転させる前の状態を示す。（ｂ）は全ての頂点の重みを１００％としてジョイントを回転させた場合の状態を示す。（ｃ）は特開平１０−７４２７０号公報記載の技術を用いてジョイントを回転させた場合の状態を示す。（ｄ）は本発明を用いてジョイントを回転させた場合の状態を示す。
【図１１】球状線形補間を説明するための模式図である。
【図１２】本発明の処理のメインフローを示すフローチャートである。
【図１３】本発明の三次元オブジェクト変形処理のフローチャートである。
【図１４】マトリックス・バッファの一例を示す図である。
【図１５】マトリックス・キャッシュの一例を示す図である。
【図１６】マトリックス・キャッシュの一例を示す図である。
【図１７】マトリックス・キャッシュの一例を示す図である。
【図１８】基本姿勢における三次元オブジェクトのポリゴン・モデルを示す図である。
【図１９】足を曲げた状態における三次元オブジェクトのポリゴン・モデルを示す図である。
【図２０】図１８のポリゴン・モデルを描画した場合の画像例を示す図である。
【図２１】図１９のポリゴン・モデルを描画した場合の画像例を示す図である。
【符号の説明】
１０１  家庭用ゲーム機    １０３  ＣＰＵ  １０４  ＲＯＭ
１０５  ＲＡＭ    １０７  ＨＤＤ    １０９  サウンド処理部
１１２  フレームバッファ    １１１  グラフィックス処理部
１１３  ＣＤ−ＲＯＭドライブ    １１５  通信インターフェース
１１７  インターフェース部    １１９  内部バス    １２１  ＴＶセット
１２０  表示画面    １３１  ＣＤ−ＲＯＭ    １４１  通信媒体
１５１  ネットワーク    １６１  キーパッド    １７１  メモリカード
２００  頂点座標リスト    ３００  法線ベクトル・リスト
４００  三角形ポリゴン・リスト    ５００  頂点グループ・リスト
６００  ジョイント・データ    ７００  アニメーション・データ
８００  マトリックス・バッファ    ８５０  頂点バッファ
８７０  法線ベクトル・バッファ    １１００  フレーム・カウンタ
９００，１０００，２０００  マトリックス・キャッシュ
【図１】
0003568861.tif 000004
【図２】
0003568861.tif 000005
【図３】
0003568861.tif 000006
【図４】
0003568861.tif 000007
【図５】
0003568861.tif 000008
【図６】
0003568861.tif 000009
【図７】
0003568861.tif 000010
【図８】
0003568861.tif 000011
【図９】
0003568861.tif 000012
【図１０】
0003568861.tif 000013
【図１１】
0003568861.tif 000014
【図１２】
0003568861.tif 000015
【図１３】
0003568861.tif 000016
【図１４】
0003568861.tif 000017
【図１５】
0003568861.tif 000018
【図１６】
0003568861.tif 000019
【図１７】
0003568861.tif 000020
【図１８】
0003568861.tif 000021
【図１９】
0003568861.tif 000022
【図２０】
0003568861.tif 000023
【図２１】
0003568861.tif 000024