昼前に起床。
髪を切ろうと床屋に予約を入れた所、夕方まで待ちという事で
その間に時間潰しでぐうたら過ごしたり。
先日のプログラムいじり。マウスでオブジェクトを動かせる様に
しようとしたのですが、うまくゆかず悩んでみたり。
各オブジェクトはローカル座標系でのみ管理されていて、表示する際
はOpenGLの行列スタック(glPushMatrix()/glPopMatrix())を使用して
いたので、ワールド座標変換についてそれほど気にしていませんでした
(表示するだけならOpenGLは楽チンなのです)。
所が、マウスカーソル位置から変換される 視点と着目点は
ワールド座標系で表現されている為、オブジェクトポリゴンと
視線との当たり判定を行なうには (a)全オブジェクトを
ワールド座標系に変換して視線と当たり判定を行なう。
(b)視点と着目点のワールド座標系をローカル座標系に変換して
当たり判定を行なう。 のいずれかになります。
前者(a)だとオブジェクトの全頂点を座標変換する
必要がある為、処理が重くなる事が予想されます。なので、
後者(b) を採用する事にしたのですが、これがうまくいかないと
いう感じなのです(^^; そんななので、紙の上で作図して見直して
いるのですが、これが紙だと「回す」「移動する」とか描き始めたら
すぐにごちゃごちゃになり、訳がわからなくなって死亡(^^;;
修行が足りません。POV-Rayとかを使って可視化した方が考えやすい
気がしなくもない気分です。
先日購入した「ファミ通WaveDVD」を見たり。キャッスルバニア
のボスラッシュの制約プレイとか、マリオカートダブルダッシュの
タイムアタックとか、スゲーのに驚いてみたり。
そういや、前から不思議に思っていたのですが、任天堂の一連の
レースゲームは、任天堂内で出された公式最速タイムというのが
いつも出ていて、それは常に常軌を逸したタイムばかりな様に
思います。しかも、発売後、実際にそれに追いつき追い越すのに
数ヶ月以上かかったりします。これを踏まえて考えるに、
限られた開発期間の中で正式版レベルでテストプレイが出来る期間は
非常に短いのではないのか?と予想されるにも
関わらず、その期間で「これって本当?」みたいなタイムを
出せる神のような人が居るの?と、思ったり。
話を元に戻して、今回一番笑ったのはアメザリの「キカイノカラダ」
でした。
もう一冊、「メイキングオブゲームグラフィックス2004」。
CGWORLD誌の別冊で、同誌掲載記事をまとめた感じの雑誌です。
その中に「R-TYPE FINAL」のCGメイキングの記事が載っていました。
FINALでは自機体の種類が鬼の様にあるのですが、その機体の
デザインをたった二人で、しかも各人は紙上でのデザインから
CGへの落とし込みまで全てを行なっていたというのに驚いたり。
床屋に行って、戻ってきてさらにだらだら過ごして終了。
そんな感じで明日から出張です。
出張。帰着。ふぅ。
出張中にモーションデザインという観点で色々と考えてみたのですが、
単に「Poserもどき」にするだけだとつまらないという事で、
アニメーションフレームを作成できるようにしたくなってきました(^^;
アニメーションさせることを考えると、今のデータ構造では時間軸
の次元を持っていないので、時間方向のデータを保持するように
考え直す必要がありそうです。また、時間軸を考慮したデータフォーマット
を決める必要もありで、どうするのが良いか模索中。
そうは言っても、基本はツリーデータ構造でそれを表示できるという点
ですから、今まで仕込んだ分について、一応表示するところまで
作ってみる事にしました。で、こんな感じ。
色は階層の深さで一意の色をセットしているだけです。
そして、この表示の元になる構造記述は以下のような感じ。
obj{ #skyblue file="joint.3ds" ; pos = < 0,0,0 > ; rot = < 0,0,0 > ; obj{ #magenta file="joint.3ds" ; rot=< 90, 0, 0 > ; pos=< 0.0, 1.0, 0.0 > ; obj{ #purple file="joint.3ds" ; rot=< 0, 0, 90 > ; pos=< 0.0, 1.0, 0.0 > ; obj{ #yellow file="joint.3ds" ; rot=< 0, 0, 90 > ; pos=< 0.0, 1.0, 0.0 > ; } } } }
出張。
出張。
出張。
なんか今日も調子悪くて休業。一日中寝てたり。
モーションオブジェクトのツリー構造を仕込んでみたり。
リストは何度書いても慣れません(^^; デバッグ用に
ダンプルーチンで確認しながら勘違いを修正して
どうにか仕込み完了。修行が足りません。
ツリー構造リストを関数の再帰呼び出しで参照していくのは
かっちょいいので好きなのですけどね。
調子悪くて休業。
復活したところで、関節を持ったモーションオブジェクトの表現を
考えてみたり。とりあえず、構造記述をテキストで行なおうと思った
のですが、自力で構文解析器を書くのは作業的にちょっと重そうだったので、
ものすごく久しぶりにbison/flexを使ってみる事にしました。
所がこれが、もう、ビックリするくらい使い方を忘れ去っていて
思い出すのに一苦労。というか、前にインタープリタの実験コード
を書いた時はflexを使わなかったので、そもそも使い方が良く判っていない
というのが問題なのかも。で、どうにかパースできる所まで仕込めた所で
力尽きたり。つーか、ここぁ あまり本質では無い部分なのですが(^^;
そんな感じで明日から出張です。
午前中に起床。
先日仕掛けたgcc-3.3.3のビルドはエラー無く終了。めずらしい(^^;。
make installしてPOV-Ray 3.5cを再コンパイルしてppcsim上で実行。
取りあえずOKそう。
ボーンシステムについてWebを検索してみたり。有名所は色々ある
様ですが、今だとmikotoという奴がフリーウェアとしては有名所の
様です。システムとしてはメタセコイア形式を入力とするものが多い様
ですが、ボーンはシステム上で生成するのではなく、メタセコイア上
で生成できる特殊なプリミティブを利用しているという感じです。
Wings3Dでは特殊なプリミティブが存在しない(回転体など無いので
線や曲線といった表現が必要無い)ので、そこん所はボーンシステム上
で仕込める必要がありそうです。あと、機械的なオブジェクトの関節で
あれば問題無いのですが、人体の関節の様に関節の動きに皮膚を有機的に
変形させる様な場合、ポリゴンの影響などを考慮する必要があるという
点が重要な様です。
複数のオブジェクトをボーンシステム上で統合する事を考えていたのですが、
これだと前述した有機的な変形時の影響というのを与えるのが難しい様に
思えてきました。でも、このボーンの位置設定とそれに影響するポリゴン群
を指定するそのインターフェースが妙に難しい感じがして考え中。
後、モデラとボーンシステムを分けてしまうと、オブジェクトの差し替え
や修正が異常に難しくなるのが悩み所。オブジェクトを部品毎に分ければ
差し替えの問題無しなのですが、有機的な変形とは両立できないので
もどかしいです(^^; Wings3Dにボーンシステムを組み込んでくれれば
問題なっしんなのですが.....
3DCGのページの(ファイルの)ディレクトリ構成を変更したり、HairMakerの
マニュアルを直したり。
出張中に読む本を物色に。特にめぼしいもの無く、「CONTINUE Vol14」を
購入。帰ってからパラパラとめくっていたら、メインであると思われる
「燃えプロを創った男」を思わず読んでしまったり。あまりに面白かった
ので思わずはまり込んでしまいました。これ読むと、ジャレコって
スゲー会社だったのだなぁと思ったり。
最近お気に入りのペン。PILOTの「HI-TEC-C」というゲルインキ(だと思う)
の水性サインペン。0.3mmなのですが、書き味が滑らかでインクが途切れない点
がお気に入りの理由。細いサインペンというとサクラカラーの「PIGMA」
とかありますが、PIGMAは何故か(インク切れで)すぐに書けなくなってしまう
という印象があるのと、キャップ表示の太さよりも太く感じる点が
イマイチに感じていました。なので、HI-TEC-Cはきちんと細い感じになっている
のが良いです。メモ書きを やたらちんまい文字で書く癖のある私には文字が
潰れなくて良い感じ。ただし、線が固いので絵を描くには好みが分かれる
所かも知れません。
そんな感じで明日から出張です。
起きたら夕方(大汗;;
HairMakerにちょっと手を入れたり。POV出力で、#declare文を使用
して調節の類は直接POVファイルをいじって行なえる様にしようと
したところ、何故か思い通りにならなかったり。
マクロに渡すパラメータに、declare文で指定した変数を指定した
のですが、それがうまく伝わらず。
どうやら原因は、マクロを使用しているのですが、そのマクロに
渡すパラメータを空白文字で区切っていたのがマズいらしく、
','カンマで区切るとうまくいく様になったり。文法的に
はエラーにならない為、何が悪いのかさっぱり判らなかったという
感じ。文法に大らかなのも考えものだと思った瞬間でした。
HairMakerのVer0.03を置いてみました。御参考まで。
マニュアルの中で使用する操作例のスナップショットを取っていたのですが、
全部取り終えた後で、GroupIDの綴りがミスっている事に気づいて
全て取りなおしでヘッコリ。そろそろChangeLogを書かないと
何が変わったか判らなくなりつつありますが、当分いじるつもり
は無いので、まぁいいかなどと思ったり(^^;
gcc-3.3.3のppcクロスビルドを仕掛けて寝る。
出張。帰着。ふぅ。
gcc-3.3.3などをダウンロードしながらWebを巡回したり。
とかやってると眠くて死亡。
出張。
出張。
出張。
出張。
午前中に起床。
同期編集モードが変な点を直したり、ソースコードを整理したり。
そんな感じで実戦投入。サーフェスを使って衝突を確認しながら進めたの
ですが、確認作業が入る分、やっぱそれなりに時間がかかります(^^;
でも、めり込みが発生しないので、テストレンダリングの回数は少なくて
済む分、仕上げは早いという感じ。
左の絵はサーフェスを貼ってみた所。表面に出ている部分なので、
このサーフェスよりも手前に見えるガイドがあると変に見える毛が
生成されるという感じ。
取りあえず、毛の生成については一段落という感じ。パラメータ類を
操作する為のUIを付ける必要がありますが、それは追々という事で(^^;
ちょっと気分を変えて、次はモデリングの方に戻り、ポーズを変える事を
画策してみようと思います。そういや、今回 毛エディタを作った技を応用して
ボーンシステムなど作れないものかと考え中。
そんな感じで明日から出張です。
昼頃起床。
TV見てたらいつの間にか寝てたり(汗;
「こんなハズでは」とか観たり。つい先日放送された「ロード・オブ・ザ・リング」
ですが、その中で出てきたホビット族の小ささを表現するのに強制遠近法使われている
というのに驚いたり。強制遠近法とは、手前に居る人と奥にいる人を
カメラで写した時、手前に居る人より奥に居る人の方が小さく写るというのを
そのまま利用する方法です。奥に居る人に大きなコップを持たせて、手前に居る人
が持つ普通のコップと同じ大きさに見えるような位置に立たせると、あたかも小さな人が
普通のコップを持っている様に錯覚するというもの。ただし、カメラをパンさせたりすると、
奥に居る事がバレてしまうという問題が発生してしまいますが、この点についてカメラの
動きに合わせて、奥の人の位置を動かす事で解決しているという、直球のやり方に
驚いてしまいました。私自身、全編を見ていてホビット族は
本当に背の低い役者を集めたのだろうと思っていた(CGではないとは思いましたが(^^;)
ので、錯覚技法にすっかりはまっていたという事になります。
CG全盛の現在において、CGでは無い方法でそれらしく見せるという点に、
新鮮さを感じました。
食事をしながら先週買って、観る事ができていなかった「トゥームレイダー2」
を観たり。んー、アクションシーンでやっている事は1の時より激しいと思う
のですが、セットや見せ方のせいか、激しさや凄さが何故かイマイチ伝わらないというか。
また、小道具類も、携帯電話にPDA端末と、今や珍しくも無い道具をそのまま
使っている為、現実感というリアリティがある反面、まとも過ぎて何か違うと
いう感じがしました。そんなところで、全体的に1に比べて地味な印象を受けたので、
個人的には「いまひとつ」という感想です。
HairMakerいじり。簡易サーフェス表示を実装してみたり。
一番困ったのが、サーフェス表示自体はメインの機能では無く、あくまで補助機能
という形で実装したかったので、今あるメインの編集機能の勝手を殺す事無く
盛り込むという点。とは言いつつ、結果的には無理矢理押し込んだという
感じになってしまいました(^^;
後、曲面に色を付けたいと思ったのですが何故か色が付かず。ライトを
Disableにすると、指定の色で塗りつぶされるので謎。なんで?
という訳で赤本を眺めていたら、glMaterialを使う方法を思い出しました(^^;
つーか、以前 3DS形式のファイルを読み込んで色を付ける技を一度は
使ったハズなのに、すっかり忘れ去っているというダメっぷり。
出張。帰着。ふぅ。
TV見てたら眠くて死亡。
出張。
出張。帰着。ふぅ。
昼頃に帰着したのですが、寒さと眠さで死亡。
起きてぐぅたらTVなど見ながら過ごしたり。
ヘアガイド同士の衝突(というかめり込みというか)を可視化する為、
gluNurbsSurface()の使い方を練習してみたり。gluNurbsCurve()
を使う時に少し調べたので、使い方自体は特に悩む事は無いのですが、
実際に描画してみると何故か真っ黒にしか描画されず。Cullingをやめると
どうやら裏向きだったようで、真っ黒というのが判明。
なんか調べていると、今までglCullFace(GL_FRONT)を使用していたのですが、
赤本をよくよく読んでみると、これだと表向きの面が削除されてしまいます(^^;
glCullFace(GL_BACK)にすると、テストで描画しているNurbs曲面は良いのですが、
頭部モデルがうまく表示されなくなったりしてヘッコリ。取りあえず、表示だけ
直してみたり。で、よく判らないのが、Nurbs曲面の表裏がどうやって
決定されるのかという点。赤本見ても見つけられず。むぅ。
で、これをHairMaker内で どうやって使うかという点。
今考えているのが、二本のヘアガイドを指定し、それについて曲面を貼る。
それをチェックしたいガイドについて行ない、見た目を直すという方法です。
あくまで見た目の衝突を可視化する為だけに使用するという感じ。
実際のガイドの指定方法は少し考えてみないとダメって感じ。
そんな感じで明日から出張です。
出張。
出張。
昼過ぎ起床。
ぐうたらHairMakerを使って調節してはレンダリングを繰り返してみたり。
レンダリングの合間にファミ通WaveDVDなどを見たり。
「Devil May Cry」のスゲーやり込みに驚いたり、最近のゲームはやっぱ
グラフィックがスゲーなぁと感心したり。
ガイド数が増えてくるとどれがどれだか判りにくくなってきたので、
グループ毎に表示のON/OFFができる様にしてみたり、細かい事を色々と
入れ込んでみたり。
気が変わって 更に髪型をいじったりしていると、いつまで経っても
終らず(^^;
上の絵では判りにくいですが、これの元になった1024x768の画像サイズで
レンダリングすると、グループ分けのチョンボによるゴミの毛や、
密度の低さから現れる薄毛などが気になります。
他にも、実際に使ってみると気になる所がいくつかあります。
例えば、前髪の様な額に近い部分から生えている毛と、少し額から離れた
位置から生える毛が 何重かに重なる部分がある場合、これらの毛を眉毛
辺りで揃えたとすると、普通だと額に近い部分から生える毛よりも
額から離れた位置から生える毛の方が層的に上の方にあり、目に見えるのは
後者の方になると思います。所が、ベジェの曲率が合っていないと、
額に近い部分から生える毛が、本来見えるべき毛を押しのけて生えている
様に見えてしまいます。
曲線のガイドだけでは、重なりまではよく見えないので、レンダリングして
は修正という形にならざるを得ません。ここんところ、もう少し
うまく直せる手段が無いかなぁと思ってみたり。
多分、短冊ポリゴンにテクスチャを貼る方式の場合、ポリゴンでの表示
により、プリビューの段階で重なり具合を確認できるので、その点では
曲線ガイドによる表現よりは、効率的に、見た目の修正を収束させられると
考えられます。因みに、「R:RACING EVOLUTION」(いわゆるリッジ系列の新作)
のムービーなどでは、短冊型が採用されているらしい。
そんな感じで明日から出張です。
昼過ぎ起床。乾燥気味でカサカサ。
Pixie-1.3.2を試してみたり。
shaderの再コンパイルが必要なようです。それを直してレンダリング
してみたのですが、"dice"というAttributeで"flatness"など知らん
とエラーしたりで、なんかイマイチ。以前作成したCurvesプリミティブ
を使用したシーンファイルをレンダリングしてみたのですが、
何も出力されず。むぅ。
Wings3Dの新しいのを試す。
POV出力プラグを食わしてExportしたらfailしたり。どうやら、0.98.19c用
のプラグというものが存在するようですが、そちらは404になっていたり。
掲示板を覗いてみると、その辺の事を問い合わせている質問が出ていたり
したので、ここニ、三日で解決するかも。
RIB出力プラグの0.98.19c用というのはダウンロードできる様だったので
試してみたり。簡単なシーンファイルならばエラーすることなく出力
出来ましたが色は付かず(^^; 少し大きめのを出すと何故かfailしたり。
テクスチャが貼ってあるのが原因かも知れませんがイマイチ。
Cygwinの1.5.7を入れてみたり。
こちらはforkもmalloc(mmap)も直ってなくて結局、スナップショットに
パッチを当てて再ビルドしたり。途中でエラーしたのですが、一応
new-cygwin1.dllはできていたので入れてみたり。OKそう。
「ロード・オブ・ザ・リング」など観ながらHairMakerをいじったり。
同期編集モードに少し手を入れてみたり。でも思ったのとちょっと
違ったりして思いのほか てこずってみたり。
消費メモリについて改善案。というか、今まで気づいていなかった所が
マヌケなのですが(^^; ベジェ曲線の直線近似の際、ステップ数が多かった
のを削ってみました。ステップ数を1/3にしたら消費メモリも1/3に
なってみたり。当たり前ですね(^^;
そんな感じで、見えない所も含めてガイドを生成した所での
消費メモリは約100MBといった所。今まではレンダリング中は、
同時に出来る事はテキストエディットが精一杯だったのですが、
他の事をやってもそこそこ大丈夫そうな感じ。
毛の太さを徐々に細くする話。cylinder文の代わりにconeを使えば
それが可能そうな予感。今までconeは本当に円錐しか描けないと
思っていたのですが、始点(base)と終点(cap)のそれぞれについて、
断面半径を指定でき、どちらかの断面半径に0を指定する事で
円錐になるという事が判りました。つーか、気づけよって感じ?(^^;
そんな訳で coneを使ってだんだん細くする方法を考えてみたり。
やり方自体は、曲線の長さを1とした時の、直線近似時の通過点との
比を使って、通過点の半径を出すという感じなのですが、
実装方法に悩んでみたり。というのも、POVマクロを使う事で入力ファイルサイズ
を減らしたのが、再び 直にconeプリミティブの大量出力でしか表現できないかも
知れなかったからです。そこで、POV-Rayのマクロを使って曲線の長さ計算を行なう事は
可能か?ということでPOV-Rayのマニュアルを探ってみたり。どうやら、
ベクトル演算なんかも楽勝でできるという事で、なんとかなりそう
な感じ。
で、まずは雛型をPOV-Ray上でデバッグ。曲線の長さを求める為に、
一度ベジェ曲線を引くのと同じループを回して長さを求めた後、
半径の変化率として使用してって感じ。できた雛型をHairMakerに
取り込んで、取りあえずOKそう。
とかやってたら寒くて死亡。
出張。帰着。ふぅ。
Wings3DやPixieが若干新しくなっているようで、ダウンロードして
みたり。
でも、あまりの寒さと眠さで死亡。
出張。
出張。
出張。
出張。
昼過ぎ起床。
セグメントを増やしてベジェ曲線の編集をできるようにしてみたり。
今まで、アンカーとハンドルを区別せず、単なる制御点として
扱っていたのですが、一般的なベジェ曲線編集ツールのような形にしてみたり。
アンカーを動かす事でハンドル位置も追従する様にしたのですが、
逆に使いにくくなった気がしなくもありません(^^;
今までセレクトされたヘアガイド群は代表ヘアガイドと
同時に動かす際、いっせいに同一方向にしか動かなかったのですが、
ヘアルート(毛根)の法線を考慮して同時に動かせる様にしてみたり。
モデリングがうまくできていれば、全方向のガイドを一斉に寄せる際、
Y軸回転の様に動かせる分、今までよりも自然に動かせる様になった
かも。
そんな感じで実戦投入。これまではアンカー2点のベジェ曲線だった
のですが、今回はアンカー3点のベジェ曲線になっています。そのおかげで
前
は真っ直ぐに生えている感じにしかできなかったのですが、今回はより
自然に見えるように調節可能になりました。とは言っても、自然に見える
様にするにはそれなりに手間がかかりますが(^^;
不具合が何点かありましたが、まぁ、こんな感じかなぁと言った所。
やっぱレンダリングに必要とするメモリ量がネックで厳しいです(^^;
今回はベジェ曲線のセグメントが倍になっているので、前回と違って
絶対見えないところには毛を生成していないにも関わらず、前回よりも
消費メモリ量が増えています。
レンダリング時間の方は画像サイズを小さくするなどして時間を
削る余地があるのですが、メモリの方はプリミティブを大量に
使っている以上、削るのが難しい所が難点。sphere_sweep
でベジェ曲線をサポートしてくれれば多分そちらの方が軽そう
な予感はしますが。もしくは、RenderManのcurveプリミティブ
に代わるものがあれば良いのですが。
レンダリング待ちの間に「CGWORLD誌」を眺めたり。
何号か前からちょくちょく購入しているのですが、毎号、
作画やインタビューが盛りだくさんでスゲーなぁと思ったり。
PixieやWings3Dの新しいのが出ているのですが試せず。
HairMakerのGUIの方を考える予定だったのですが、随分横道に
逸れてしまったかも。休日が一日では時間が足りんなぁ。
そんな感じで明日から出張です。