アニメーション

EusLispのアニメーションは、グラフィックアクセラレータを持たない 普通のワークステーション上での擬似リアルタイムグラフィックス機能を備えている。 その基本的な考え方は、長い時間かかって生成された1連の画像を高速に 再表示することである。 画像は2つの方法で保存される。 1つは、完全なピクセル画像を持つたくさんのXwindow pixmapを保存する。 もう1つは、陰線処理で得られる線分データを保存する。 前者は、高速で陰面処理された画像を表示するための方法であるが、 長いアニメーションではたくさんのメモリーをX serverに要求するため 適さない。 後者は、メモリーが少なくて済み、データをディスクに蓄積するのに適する。 しかし、線分の数が増加したならば、性能を悪化させる。

他の方法として、描かれるオブジェクトの構成を得て、 *viewer*に描画を生成する関数をユーザーが作ることもできる。 pixmap-animationは、count引数で指定された数と同じ回数この関数を呼び出す。 それぞれの呼び出し後、Xwindowと仮定されるviewsurfaceの内容は、 新しく作られたXwindow pixmapにコピーされる。 これらのpixmapは、playback-pixmapで再表示される。 同様に、hid-lines-animationhidの結果から見える線分を抜き出し、 リストに蓄積する。 そのリストは、playback-hid-linesによって再表示される。

以下に示す関数は、"llib/animation.l"に定義されており、 "llib/animdemo.l"の中にはETA3 マニピュレータのモデルに関して hid-lines-animationを用いたアニメーションの サンプルプログラムを含んでいる。



pixmap-animation count &rest forms [マクロ]

formsは、count回評価される。 それぞれの評価後、*viewsurface*の内容は新しいpixmapにコピーされる。 count枚のpixmapのリストが、返される。


playback-pixmaps pixmaps &optional (surf *viewsurface*) [関数]
pixmapsリストのなかのpixmapはそれぞれ、 surfに連続的にコピーされる。


hid-lines-animation count &rest forms [マクロ]

hidへの呼び出しを含むformscount回評価される。 それぞれの評価後、*hid*が持つhidの結果は検索され、 見える線分は2点一組のリストの形で集められる。 count長さのリストが返される。


playback-hid-lines lines &optional (view *viewer*) [関数]
linesは、2点一組のリストである。 viewの上に線分を連続的に描く。 他のpixmapを割り当てるときにフリッカーフリーアニメーションを生成するために 2重バッファ技法が使用される。


list-visible-segments hid-result [関数]

hid-resultのedge画像のリストから見える線分を集める。




2016-04-05