(57)【特許請求の範囲】
【請求項１】
座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000084
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を行う３次元画像の描画を行う情報処理装置であって、
アフィン変換の行列
0004046233.tif 000085
に
0004046233.tif 000086
をかけた行列
0004046233.tif 000087
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが格納されたメモリと、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、前記メモリより、行列A’と、行列(t1,t2,t3)tとを読み出す手段と、
前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する乗算手段と、
前記乗算結果に定数λ/2を加算する加算手段と、
前記定数λ/2が加算された乗算結果をｎ桁右シフトするシフト手段と、
前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する加算手段と
を有することを特徴とする情報処理装置。
【請求項２】
0004046233.tif 000088
で表せられる定数μが、y座標の変化量に関連付けられて格納されたメモリと、
y座標に対するx座標の変化量、
0004046233.tif 000089
を演算する際、
前記y座標の変化量に対応するμを前記メモリより読み出す手段と、
前記μと（ｘ２−ｙ１）とを乗算する乗算手段と、
前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力するシフト手段と
を更に有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000090
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を行う情報処理装置の３次元画像の描画処理方法であって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000091
に
0004046233.tif 000092
をかけた行列
0004046233.tif 000093
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出すステップと、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算するステップと、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトするステップと、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力するステップと
を有することを特徴とする情報処理装置の描画処理方法。
【請求項４】
情報処理装置の記憶手段には、
0004046233.tif 000094
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000095
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出すステップと、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算するステップと、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力するステップと
を更に有することを特徴とする請求項３に記載の情報処理装置の描画処理方法。
【請求項５】
座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000096
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を、情報処理装置に行わせるプログラムであって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000097
に
0004046233.tif 000098
をかけた行列
0004046233.tif 000099
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記プログラムは、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出す処理と、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する処理と、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトする処理と、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する処理と
を情報処理装置に実行させることを特徴とするプログラム。
【請求項６】
情報処理装置の記憶手段には、
0004046233.tif 000100
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
前記プログラムは、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000101
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出す処理と、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算する処理と、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力する処理と
を更に情報処理装置に実行させることを特徴とする請求項５に記載のプログラム。
【請求項７】
座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000102
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を、情報処理装置に行わせるプログラムが記録された、情報処理装置が読み取り可能な記録媒体であって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000103
に
0004046233.tif 000104
をかけた行列
0004046233.tif 000105
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記プログラムは、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出す処理と、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する処理と、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトする処理と、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する処理と
を情報処理装置に実行させるプログラムが格納されたことを特徴とする記録媒体。
【請求項８】
情報処理装置の記憶手段には、
0004046233.tif 000106
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
前記プログラムは、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000107
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出す処理と、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算する処理と、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力する処理と
を更に情報処理装置に実行させることを特徴とする請求項７に記載の記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は３次元画像の描画の技術に関し、特に３次元画像の描画の処理時に行われるジオメトリ演算や除算の処理を軽減し、ＦＰＵ（浮動小数点演算ユニット）を持たない情報処理装置や、ＣＰＵの処理能力が低い情報処理装置であっても３次元グラフィクの描画を可能とする技術に関する。
【背景技術】
【０００２】
３次元グラフィクを描画する場合、情報処理端末は、
（１）３次元の物体をずらしたりする座標変換演算（Transformation）、
（２）物体に光源（例えば太陽など）から光が当たっていると考えて、日向になっている部分と日陰になっている部分とを計算する光源計算処理（Lighting）
（３）物体をドットと呼ばれるカラムに分割する処理（ラスタライズ）
（４）そのカラムにテクスチャー（模様）を張り込んでいく（テクスチャーマッピング）
等の処理を行う。
【０００３】
通常、情報処理装置本体のＣＰＵは、（１）と（２）とのいわゆるジオメトリ演算という作業を担当し、ＣＰＵのＦＰＵ（浮動小数点演算ユニット）を利用して処理している。
【０００４】
更に、（３）と（４）とのいわゆるラスタライズの処理は、通常、３Ｄグラフィックスアクセラレータが行っている。
【０００５】
しかしながら、（１）と（２）とのいわゆるジオメトリ演算という作業はＣＰＵのＦＰＵ（浮動小数点演算ユニット）を利用して行なわれていが、ＦＰＵはジオメトリ演算だけでなく、浮動小数点一般を計算するために設計されているほか、ＣＰＵは他の処理も行ったりしており、必ずしも３次元のグラフィクを描画する処理に適したものではない。
【０００６】
そこで、そのジオメトリ演算をグラフィックスチップで行えるように設計した（つまりジオメトリエンジンを内蔵）３Ｄグラフィックスアクセラレータも登場しており、ＣＰＵの負荷率を下げる工夫がされているほか、何よりもジオメトリ演算の性能をＣＰＵで行う場合に比べて大幅に向上させることが可能、つまり３Ｄの描画性能を向上させることを可能としている。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
しかしながら、３Ｄグラフィックスアクセラレータは高価なのものであり、全ての情報処理装置が備えている訳ではない。
【０００８】
更に、情報処理装置の中には、例えば携帯電話や、ＰＤＡ（Personal Digital(Data) Assistants）のように３Ｄグラフィックスアクセラレータどころか、ＦＰＵ（浮動小数点演算ユニット）も備えていないものもある。
【０００９】
このような情報処理装置では、一般にＣＰＵの能力も低く、３Ｄグラフィックスは無理とされていた。
【００１０】
更に、除算処理は乗算処理に比べてたいへん低速であり、高速に演算処理を行う為には、除算をなるべく減らすことが好ましい。
【００１１】
そこで、本発明は、３次元グラフィクの描画の処理時に行われるジオメトリ演算において、整数演算処理を行うことによって、ＦＰＵ（浮動小数点演算ユニット）を持たない情報処理装置であっても３次元グラフィクの描画を可能とする技術を提供することを目的としている。
【００１２】
また、本発明は、ラスタライズ処理の際、除算を行わずラスタライズ処理を行うことによって、処理能力が低いＣＰＵを持つ情報処理装置であっても、３次元グラフィクの描画を高速に可能とする技術を提供することを目的としている。
【課題を解決するための手段】
【００１３】
上記目的を達成する第１の発明は、座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000002
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を行う３次元画像の描画を行う情報処理装置であって、
アフィン変換の行列
0004046233.tif 000003
に
0004046233.tif 000004
をかけた行列
0004046233.tif 000005
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが格納されたメモリと、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、前記メモリより、行列A’と、行列(t1,t2,t3)tとを読み出す手段と、
前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する乗算手段と、
前記乗算結果に定数λ/2を加算する加算手段と、
前記定数λ/2が加算された乗算結果をｎ桁右シフトするシフト手段と、
前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する加算手段と
を有することを特徴とする。
【００１４】
上記目的を達成する第２の発明は、上記第１の発明において、
0004046233.tif 000006
で表せられる定数μが、y座標の変化量に関連付けられて格納されたメモリと、
y座標に対するx座標の変化量、
0004046233.tif 000007
を演算する際、
前記y座標の変化量に対応するμを前記メモリより読み出す手段と、
前記μと（ｘ２−ｙ１）とを乗算する乗算手段と、
前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力するシフト手段と
を更に有することを特徴とする。
【００１５】
上記目的を達成する第３の発明は、座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000008
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を行う情報処理装置の３次元画像の描画処理方法であって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000009
に
0004046233.tif 000010
をかけた行列
0004046233.tif 000011
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出すステップと、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算するステップと、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトするステップと、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力するステップと
を有することを特徴とする。
【００１６】
上記目的を達成する第４の発明は、上記第３の発明において、情報処理装置の記憶手段には、
0004046233.tif 000012
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000013
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出すステップと、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算するステップと、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力するステップと
を更に有することを特徴とする。
【００１７】
上記目的を達成する第５の発明は、座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000014
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を、情報処理装置に行わせるプログラムであって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000015
に
0004046233.tif 000016
をかけた行列
0004046233.tif 000017
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記プログラムは、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出す処理と、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する処理と、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトする処理と、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する処理と
を情報処理装置に実行させることを特徴とする。
【００１８】
上記目的を達成する第６の発明は、上記第５の発明において、情報処理装置の記憶手段には、
0004046233.tif 000018
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
前記プログラムは、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000019
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出す処理と、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算する処理と、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力する処理と
を更に情報処理装置に実行させることを特徴とする。
【００１９】
上記目的を達成する第７の発明は、座標値が整数に限定され、座標(x,y,z)tを、
0004046233.tif 000020
で表現されるアフィン変換により、座標(x’,y’,z’)tに変換処理を、情報処理装置に行わせるプログラムが記録された、情報処理装置が読み取り可能な記録媒体であって、
情報処理装置の記憶手段には、アフィン変換の行列
0004046233.tif 000021
に
0004046233.tif 000022
をかけた行列
0004046233.tif 000023
と、行列(t1,t2,t3)tと、形状データ(x,y,z)tとが記憶されており、
前記プログラムは、
前記形状データの座標(x,y,z)tを、行列A及び行列(t1,t2,t3)tとのアフィン変換により、座標(x’,y’,z’)tに変換する際、形状データの座標(x,y,z)tと、行列A’と、行列(t1,t2,t3)tとを、前記記憶手段から読み出す処理と、
情報処理装置が、前記読み出された行列A’と前記形状データの座標(x,y,z)tとを乗算する処理と、
情報処理装置が、前記乗算結果に定数λ/2を加算するステップと、
情報処理装置が、前記定数λ/2が加算された乗算結果をｎ桁右シフトする処理と、
情報処理装置が、前記シフトされた結果に行列(t1,t2,t3)tを加算して、座標(x’,y’,z’)tを出力する処理と
を情報処理装置に実行させるプログラムが格納されたことを特徴とする。
【００２０】
上記目的を達成する第８の発明は、上記第７の発明において、情報処理装置の記憶手段には、
0004046233.tif 000024
で表せられる定数μが、y座標の変化量に関連付けられて記憶されており、
前記プログラムは、
情報処理装置が、y座標に対するx座標の変化量、
0004046233.tif 000025
を演算する際、前記y座標の変化量に対応するμを、前記記憶手段から読み出す処理と、
情報処理装置が、前記μと（ｘ２−ｙ１）とを乗算する処理と、
情報処理装置が、前記乗算結果を、ｎ桁右シフトし、その結果をΔxとして出力する処理と
を更に情報処理装置に実行させることを特徴とする。
【発明の効果】
【００２１】
本発明は、３次元画像の描画の演算処理の際、整数の範囲で演算処理が行えるので、携帯電話や、ＰＤＡ（Personal Digital(Data) Assistants）のようにＦＰＵ（浮動小数点演算ユニット）も備えていないものであっても、３次元画像が扱える。
【００２２】
また、演算処理の際、処理負荷の高い除算を行わないようにしているので、ＣＰＵの能力が低い情報処理装置であっても、スムーズな描画処理が行える。
【発明を実施するための最良の形態】
【００２３】
本発明の実施するための最良の形態を説明する。
【００２４】
まず、本発明の特徴である情報処理装置を用いた整数によるジオメトリ演算と、除算を使用しない三角形ラスタライズとについて説明する。
【００２５】
＜整数によるジオメトリ演算＞
１．アフィン変換による座標変換
座標(x,y,z)tから座標(x’,y’,z’)tへのアフィン変換を、
0004046233.tif 000026
0004046233.tif 000027
の形で表すとき、Ｃ言語的な数値演算で、x’,y’,z’ を求める場合、
0004046233.tif 000028
のようになる。但し、全ての数値型が無限の範囲と精度とをもっているものとする。
【００２６】
有限範囲の整数で座標計算する場合、計算精度と演算のオーバーフローとが問題となる。
【００２７】
オーバーフローに関しては、扱う座標の範囲を制限すれば、問題とならないが、計算精度は絶対値の小さい実数を整数に丸めるときに（小数を含む数値などで、必要とする右端の位 (または桁) より 一つ下の位 (または桁) の値を四捨五入等して、数値を短縮すること。四捨五入以外にも切り上げや切り捨てなどの場合もありうる。）、相対誤差が大きくなる。特に、行列Aの成分は絶対値が１以下の場合が非常に多く、その数値を整数に丸めた場合は期待する結果から大きくずれてしまう。
【００２８】
そこで、行列Aの成分を整数に丸めるとき、相対誤差をなるべく少なくするために、予めλ（≠０）を行列Aの成分に掛けておく。
0004046233.tif 000029
この行列A’で座標変換するときに
0004046233.tif 000030
のように計算する。
【００２９】
Ｃ言語的な数値演算で、x’,y’,z’ を求める場合、
0004046233.tif 000031
のようになる。但し、すべての数値型は整数である。
【００３０】
このような計算でも、整数計算となり、浮動小数点演算を行う必要はないが、高速化のために実行時の整数除算を避けるためλを
0004046233.tif 000032
に限定し、λ’=log2λとして、
0004046233.tif 000033
のように算術右シフトで除算とほぼ同じ演算を行う。
【００３１】
また、算術右シフトを整数除算として利用する場合、丸めは−∞方向になるので、
0004046233.tif 000034
のように算術右シフトを行う前に定数λ/2を加えて誤差を修正する。
【００３２】
具体的な例で説明すると、例えば、座標(111,222,333)tの点をアフィン変換する場合を考える。
【００３３】
上記の式２の行列A及びt(t1,t2,t3)tを、
0004046233.tif 000035
0004046233.tif 000036
とすると、
実数で計算した場合の式２の結果は、
0004046233.tif 000037
となる。
【００３４】
ここで、上述した如く、本発明のアフィン変換を用いると、λ=4096(212)とした場合、行列A’は、
0004046233.tif 000038
となる。
【００３５】
この行列A’と、行列t(t1,t2,t3)tとを使ったアフィン変換を、Ｃ言語の式で表すと、
int x,y,z;
x=((3646*111+-1316*222+1323*333+4096/2)>>12)+856;
y=((1580*111+3723*222+-649*333+4096/2)>>12)+387;
z=((-994*111+1088*222+3822*333+4096/2)>>12)+973;
となる。
【００３６】
この計算結果は、(991,
579, 1316)tとなり、上記の実数の演算結果とほぼ同じ結果となる。
【００３７】
情報処理装置の実際処理では、行列Aにλを乗算した行列A’と、行列t(t1,t2,t3)tとが、情報処理装置のメモリにパラメータとして格納されており、アフィン変換による座標変換をする際に、該当する行列Aに対応する行列A’と、行列t(t1,t2,t3)tとをメモリから読み出し、読み出した行列A’基づいて、各要素毎に演算が行われる。そして、その結果に定数λ/2を加えたものを、定数λ’回右シフトを行い、その結果に行列t(t1,t2,t3)tを加えて、座標を算出する。
２．アフィン変換の合成
２つのアフィン変換f,g（変換パラメータ）をそれぞれ、
0004046233.tif 000039
とする。この二つの変換の合成
0004046233.tif 000040
は、
0004046233.tif 000041
である。A’=λA、B’=λBのとき、
0004046233.tif 000042
である。
0004046233.tif 000043
0004046233.tif 000044
とすると、式８は、
0004046233.tif 000045
となる。
【００３８】
この式１１の右辺と式４の右辺は同じ形である。
0004046233.tif 000046
0004046233.tif 000047
0004046233.tif 000048
として、Ｃ言語的な数値演算でMとtとの成分を求める場合、
for ( i=1;
i <=3; i++ ) { for ( j=1; j<=3; j++ ) 
mij=(bi1* a1j+ bi2* a2j+ bi3* a3j +λ/ 2) /λ;
ti=(bi1*u1 + bi2* u2+ bi3* u3 )/λ+vi ; }
となる。λを
0004046233.tif 000049
に限定し、λ’=log2λとして全ての整数型を整数で計算するようにすると、
for ( i=1;i <=3; i++ ) { for ( j=1; j<=3; j++ ) 
mij=(bi1* a1j+ bi2* a2j+ bi3* a3j +λ/ 2) >>λ’ ;
ti=((bi1* u1+ bi2* u2+ bi3* u3 +λ/ 2) >>λ’)+vi ; }
となる。
【００３９】
この方法により、事前にλを掛けたアフィン変換同士の合成ができる。
【００４０】
具体的な例で説明すると、例えば、
0004046233.tif 000050
0004046233.tif 000051
0004046233.tif 000052
0004046233.tif 000053
とし、λ=4096とすると、
0004046233.tif 000054
0004046233.tif 000055
となる。
λAとλBとの要素を最近整数値に丸めた行列は、
0004046233.tif 000056
0004046233.tif 000057
である。
【００４１】
従って、上述した数式により、行列Mと行列tとを求めると、
0004046233.tif 000058
0004046233.tif 000059
となる。
【００４２】
このように、上記の如く計算した
0004046233.tif 000060
0004046233.tif 000061
と、ほぼ同様な値を得ることができる。
＜除算を使用しない三角形ラスタライズ＞
直線上のx座標の変化量を求める場合、２次元平面上の点P1の座標を(x1,y1)、点P2の座標を(x2,y2)とする。y1≠y2のとき、P1とP2とをとおる直線のy座標に対するx座標の変化量は、
0004046233.tif 000062
である。
0004046233.tif 000063
とし、
0004046233.tif 000064
をＣ言語的な数値演算で
求める場合、
0004046233.tif 000065
のようになる。
【００４３】
そして、
0004046233.tif 000066
としたときは
0004046233.tif 000067
のように乗算の形式になる。
【００４４】
整数のみで計算する場合、|λ|が十分に大きく|y2-y1|がある程度小さければ、丸めによる相対誤差が小さくなる。
【００４５】
そこで、λを定数にして、y座標の範囲を制限すれば、μは予め用意された少ない配列から得ることができる。すなわち、μを|y2-y1|に対応させて、情報処理装置のメモリに予め格納しておく。そして、|y2-y1|をインデックスとして、μを読み出して、
0004046233.tif 000068
を計算すれば、乗算だけでほぼΔxと同じ値のΔx’を求めることができる。
【００４６】
また、λを
0004046233.tif 000069
に制限すれば、算術右シフトによって、Δxを算出することができる。
【００４７】
よって、除算を一切使わずにx座標の変化量が求まる。
【００４８】
また、テクスチャー座標も同じ理由により、除算は必要ない。
【００４９】
具体的な例として、λ=65536として、座標(10,20)の始点P1と座標(85,120)の始点P2との線分の例を説明する。
【００５０】
この線分のy座標に対するx座標の変化量は、
0004046233.tif 000070
となり、Δx’=λx=49152.0となる。
【００５１】
Δx’を整数のみで除算を使用しないで計算する場合、上述したように120-20=100をインデックスとして、対応するμをメモリから読み出してくる。
【００５２】
この場合、
0004046233.tif 000071
とすると、
0004046233.tif 000072
となり、除算を使用したΔx’=λx=49152.0とほぼ同じ値を得ることができる。
【００５３】
次に、上述の方法を携帯端末等に用いた場合について説明する。
【００５４】
図１は携帯端末のブロック図である。
【００５５】
図１中、１は３次元グラフィクを表示するディスプレイであり、２はＦＰＵ（浮動小数点演算ユニット）を持たないＣＰＵ等で構成された演算手段である制御部、３はプログラムやデータが格納されたメモリ部である。
【００５６】
尚、メモリ部３には、変換パラメータ（上述した行列A’と、行列t(t1,t2,t3)t）が格納された変換パラメータテーブル４と、上述した|y2-y1|をインデックスとしてμが格納された逆数テーブル５とが格納されている。
【００５７】
以下の本説明の３次元グラフィクの描画では、物体をすべて多角形の平面の組み合わせで表現する。そして、その多角形のことをポリゴンと呼ぶ。３次元空間にある物体(ポリゴン)は、X, Y, Zの3つの座標値を持っており、この座標を動かすことで、物体の位置や向きを変更することができる。さらに、３次元座標で表現されるものを、最終的に２次元のスクリーンに表示させる為、スクリーン座標系への変換が行われる。
【００５８】
このような、一連の座標変換、透視変換、光源計算などの処理（演算）は、ジオメトリ演算と呼ばれる。そして、計算によって変換されたポリゴンは、最終的にフレームバッファに書き込まれ、描画が行われる。
【００５９】
通常、ジオメトリ演算という処理はＣＰＵのＦＰＵ（浮動小数点演算ユニット）を利用して行なわれていが、ＦＰＵはジオメトリ演算だけでなく、浮動小数点一般を計算するために設計されている。更に、携帯電話に代表される携帯端末の機器では、高価になるという理由で、ＦＰＵ（浮動小数点演算ユニット）を持たないものも多い。
【００６０】
そこで、携帯端末のようなＦＰＵ（浮動小数点演算ユニット）を持たないＣＰＵの情報処理装置でも、ジオメトリ演算を可能とする為、本発明では制御部３が整数によるジオメトリ演算を行う。
【００６１】
また、物体をドットに分割するラスタライズについても、３Ｄグラフィックスアクセラレータのない携帯端末では、処理負荷が増大する。
【００６２】
そこで、本発明では、処理負荷を軽減する為に、制御部３が除算を使用しないで三角形をラスタライズする。
【００６３】
次に、制御部３が行う、上述した演算を用いた３次元グラフィクの描画動作を説明する。
【００６４】
図２は３次元グラフィクの基本的な描画動作を示すフローチャートである。
【００６５】
まず、描画先の仮想フレームバッファの情報を設定する（Ｓｔｅｐ  １００）。
【００６６】
次に、モデルオブジェクトに、メモリ部３から幾何学的座標データである形状データを読み込む（Ｓｔｅｐ  １０１）。
【００６７】
ここで読み込まれる形状データは、頂点座標列、ポリゴン列及びセグメント列の情報が含まれる。また、セグメントのデータには、基本姿勢用の変換パラメータ、所属頂点群及び親セグメントのＩＤ（識別情報）を含む。
【００６８】
尚、読み出される変換パラメータは、基本の行列Aに
0004046233.tif 000073
を乗算した行列A’と行列t(t1,t2,t3)tとであり、行列A’と行列t(t1,t2,t3)tとは、変換パラメータテーブル４から読み出される。
【００６９】
続いて、形状データに対応するテクスチャーデータ、例えば質感等のデータを読み込む（Ｓｔｅｐ  １０２）。
【００７０】
そして、モデル座標系から視点座標系への変換パラメータを設定し（Ｓｔｅｐ  １０３）、視点座標系からスクリーン座標系への変換パラメータを設定する（Ｓｔｅｐ  １０４）。
【００７１】
仮想フレームバッファに２次元の背景を描画する（Ｓｔｅｐ  １０５）。
【００７２】
仮想フレームバッファにモデルオブジェクトを描画する（Ｓｔｅｐ  １０６）。
【００７３】
最後に、仮想フレームバッファの内容を実際の画面に表示する（Ｓｔｅｐ  １０７）。
【００７４】
そして、Ｓｔｅｐ  １０３からＳｔｅｐ  １０７を繰り返すことによって３次元グラフィクが描画されることになる。
【００７５】
続いて、本発明の特徴である演算が用いられるモデルオブジェクトを制御部３が描画するＳｔｅｐ  １０６について、更に詳細に説明する。
【００７６】
図３はモデルオブジェクトを描画のステップであるＳｔｅｐ  １０６の動作を更に詳細に示すフローチャートである。
【００７７】
まず、モデルの頂点座標をローカル座標系からスクリーン座標系に変換する（Ｓｔｅｐ  ２００）。
【００７８】
ここで、モデルの構造について説明する。通常、モデルは内部に複数のセグメントを持ち，各セグメントは複数の頂点を持っている。それらの頂点はセグメント座標系での座標値を持っている。セグメントは複数の子セグメントを持つことができ，セグメントに含まれる頂点の座標を親セグメント座標系に変換するための変換パラメータを持つ。最上位のセグメントが持つ変換パラメータは，そのセグメントが含む頂点の座標をモデル座標系に変換するための値になる。また、基本姿勢用の変換パラメータの情報も有する。
【００７９】
そこで、セグメント座標系での座標値を持つモデルの頂点座標をローカル座標系からスクリーン座標系に変換するため、まず、セグメント座標系からモデル座標系への変換を行う。
【００８０】
セグメント座標系からモデル座標系への変換パラメータの算出は，上述した整数によるジオメトリ演算によるアフィン変換の合成により行われる。
【００８１】
親セグメントを持つセグメントの場合は，セグメントが持つ変換パラメータfと、親セグメントのセグメント座標系からモデル座標系への変換パラメータgとを合成して，セグメント座標系からモデル座標系への変換パラメータ
0004046233.tif 000074
を生成する。
【００８２】
この合成に際し、上述したアフィン変換の合成の手法が用いられる。
【００８３】
尚、親セグメントを持たないセグメントの場合は、セグメントが持つ変換パラメータfとすると、セグメント座標系からモデル座標系への変換パラメータは、h=fになる。
【００８４】
続いて、モデル座標系からスクリーン座標系への変換について、説明する。
【００８５】
モデル座標系からスクリーン座標系への変換パラメータも同じ方法で計算する。
【００８６】
モデル座標系から視点座標系への変換パラメータをpとし，視点座標系からスクリーン座標系への変換パラメータをqとすると，モデル座標系からスクリーン座標系への変換パラメータは
0004046233.tif 000075
となる。
【００８７】
最後に、上述の如く算出された、セグメント座標系からモデル座標系への変換パラメータhと、モデル座標系からスクリーン座標系への変換パラメータrとに基づいて、セグメント座標系からスクリーン座標系への変換パラメータsを算出する。
【００８８】
セグメント座標系からスクリーン座標系への変換パラメータsは、上述の合成と同様に、
0004046233.tif 000076
となる。hは各セグメント毎に計算する必要があるが、rは1体のモデルの計算では１度しか計算する必要がない。
【００８９】
このように算出された変換パラメータsを使ってセグメント座標系の頂点座標をスクリーン座標系の座標に変換する。
【００９０】
座標変換の演算は、上述した整数によるジオメトリ演算のアフィン変換により座標変換により行う。
【００９１】
すなわち、セグメント座標系の頂点座標(x,y,z)tを、変換パラメータsを使ってスクリーン座標系の座標(x’,y’,z’)tに変換する。
【００９２】
続いて、スクリーン空間で裏面のポリゴンを処理対象から外す（Ｓｔｅｐ  ２０１）。
【００９３】
処理対象のポリゴンを視点座標系のＺ値（奥行き）でソートする（Ｓｔｅｐ  ２０２）。
【００９４】
最後に、スクリーン座標で仮想フレームバッファにポリゴンを描画する（Ｓｔｅｐ  ２０３）。
【００９５】
本ステップを更に詳細に説明すると、まず、ここでは描画領域に三角形が表示される可能性をチェックする。三角形が完全に描画領域の外にある場合は以降の描画処理をスキップする。
【００９６】
そして、三角形を走査するための数値を事前に計算する。この計算は、主に三角形の稜線座標やテクスチャー座標などの変化量を計算する。この変化量は、上述した除算を使用しない三角形ラスタライズの演算により行われる。
【００９７】
三角形の走査は，加算やビットシフトなどの単純操作を繰り返し、仮想フレームバッファにピクセル値を書き込む。
【００９８】
具体的な演算の方法としては、直線上のx座標の変化量を求める場合、２次元平面上の点P1の座標を(x1,y1)、点P2の座標を(x2,y2)とする。y1≠y2のとき、P1とP2とをとおる直線のy座標に対するx座標の変化量は、上述した通り、
0004046233.tif 000077
である。
0004046233.tif 000078
とし、
0004046233.tif 000079
をＣ言語的な数値演算で求める場合、
0004046233.tif 000080
のようになる。
【００９９】
そして、
0004046233.tif 000081
としたときは
0004046233.tif 000082
のように乗算の形式になる。
【０１００】
整数のみで計算する場合、|λ|が十分に大きく|y2-y1|がある程度小さければ、丸めによる相対誤差が小さくなる。
【０１０１】
そこで、λを定数にして、y座標の範囲を制限すれば、μは少ない配列から得ることができる。
【０１０２】
そこで、|y2-y1|をインデックスとしたμの値を、メモリ部３の逆数テーブル５に予め格納しておく。そして、|y2-y1|に対応するμを逆数テーブル５から読み出し、このμと(x2-x1)とを除算することにより、Δx’を算出する。
【０１０３】
そして、処理の高速化のため、Δx’で必要な演算を行っていき、仮想フレームバッファにピクセル値を書き込む際にλで除算する。
【０１０４】
また、除算の段階で、λを
0004046233.tif 000083
としてあれば、算術右シフトによって、Δxを算出することができ、除算を使わずにx座標の変化量が求まることが可能となる。
【０１０５】
尚、テクスチャー座標も同様な処理が可能である。
【０１０６】
次に、本発明の実際の具体例として、制御部３で実行されるＣ言語で記載されたプログラムを説明する。
【０１０７】
まず、整数によるジオメトリ演算のプログラムを以下に記す。
【０１０８】
以下は、メモリに記憶されている、変換パラメータ、すなわち行列A’と行列(t1,t2,t3)tの例である。
/** 整数によるジオメトリ演算
*
* 
λ = 4096 とする
*/
public class Atrans3i {
public int  m00;    // a’11に相当
public int  m01;    // a’12に相当
public int  m02;    // a’13に相当
public int  m03;    // t’1に相当
public int  m10;    // a’21に相当
public int  m11;    // a’22に相当
public int  m12;    // a’23に相当
public int  m13;    // t’2に相当
public int  m20;    // a’31に相当
public int  m21;    // a’32に相当
public int  m22;    // a’33に相当
public int  m23;    // t’3に相当
ここで、public int  m00からpublicint  m23は、コメントにあるようにアフィン変換の行列A’と、行列(t1,t2,t3)tの各要素に相当する。また、λ = 4096である。
【０１０９】
次に、座標変換について以下に示す。
/** 座標変換
*
*  @param src 変換元の点
*  @param dst 変換結果の点
*/
public void transPoint( Vec3i src, Vec3i dst ) {
int x = ((m00 * src.x + m01 * src.y + m02 * src.z + 2048) >> 12) + m03;
int y = ((m10 * src.x + m11 * src.y + m12 * src.z + 2048) >> 12) + m13;
int z = ((m20 * src.x + m21 * src.y + m22 * src.z + 2048) >> 12) + m23;
dst.x = x; dst.y = y; dst.z = z;
return;
}
ここで、@param srcは上記の式２で示される座標(x,y,z)tに相当し、@param dstは上記の式２で示される座標(x’,y’,z’)tに相当する。
【０１１０】
次に、アフィン変換の合成について以下に示す。
/** アフィン変換の合成
*
*  @param t1 左辺のアフィン変換
*  @param t2 右辺のアフィン変換
*/
public void multiply( Atrans3i t1, Atrans3i t2 ) {
int a00 = (t1.m00 * t2.m00 + t1.m01 * t2.m10 + t1.m02 * t2.m20 + 2048) >> 12;
int a01 = (t1.m00 * t2.m01 + t1.m01 * t2.m11 + t1.m02 * t2.m21 + 2048) >> 12;
int a02 = (t1.m00 * t2.m02 + t1.m01 * t2.m12 + t1.m02 * t2.m22 + 2048) >> 12;
int a03 = ((t1.m00 * t2.m03 + t1.m01 * t2.m13 + t1.m02 * t2.m23 + 2048) >> 12) + t1.m03;
int a10 = (t1.m10 * t2.m00 + t1.m11 * t2.m10 + t1.m12 * t2.m20 + 2048) >> 12;
int a11 = (t1.m10 * t2.m01 + t1.m11 * t2.m11 + t1.m12 * t2.m21 + 2048) >> 12;
int a12 = (t1.m10 * t2.m02 + t1.m11 * t2.m12 + t1.m12 * t2.m22 + 2048) >> 12;
int a13 = ((t1.m10 * t2.m03 + t1.m11 * t2.m13 + t1.m12 * t2.m23 + 2048) >>12) + t1.m13;
int a20 = (t1.m20 * t2.m00 + t1.m21 * t2.m10 + t1.m22 * t2.m20 + 2048) >> 12;
int a21 = (t1.m20 * t2.m01 + t1.m21 * t2.m11 + t1.m22 * t2.m21 + 2048) >> 12;
int a22 = (t1.m20 * t2.m02 + t1.m21 * t2.m12 + t1.m22 * t2.m22 + 2048) >> 12;
int a23 = ((t1.m20 * t2.m03 + t1.m21 * t2.m13 + t1.m22 * t2.m23 + 2048) >> 12) + t1.m23;
m00 = a00; m01 = a01; m02 = a02; m03 = a03;
m10 = a10; m11 = a11; m12 = a12; m13 = a13;
m20 = a20; m21 = a21; m22 = a22; m23 = a23;
return;
}
}
次に、ポリゴン描画について示す。
/** ポリゴン描画
*
* λ = 65536 とする
*/
public class Polydraw {
/** ポリゴン頂点情報 */
static final class Vertex {
int  x;     // ピクセルX座標
int  y;     // ピクセルY座標
int  u;     // テクセルU座標
int  v;     // テクセルV座標
}
// 内部定数
private final static int SFT       = 16;
private final static int TEXHMASK  = 0x7F0000;
private final static int TEXWMASK  = 0x7F;
private final static int TEXPSHIFT = 0x09;
// μ−１のテーブル
private static final short _inverse_tbl[] = {
0x0000, (short)0xffff, 0x7fff, 0x5554, 0x3fff, 0x3332, 0x2aa9, 0x2491,
0x1fff, 0x1c70, 0x1998, 0x1744, 0x1554, 0x13b0, 0x1248, 0x1110,
0x0fff, 0x0f0e, 0x0e37, 0x0d78, 0x0ccb, 0x0c2f, 0x0ba1, 0x0b20,
0x0aa9, 0x0a3c, 0x09d7, 0x097a, 0x0923, 0x08d2, 0x0887, 0x0841,
0x07ff, 0x07c0, 0x0786, 0x074f, 0x071b, 0x06ea, 0x06bb, 0x068f,
0x0665, 0x063d, 0x0617, 0x05f3, 0x05d0, 0x05af, 0x058f, 0x0571,
0x0554, 0x0538, 0x051d, 0x0504, 0x04eb, 0x04d3, 0x04bc, 0x04a6,
0x0491, 0x047c, 0x0468, 0x0455, 0x0443, 0x0431, 0x0420, 0x040f,
0x03ff, 0x03ef, 0x03df, 0x03d1, 0x03c2, 0x03b4, 0x03a7, 0x039a,
0x038d, 0x0380, 0x0374, 0x0368, 0x035d, 0x0352, 0x0347, 0x033c,
0x0332, 0x0328, 0x031e, 0x0314, 0x030b, 0x0302, 0x02f9, 0x02f0,
0x02e7, 0x02df, 0x02d7, 0x02cf, 0x02c7, 0x02bf, 0x02b8, 0x02b0,
0x02a9, 0x02a2, 0x029b, 0x0294, 0x028e, 0x0287, 0x0281, 0x027b,
0x0275, 0x026f, 0x0269, 0x0263, 0x025d, 0x0258, 0x0252, 0x024d,
0x0248, 0x0242, 0x023d, 0x0238, 0x0233, 0x022f, 0x022a, 0x0225,
0x0221, 0x021c, 0x0218, 0x0213, 0x020f, 0x020b, 0x0207, 0x0203
};
尚、上記テーブルは、上述したμの値の逆数テーブル５に相当するものであるが、メモリの記憶容量節約の観点から、μ−１としてある。そして、|y2-y1|の大きさの順に並んでいる。
//仮想フレームバッファ情報
private byte scr_image[];// 仮想フレームバッファの先頭アドレス
private int  scr_width; // フレームバッファの横ピクセル数
private int  scr_height; // フレームバッファの縦ピクセル数
private int  scr_pitch; // スキャンラインストライド
private int  scr_offset; // アドレスオフセット
// テクスチャーイメージ情報
private byte tex_image[]; // テクセルデータの先頭アドレス
private Texture texture;    // テクスチャー
private int  tex_width;     // テクスチャーの幅
private int  tex_height;    // テクスチャーの高さ
// クリップ情報
private int  clip_left;     // 左クリップ位置
private int  clip_top;      // 上クリップ位置
private int  clip_right;    // 右クリップ位置
private int  clip_bottom;   // 下クリップ位置
/** 三角形を描画 */
void drawTriangle( Polydraw.Vertex v0, Polydraw.Vertex v1, Polydraw.Vertex v2 ) {
/* クリッピング (コード省略) */
boolean inside;
/* ３点をソート (コード省略) */
int top_x, top_y, top_u, top_v;
int mid_x, mid_y, mid_u, mid_v;
int bot_x, bot_y, bot_u, bot_v;
/* ３点が横に一直線 */
if ( top_y == bot_y )
return;
/* スキャン開始位置 */
int scan_scr_y = top_y;
int pixel      = scan_scr_y * scr_pitch + scr_offset;
int dist_scr_x, dist_scr_y;
int tb_scr_x, tm_scr_x, mb_scr_x;
int tb_scr_dx, tm_scr_dx, mb_scr_dx;
int dist_tex_u, dist_tex_v;
int tb_tex_u, tb_tex_v, tm_tex_u, tm_tex_v, mb_tex_u, mb_tex_v;
int tb_tex_du, tb_tex_dv, tm_tex_du, tm_tex_dv, mb_tex_du, mb_tex_dv;
/* top-bot */
dist_scr_x = bot_x - top_x;
dist_scr_y = inverse16( bot_y - top_y );
tb_scr_dx  = dist_scr_x * dist_scr_y; // top-botのX勾配（Δx’の求め方）
tb_scr_x   = top_x << SFT; // top-bot上のX
/* テクスチャーのtop-bot */
dist_tex_u = bot_u - top_u; （Δx’の求め方）
dist_tex_v = bot_v - top_v; （Δx’の求め方）
tb_tex_du  = dist_tex_u * dist_scr_y;
tb_tex_dv  = dist_tex_v * dist_scr_y;
tb_tex_u   = top_u << SFT; // top-bot上のU
tb_tex_v   = top_v << SFT; // top-bot上のV
/* top-mid */
dist_scr_x = mid_x - top_x;
dist_scr_y = mid_y - top_y;
dist_tex_u = mid_u - top_u;
dist_tex_v = mid_v - top_v;
/* テクスチャースキャン用 dx,dy top-bot->mid */
int scan_tex_du, scan_tex_dv;
int width = dist_scr_x - ((tb_scr_dx * dist_scr_y) >> SFT);
if (width != 0 ) {
int inv_width = inverse16( width );//水平スキャンU勾配（Δx’の求め方）
scan_tex_du = (dist_tex_u - ((tb_tex_du * dist_scr_y) >> SFT)) * inv_width; );//水平スキャンv勾配（Δx’の求め方）
scan_tex_dv = (dist_tex_v - ((tb_tex_dv * dist_scr_y) >> SFT)) * inv_width;
}
else
return;
/* top-mid */
int scr_end, scr_dd;
if ( dist_scr_y > 0 ) {
/* 上の三角形がある */
dist_scr_y = inverse16( dist_scr_y );
tm_scr_dx = dist_scr_x * dist_scr_y;// top-midのx勾配（Δx’の求め方）
tm_scr_x  = tb_scr_x; // top-mid上のX
/* テクスチャーのtop-mid */
tm_tex_du = dist_tex_u * dist_scr_y; // top-midのU勾配（Δx’の求め方）
tm_tex_dv = dist_tex_v * dist_scr_y; // top-mid上のv勾配（Δx’の求め方）
tm_tex_u  = tb_tex_u; // top-mid上のU勾配
tm_tex_v  = tb_tex_v; // top-mid上のV勾配
if ( width > 0 ) {  // top-botが左
if ( inside ) {
while ( scan_scr_y < mid_y ) {
int p1 = (tb_scr_x >> SFT) + pixel;
int p2 = (tm_scr_x >> SFT) + pixel;
int tpx = tb_tex_u;
int tpy = tb_tex_v;
while ( p1 < p2 ) {
int tidx = ((tpy & TEXHMASK) >>> TEXPSHIFT) + ((tpx>>> SFT) & TEXWMASK);
scr_image[p1]=tex_image[tidx];//１ピクセル書き込む
tpx += scan_tex_du;
tpy += scan_tex_dv;
p1++;
}
scan_scr_y++;
pixel    += scr_pitch;
tb_scr_x += tb_scr_dx;
tm_scr_x += tm_scr_dx;
tb_tex_u += tb_tex_du;
tb_tex_v += tb_tex_dv;
}
}
else { /* コード省略 */ }
}
else { /* top-midが左 (コード省略) */ }
}
/* 底が水平 */
if ( mid_y == bot_y )
return;
/* mid-bot */
dist_scr_x = bot_x - mid_x;
dist_scr_y = inverse16( bot_y - mid_y );
mb_scr_dx  = dist_scr_x * dist_scr_y; // mid-botの勾配
mb_scr_x   = mid_x << SFT; // mid-bot上のX
if ( width > 0 ) {  // top-botが左
if ( inside ) {
while ( scan_scr_y < bot_y ) {
int p1 = (tb_scr_x >> SFT) + pixel;
int p2 = (mb_scr_x >> SFT) + pixel;
int tpx = tb_tex_u;
int tpy = tb_tex_v;
while ( p1 < p2 ) {
int tidx = ((tpy & TEXHMASK) >>> TEXPSHIFT) + ((tpx >>> SFT) & TEXWMASK);
scr_image[p1] = tex_image[tidx]; //１ピクセル書き込む
tpx += scan_tex_du;
tpy += scan_tex_dv;
p1++;
}
scan_scr_y++;
pixel    += scr_pitch;
tb_scr_x += tb_scr_dx;
mb_scr_x += mb_scr_dx;
tb_tex_u += tb_tex_du;
tb_tex_v += tb_tex_dv;
}
}
else {  /* コード省略 */ }
}
else { /* mid-botが左 (コード省略) */ }
return;
}
/**μを計算する
*
*  @param  num 分母(-32767..-1, 1..32767)
*  @return μ=λ/num
*/
private static int inverse16( int num ) {
boolean posi_flg = (num >= 0);
int denom = posi_flg ? num : -num;
if ( denom < 128 ) {
int val = (_inverse_tbl[denom] & 0xffff) + 1;
return posi_flg ? val : -val;
}
int x = 32768*128;
int y = denom << 15;
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
{ int s = x - y; x = (s >= 0) ? (s << 1) + 1 : x << 1; }
int r = (x >> 15);
x <<= 1;
if ( denom <= r )
x++;
x &= 0xffff;
return posi_flg ? x : -x;
}
}
以上が、本発明を実施する為のプログラムの一例である。
【産業上の利用可能性】
【０１１１】
本発明は、３次元画像の描画の演算処理の際、整数の範囲で演算処理が行えるので、携帯電話や、ＰＤＡ（Personal Digital(Data) Assistants）のようにＦＰＵ（浮動小数点演算ユニット）も備えていないものであっても、３次元画像が扱える。
【０１１２】
また、演算処理の際、処理負荷の高い除算を行わないようにしているので、ＣＰＵの能力が低い情報処理装置であっても、スムーズな描画処理が行える。
【図面の簡単な説明】
【０１１３】
【図１】図１は携帯端末のブロック図である。
【図２】図２は３次元グラフィクの基本的な描画動作を示すフローチャートである。
【図３】図３はモデルオブジェクトを描画のステップであるＳｔｅｐ  １０６の動作を更に詳細に示すフローチャートである。
【符号の説明】
【０１１４】
１      ディスプレイ
２      ＦＰＵ
３      メモリ部
【図１】
0004046233.tif 000108
【図２】
0004046233.tif 000109
【図３】
0004046233.tif 000110