昔の最近の出来事(2004.05)

2004/05/31

なんか具合悪くなって一日中寝てたり。

攻殻観たり。ぴひゅー、相変わらずの高密度っぷりです。

2004/05/30

昼過ぎ起床。

来週分の暮らしの資金をリロードして本屋に行ったりCD屋に行ったり。 攻殻2ndGIGとかファミ通WaveDVDとか出張中に読む本とか。

先週出張中に「ザ・ゴール」という本を読んでみました。 TANE的に普段は一切興味の無いビジネス書の棚(この本の事を知らなければ 恐らく一生寄る事のないコーナー)に置かれている本です。 以前、社内教育で知り合った方にその存在を教えていただき、 なんとなく興味が湧いていたので時々書棚をチェックしていたのですが、 なかなか見つからず、先週やっと見つけたという訳です。この本、 その出版の経緯が面白くて、著者であるエリヤフ・ゴールドラット氏は 元々生産管理を行なうソフトウェアを売っていたのですが、なかなか 売上げが伸びないという事で、それを打開する一つのアイデアとして、 小説形式で著者が考えた生産管理手法((即ちソフトウェアで行なっている事)を 解説し、ソフトの有効性を広め様としたのが、きっかけとなっているそうです。 いくらセールスの為とは言え、そんな道楽めいた事でソフトの売上に繋がる とも思えないのですが、大方の予想を大幅に覆すベストセラーになりました。 所が、一つの問題があり、この本で行なっている手法をそのまま実行に移せば、 実際にソフトを使うよりも大幅に安くて短期間で、改善効果が得られるという事が 広がり、結局ソフトの売上は減ってしまったという事です。
で、実際に読んでみた所、激ハマりでした(^^;。極めて当たり前と 言われればそんな気もするのですが、スループットやボトルネックという 用語が出てくる所、そしてボトルネックに全体が引きずられるという点などは、 生産管理に限らず、コンピュータの内部構造の改善や、ソフトウェアのパフォー マンス改善にも通じる所があり、非常に興味深く読む事ができました。 そういや 以前、道路の渋滞の話を聞いた事がありましたが、それとも 置き換えが可能(というかそのまんま)かも。
所でこの本、初版は1984年という事で随分前に出版されたものなのですが、 日本語訳の初版は2001年の出版となっています。全米でベストセラーとなった 話題の本であれば、日本でも話題にならないハズは無いと思うのですが、 なんでも「日本人は、部分最適の改善にかけては世界で超一級だ。 その日本人に『ザ・ゴール』に書いたような全体最適化の手法を教えて しまったら、貿易摩擦が再燃して世界経済が大混乱に陥る」と著者 本人が本気で思っていたらしく(^^;、著者本人が許可しなかったらしいです。 そんな感じで、ページ数があるのでとっつきは非常に悪いかも知れませんが、 お時間があるようでしたら是非。

そんな感じで明日から出張です。

2004/05/29

出張。帰着。ふぅ。

Apacheの再コンパイルをこねくり回すも、結局うまく起動できず。 で、一つ前のバージョンを入れようと、ダウンロードを試みたの ですが、何故かそれも見当たらず。しかたないので、自分ディスク の中の昔のディレクトリを漁ると見つかったので入れてみる事に しました。でも、setupプログラムでうまく入れられず、結局 手でバイナリを上書きしてみたり。で、これならエラー窓を出さずに 起動できてみたり。ちぇっ。そんな感じ。

CGIからPostgreSQLをアクセスしてみたり。でも何故かInternalServerError でうまく表示できず。うまく表示できるCGIスクリプトとうまく 表示できないスクリプトがあって、その違いが判らず。 で、よくよく見てみると、

print "Content-type: text/html;charset=Shift_JIS\n\n";

という様に、Content-type:の行の後に空行を出力しないとうまくいかない というのが判明。これってCGIの常識ですか?そうですか。 因みに今まで CGIで遊んだ時には、うまくいくものを、たまたま全てコピペして 用事のある所だけを書き換えていたのでうまくいったという 事らしい。いやー、難しい世の中です。

2004/05/28

出張。

2004/05/27

出張。

2004/05/26

出張。

2004/05/25

出張。

2004/05/24

出張。

2004/05/23

殆ど夕方に起床(汗;

先日の変更について、ChangeLogを確認してみました。すると、

2004-03-06  Christopher Faylor  <cgf@redhat.com>

        * fork.cc (fork_parent): Save parent pid in a temporary variable since
        child could conceivably exit before function returns, rendering the
        child's shared memory area invalid.

なる更新が入っていて、それがまさに今回の不具合に関係するところでした。 イマイチ意味が正しく読めませんが、想像で読むと(<読めてません) 共有領域をセットするのは子プロセスで、元に戻すと今度は プロセスが立ちあがって終了する所まで行った時に、変な事が起こるので こうしたという事なのでしょうか。
いずれにしても、うかつに戻すと違う不具合を呼び出してしまう可能性が あるので、やっぱりもう少し良い方法で直さないとダメなのかも。 とは言っても、なんかあまり簡単そうでもなくて、まだ準備ができていなくて 値を参照してはいけないのと、とっくに終了しているので値が参照できない のとを区別するのは、意外と面倒な予感がしなくもありません。 恐らくどちらかのケースが絶対に起こらない事を保証しない限りは、 マシンのクロック周波数を変えただけで動かなくなったりするかも。 そんな訳で、どう直すのが良いのやらって感じなので、当分は今回の 直し方で使うのかも。

結局Apacheの再コンパイル方法については有用な情報が得られず。

そんな感じで明日から出張です。

2004/05/22

昼過ぎ起床。

Cygwinプロセス消滅問題(勝手にそう名づけました(^^;)の方を調べて みたり。高い頻度で再現するのは cygwinのスナップショット のビルド中のconfigure実行なのですが、決まった位置で必ずエラーする のではないのが厄介です。なので、自前プログラムで再現させる事を 試してみました。でも、一度も再現せず。
そういや、fork()の性能問題回避の為、パッチを使用していますが、 本来WIN32API一発で済む事を、何度も分割実行するという対応を 行なっています。このとき、本当ならば一つの処理の間に割り込み などで別の処理が入る事は無いハズにも関わらず、分割実行する 事でそのようなタイミングが生まれてしまい、何かしらの原因で その穴を触ってしまうのではないのか?(要約するとアトミックで なくてはならない処理を、アトミックで無い様にした時に発生する穴) と思い、パッチを外してみたのですが、結果は変わらず。ぐったり。

どうやら、apacheの再コンパイル時のconfigure実行でもプロセス 消滅が発生するみたい。
configure実行で起こり易いところを見ると、shも少し関係が あるのかもと思い、shをbashで置き換えてみたり。でもやっぱり 同じような所でプロセス消滅が発生している模様。という事は、 shellの実行によるというよりは、やはりプロセスの生成や消滅など を行なう事が原因のような予感。

fork()性能テストプログラムをメッセージなどを変えながら何度 か実行していたら、何度が再現してみたり。この時、以下のような 点に気づいてみたり。まず、再現に使用したプログラムのコア部分 は以下の通り。FORK_COUNTは128で定義しています。

  for( i=0 ; i<FORK_COUNT ; i++ ){
    pid=fork() ;
    if( pid==0 ){
      fprintf(stderr,"Leave fork() child %d\n",i) ;
      exit(0) ;
    }else if( pid>0 ){
      wait(0) ;
      continue ;
    }else{
      fprintf(stderr,"fork faild\n") ;
      break ;
    }
  }

で、エラーが再現した時の状態。

  :
Leave fork() child 30
Leave fork() child 31
Leave fork() child 32
Leave fork() child 32
test>

気づいた点は、最後、ループカウンタに使用しているiの表示が ダブっている点です。何事も無かったかの様に、親プロセスが 終了している点と合わせて考えると、親プロセスでfork()を 実行し、子はpid=0が戻って普通に終了するという感じに思う のですが、親にもpid=0が戻って、結果、親プロセスにも関わらず 子プロセスであると騙されて、普通にプロセス退出してしまう のではないか?と推測してみました。そこで、カレントプロセス IDと親プロセスIDを表示する様にしてみました。

      fprintf(stderr,"Leave fork() child %d pid=%d ppid=%d\n",i,getpid(),getppid()) ;

で、再現時の表示。

Leave fork() child 118 pid=1084043 ppid=1116743 #親プロセスは1116743
Leave fork() child 119 pid=1209343 ppid=1116743 #親プロセスは1116743
Leave fork() child 120 pid=1941355 ppid=1116743 #親プロセスは1116743
Leave fork() child 121 pid=1198759 ppid=1116743 #親プロセスは1116743
Leave fork() child 122 pid=1116743 ppid=1813339 #何故か1116743に対してfork()の戻り値が0に!
Leave fork() child 122 pid=1954379 ppid=1116743 #親プロセスは1116743
test>

んー、当たりっぽい。でも、何故?

そんな訳で、今の所問題の無い20040206版のスナップショットのwinsup/cygwin/fork.cc と手元の最新20040520版のそれとをdiffってみました。取りあえず直感で関係ありそう な差の部分に網を仕掛けてみる事を考えました。
fork.cc:fork_parent()という関数の中で、 「forked_pid = forked->pid;」なる行があり、fork_parent()の戻り値は エラー時は-1を返し、そうでなければこのforked_pidを返す様になっています。 で、このforked_pidには何が入るかというと、forkした子プロセスの プロセスIDが入っている様でした。で、それは仕様としては正しそうです。 で、20040206版との差分の話との関係なのですが、20040206版では最後 正しかった時の戻り値は「return forked->pid;」で直接値を戻している のに対し、20040520版では先に述べた代入されたforked_pidをずっと保持 した後で、「return forked_pid;」としていました。で、途中で forked_pidを更新したりしてないのかという点を気にしてみましたが、 fork_parent()内では更新している節は見当たらず、他で更新しているのかも はっきり判らなかったので、網かけしてみる事に。
fork_parent()が正常終了する直前に

  if( forked_pid != forked->pid ){
    api_fatal ("Illegal PID _pid=%d, ->pid=%d", forked_pid, forked->pid);
  }
  
  return forked_pid;

などと入れてみました。こんなのに引っかかる訳無いか.....などと自分で 突っ込み入れながらスナップショットのconfigureで再現させてみた所、 思いっきり引っかかったりして(^^;

checking for limits.h... yes
checking for stdlib.h... yes
checking for malloc.h... C:\CYGWIN\BIN\SH.EXE (1531967): *** Illegal PID _pid=0, ->pid=1520295
make: *** [configure-libiberty] Error 1
cygwin-snapshot-20040520-1> 

何故だか判りませんが、forked_pidが0になってます。で、これにより 親プロセスのfork()実行の戻り値が0になってしまう為、ヘンテコに なるという事で辻褄が合うという感じ。問題は 「一体どこでforked_pidとforked->pidの食い違いが発生するのか さっぱり理解できない」という点なのですが(激汗;;;;

取りあえず、forked->pidの方は使えそうな気がするので、 returnではforked->pidを使って みる事にしてみました。要するに20040206版と同じにするという事です。 ........スナップショットのビルドでコケなくなりました。なんとなくイイかも。

かなりいいかげんな推測ですが、forked->pidで値を参照する際、 その元の値をセットするのは、別プロセスかスレッドで、正しくは そのプロセスかスレッドが値を更新するまで待ってから参照しなくて はならないのを、早く参照し過ぎてたりするのかなぁと思ったり。 ソフトウェアの世界でそう言うのかは知りませんが、デジタル回路 で言う所の「レーシング」という奴が起こっているのかなぁと。 で、マシンが速いとか、OSのスケジューリング性能が良い場合、 別スレッドによるセットがすぐに行なわれるので殆どの場合問題 無かったりするのですが、他でプロセス動かしまくりとか、 パイプで瞬間的にfork()を大量実行する場合などに、この更新が ギリギリアウトで間に合わなかった時に、不具合が 露見するという感じなのかも。なもんですから、相当に選ばれた 環境でないと再現しないかも知れません。選ばれた私はたまったもの ではありませんが(T_T)。この推測が当たって いたとすると、今回行なった直し方も厳密には絶対大丈夫と いう訳ではなく、変な負荷をかけるとやっぱりダメだったりする かも知れません。先にも述べました様に、正しい値が確定するまで 待つというのが正解だと思われます。

2004/05/21

出張。帰着。ふぅ。

httpdの怪しげなところを当たりを付けて、CYGWIN.DLLを コンパイルオプション-gで再コンパイルしてみたり。ところが ソース表示と実際に止まっている部分との対応がイマイチ正しく 付いていないような気が.....。自前のプログラムで同様の 事をやると大丈夫そうなので、何やら基本的な部分が正しくない ような予感がしてみたり。
そんな訳で、apacheの再コンパイルをしてみる事にしたのですが、 Cygwinでパッケージされたapacheのディレクトリ構成にはどうやっても ならず。しかたないので、/tmpにインストールしてみたのですが、 それだとユーザー名がよろしく無いような旨のエラーメッセージが 出て起動できず。むぅ。

2004/05/20

出張。

2004/05/19

出張。

2004/05/18

出張。

2004/05/17

出張。

2004/05/16

昼過ぎ起床。

CGIからのDBアクセスも実験したいと思い、httpdを起動して みた所、何故か赤○白×の窓が開いたり。一応ローカルサーバーと しての反応は見せるものの、ブラウザからアクセスがいく度に 赤○白×窓が開いて、なにやら怪しげな事になってました。 cygwin.dllの影響があるのかと思い、 スナップショットのアップデートを試してみたのですが、 解決せず。それよりも、最新のスナップショットを使用すると、 Cygwin自身のビルドがconfigureエラーでできない為、そちらの 方が問題なのですが。真面目に調べないとダメかなぁ.....

という訳で少し調べてみる事にしました。現象としては、 cygwinのビルドを行なった時、一発目のconfigure実行終了の後、 makeを実行するとlibibertyのconfigureが実行される事になりますが、 このlibibertyのconfigure実行中の不特定位置で configureのshプロセスが、 何事も無かったかの様に途中で終了してしまい、その後の makeでMakefileが無いのでビルドに失敗する....という 感じの様です。現象が決まった位置で発生しない事と、 エラーしないでプロセスが無くなってしまう様なので、 トリガも無ければ、おかしな状態にあってもプロセス終了で 状況証拠も消えてしまうという点がやっかいです。
そんな訳で、fork()テストのプログラムを使って、fork()を 何度も繰り返してみた所、二度ほど親プロセスが途中で終了して しまう現象が再現したのですが、それっきり。むぅ。

httpdの方はgdbで追っかけてみた所、segfaultで死ぬ模様。 cygwin1.dllのthread.cc:verifyable_object_isvalid() 周辺が怪しそうな予感。

2004/05/15

夕方頃起床。寝過ぎ。

本屋に。PostgreSQLの参考書とperl DBIの教科書を探してみたり。

先日のテストスクリプトをいじって、へっぽこの日記をDB化するスクリプト を作ってみたり、SQLの検索機能を使ってキーワード検索し、文字列を含む 日付けの日記を整形出力するスクリプトを書いてみたり。でも、 日記程度の量であれば、文字列検索しても一瞬で終ってしまうので、 grep検索と比べてもその差が殆ど判らなかったりして(^^;

後、思ったのは、select文とかで使う 演算や検索式の指定の仕方が イマイチ判りにくく感じました。自然言語を意識していると思われる 部分がある為、例えば大なり小なりは「>,<」とかを使うのですが、 ANDやORは「AND,OR」という様にアルファベット表記だったりする ようです。なもんですから、whereのような句と式の区切りがよく判らない為、 例を見ても、どこからどこまでが検索式を示しているのか 判りにくい様に感じました。まぁ、慣れの問題でしょうけど。

何気にrowを追加しては削除してというのを繰り返すリグレッションテスト っぽい事を行なっていたら、いきなりDBとのコネクションが切れたり(^^; 不安定というのは、こういう事を指しているのかしら?

2004/05/14

出張。帰着。ふぅ。

PostgreSQLをperlからアクセスする方法を調べてみたり。 どうやら、DBIやDBDといったDBアクセスモジュールをインストール する必要があるようで、ダウンロード&makeしてみたり。 make中、なにやらDLLを生成する様なのですが、DLL生成のコマンドが うまくないようで、エラーで停止してDLLが生成できず。 手動でDLLを生成するべくWebで手順を調べてみたら、最近はcygwin上でも gccで直接DLLを生成できる様になっているらしく、 調べた手順を参考にDLLを生成してみたり。以下DBDの makeで行なわれるハズのPg.dllの生成を手動で行なった例。

 gcc -shared -o Pg.dll Pg.o dbdimp.o quote.o types.o -o Pg.dll \
  /usr/lib/perl5/5.8.2/cygwin-thread-multi-64int/CORE/libperl.dll.a \
  -Wl,--out-implib=libPg.a

そんな感じでDBIとDBDをmake installして、 こちらのページの CGIによるDBアクセススクリプトを、CGIではなくコマンドラインで 実行してみたり。取りあえずOKそう。

% ./test.pl | w3m -T text/html -dump
Content-type: text/html

データベース接続テスト

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
┌───┬───────┐
│ NAME │    E-MAIL    │
├───┼───────┤
│tane  │aa@bb.cc.dd.ee│
├───┼───────┤
│tane2 │ff@gg         │
├───┼───────┤
│hoge  │hoge@gefu     │
└───┴───────┘

ぽちぽちいじってみようと思うのこころ。

2004/05/13

日付け越え。

思うところあって、PostgreSQLを使えないか試してみたり。 Cygwin版は何気にインストールしてあったりしたのですが、 これまで全く縁が無くて一度も起動する事は無かったので、 Webを回って起動方法を調べてちょろっと試してみたり。 Win98で使用すると不安定だとか、怪しげな事が書かれてたり もしたのですが、一応DBを生成する事はできたので、なんとなく 使えそう。

work2> psql -n test
Welcome to psql 7.4.1, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# create table tmpdb (number serial not null primary key, value varchar(254));
NOTICE:  CREATE TABLE will create implicit sequence "tmpdb_number_seq" for "serial" column "tmpdb.number"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tmpdb_pkey" for table "tmpdb"
CREATE TABLE
test=# insert into tmpdb(value) values('test message');
INSERT 17168 1
test=# insert into tmpdb(value) values('日本語テスト');
INSERT 17169 1
test=# select * from tmpdb;
 number |    value     
--------+--------------
      1 | test message
      2 | 日本語テスト
(2 rows)


perlなどからDBアクセスする実験はまた後日。

2004/05/12

出張。その日帰着で日付け越え。ふぅ。

スキニングについてぼんやり考えてみたり。曲げ時の頂点座標 変換の際、メッシュが伸びる側と縮む側の2種類が発生する 事になると思いますが、縮む方の側を伸びる側とは違う方法で うまく縮めれば良いような気がしてきました。 因みに、Gemsに載っていたスキニングの サンプル画像は、何故か筋肉モリモリの腕がサンプルモデルと なっていて、縮む側の変形がモデルでうまくごまかされている ような写真になっています。
曲げ鋭角が鋭ければめり込みにより見えなくなってしまう所 なのでしょうが、ごまかす事が目的ではないので、ここはひとつ うまい方法を見つけたい所。そんな感じでジッと腕を見る......

そういえば、今の所に引っ越して以来、ずっと畳の上に座って 背中を丸めながらキーボードを打つ生活なのですが、ここ最近 この体勢が非常に辛くなってきました。ほんの20分程度ディスプレイ に向かっただけで猛烈な肩凝りが発生します。 椅子が欲しい物欲が湧いてきているこの頃。

2004/05/11

今日も具合悪くて死亡。暑いのに寒いという体温調節不能な感じが イヤな感じ。

ボーンとスキニングとモデリングについてWebを検索してみたのですが、 あまり良い資料は見つからず。即ち、商用の3Dソフトでは、そこんところ はあまり問題にならないという事なのかも知れませんが。

2004/05/10

いきなり具合が悪くて死亡。

ウイルス作ったドイツの高校生が捕まったり、ファイル共有ソフトの 開発者が逮捕されたり、なんか難儀な世の中になってるなぁと思ったり。 ウイルスの場合、あからさまに怪しいメールが届いたりするにも かかわらず、訳判らずなんでもかんでもホイホイ実行する人ってのは 居る様なので、どちらかというとそっちの方をどうにかした方が良い 様にも思えますが それはそれとして。ファイル共有ソフトの方は、 それ自体では捕まる要素は無い様にも思えるのですが(金物屋が売った 刃物で魚をさばかず人をさばいても金物屋が捕まる事は無い)、 著作権侵害を助長する「発言をした」事の方が要素としては大きいみたい です。果たしてそれだけが条件なのかどうか....
それにしても、ニュースなどでは何の説明も無く「Winnyを開発した....」 みたいに報道されていたのですが、普通に聞けば何の事やらさっぱり 判らない言いまわしだと思いました。今の世の中それで意外と通じる ものなの?とか思ったり。

2004/05/09

昼過ぎ起床。

POV読みいじり。昨日からごちゃごちゃといじり回して、分散変形を 仕込んでみたり。色々ハマりながら仕込み完了。ボーンの始点と 方向を定義しておき、その二つからなるボーンの線上に各頂点を 投影した時の、ボーンの始点から投影点までの距離を変形割合として、 回転率に使用してみました。 腕の様に筒状のものに筒のまま変形範囲を塗り分けると内角に アールが付くので、伸ばす部分をサロンパス状に塗り分けるた方が 良さそうなどの試行錯誤はありましたが、結果は次の様な感じ。

[鈍角曲げ] [鋭角曲げ]

以前のものよりも、 鋭角曲げの感じが良くなっているような予感。 あと、ひねりに対してもそれなりに反応を示す様になったので、 胴体の曲げやひねりについても、それなりの結果が得られる様です。

[胴体ひねり] [胴体ひねりPOV] [ハイポリ]

でも、曲げ率は等分割の円周上での座標変換なので、ハイポリでの曲げを 見ると、ひじなどの曲げが丸くなっており、期待値とは異なるという感じ です。

[ハイポリ鋭角曲げ]

ただ、人体モデルとした場合の曲げとしては期待値と異なる訳ですが、 機械的なモデルであれば、間違いとも言いきれない場合があるかと思います。 この辺、一般的なボーンシステムでは、パラメータで曲率などを変更できる 様になってるのでしょうか......

そういや、変形後の形状ができるだけ破綻しない様にモデリングの方で、 考慮しておくテクニックというのがあるのかしら?と思ったり。例えば、 現在TANEがモデリングしてある人体モデルでは、腕は下に降ろした状態が初期モデル となっていますが、これだと腕を上げた場合に、肩の変形具合がよろしく 無かったりします。CG雑誌などを見ていると、モデルの基本形状は 腕を左右に広げた状態が初期形状となっている場合が多い様で、 確かにこの方が、腕を下ろすにも上げるにも前に出すにも、中間位置から の曲げ角度が同じになるという点では、良いモデリングだと思えます。 少し調査してみようかしら。

2004/05/08

昼過ぎ起床。

POV読みいじり。ぼんやりクォータニオンのコードを眺めていて、 次のような事ができないか考えてみたり。ある初期回転量qaに 差分回転量qdを加えた合計回転量をqsとした時、qsからqaを引けば 差分回転量qdを逆に導き出す事ができるハズです。では、実際に qdを導き出すには、どうすれば良いでしょう?
回転量を「加える」には、実際にはクォータニオン同士の乗算を 使用します。

  qa * qd = qs  (式1)

なので、qaの逆数をqsに掛ければ良いと思われますが、逆数って? という状況に陥ったり。そこで、式を変形してqsからqaを導き出す 方向を考えた場合、次の様にするのが良いと思います。

  qs * ~qd = qa  (式2)

この時の'~'は共役クォータニオンを示すとします。これ、どういう イメージかと考えてみました。共役クォータニオンはベクトル部分の符号 を反転したものを指します。つまり、qdと~qdでは回転量は同じですが、 回転軸の方向が真逆という関係です。式1を式2に代入すると、qa*qd*~qd=qa という事になりますので、結果、順方向に回して、それを逆方向に回して 元のままというイメージになると思います。 という訳で、式の展開結果から 共役クォータニオンは逆数として考えて 良さそうな予感。
で、元に戻ってqdを求める事を考えていたのですが、数学的な証明が イマイチできてないのですが、

  ~qa * qs = qd

とすれば良いようです。まぁ、回転量の差は積み上げていく過程で 一度は出てくると思いますので、それを保存する様にすれば、結果から 差を求める用件というのは殆ど無いような気もしますが(^^;

話題は変わって、クォータニオンで表される回転量を任意の割合で 変化させる事を考えてみました。クォータニオンが保持している 回転量(即ち角度)は 2*acos(q.n) より簡単に求める事ができます。 回転角度を変化させるだけなので、クォータニオンのベクトルの 方向は変化させる必要はありません。よって、角度だけを再設定 するには、

  q_new.v  = Normalize(q_old.v)
  q_new.n  = cos(2*angle)
  q_new.v *= sin(2*angle)

という感じで行なえば良いです。結局、クォータニオンから角度を 取りだし、その角度を任意に加工して、角度だけを更新するという 感じでしょうか。この方法、行列だと簡単には行なえないような気が します。

何故、前述のような事を考えたかというと、「GAME PROGRAMMING Gems」の コンテンツの中にスキニングについての文書があるのですが、 変形量(文書中では頂点移動量という事みたいですが)に頂点位置で 変化する「ウェイト」という係数を掛けて、変形量を複数の頂点に分散 させる事で、自然な曲げを表現するというものでした。ただ、 おおかた私の理解能力の問題なのですが、 文書中では、この「ウェイト」は具体的に表現されておらず (つまらなさの単位を1Mr(*1)とするような感じ)、 イメージは判るのだけれども 結局実装するにはどうすれば? という点が、イマイチよく判りませんでした。で、 クォータニオンを使えば、回転角の増分を後から取り出す事が できるので、それを利用すれば変化率による回転量の分割が 可能なのでは?と思ったのがきっかけです。

でも、どう使うのがうまい方法なのか?という点が整理できて なかったりして、脳内のムダ知識領域に入ったままになっている のがダメダメなのですが(^^;

(*1) つまらなさの単位1Mr(マロン)
殻を剥かれてしまった甘栗に感じるつまらなさ。 「新しい単位[カラー版] 世界単位認定協会編」より。

攻殻2ndGIG鑑賞。ぴひゅー、今回も濃密で見ごたえあります。 除々に話が本題に入ってきているような、そんな予感。

2004/05/07

出張。帰着。ふぅ。

POV読みいじり。ハタと気づいたのですが、 以前考えた魚の骨を 定義して、それを元に変形させる事をインプリメントしようとした所、 曲線を複数の線分で直線近似した時に、移動前の線分と移動先の線分 とのなす角は求められるのですが、「線分のひねり」の情報が 無いなぁという事で、簡単に座標変換できなくて悩んでみたり。 むむ、平面で考えると、必ずこの軸ひねりの考慮が抜けてしまう辺り、 慣れが足りません。

2004/05/06

出張。

2004/05/05

昼過ぎ起床。

COOL GIRLのICE編をASKAで進めるExtraGameを試していたり。 流石に挿入されているムービーがASKAになっているという事は ありませんでしたが(^^;。ICE編の一番最初のストーリーでは、 対ヘリ戦があるのですが、やっぱり刀では勝負できず、どうやりゃ 良いのだ?と思ったのですが、こうすれば良いですか、そうですか、 そんな感じ。でも、クリアしたら「ランクE(最低)」で何故?!とか 思ったり。

ひさびさに「トリビアの泉」を観たり。トリビアの種、「日本刀と ピストル、強いのはどっち?」というバカバカしいものでしたが、 日本刀でピストルの弾が真っ二つという結果に驚愕致しました(<何故丁寧?)。

COOL GIRL。攻略本を買うきっかけになった、ICE編の最初の方の仕掛け ですが、これ、跳ねかえり弾を撃てないASKAの場合はどうすれば?

POV読みいじり。関節プリミティブに従って頂点グルーピングを行なう為 の仕込みを入れてみたり。

2004/05/04

昼過ぎ起床。

飲み会はどうかなぁという事でKOJIさんにお電話。どうやら今日は みなさんのANDが取れなさそうという事なので、軽くお食事をする事にしました。

そんな訳でCOOL GIRLを進める事にしたり。ところが割とあっさりクリア。 以前、攻略掲示板を巡った感じではASKA編の方が難しいと言われていたの で、かなり身構えていたのですが、各ステージに必ず固いボス戦のある ICE編の方がよっぽど難しかった様に思いました。
そんな感じで感想など。なんかすごく久しぶりにアドベンチャー ゲームをやったという感じです。何か取っては前の場所に戻ってを繰り返し、 行ったり来たりする辺りは昔のアドベンチャーゲームそのもの。それでも、 重要な部分に来ると、自動フォーカスで何かある事を示したり、得られた 情報を自動メモに記憶したりという点は、最近のゲームらしい親切設計 という感じです。昔のゲームだと、ヒント無し、自動メモ無し、自動マッピング なんてもってのほか(もちろんハードの制約の都合というのはありますが)、 ガビガビのグラフィック上を1ドットずつずらしながら「調べる」を 実行しつづけるという感じだった事を考えると、昔のゲームって 理不尽な難しさの方が、割合としては多かったような気がします。 それから言うと、理不尽な謎解きが極めて少ないという点で、全然楽勝という感じ だったかも(と言いつつ攻略本買ったりしたのは置いといて(^^;)。 そんな感じで個人的には、ハマリ度が高く良い感じでした。先に進めないと ほったらかしになってたかも知れませんが、それはそれとして.....(^^;。

因みに、このCOOL GIRL、ゲーム画面上の背景オブジェクトのテクスチャに、 動画が貼られていたりします。このテクスチャとして使われている 動画は、Macromedia Flash-MXで作成したものを、そのまま動画テクスチャ として貼りつけているとの事です。サイバー空間では、それこそ全面動画テクスチャ という派手な画面になっているのですが、特別処理落ちする事など 無かったので、「へぇ、こんな事できるんだぁ。」などと感心して みたりしました。背景の端末モニターの画面など、かなり細かな所まで 動画テクスチャで表現されており、その作り込みには驚きです。

そんな感じで飲み出撃(飲みなのか?)。結局KOJIさんと二人になった らしい(^^; 行きの電車の吊革で懸垂をする女子学生(異人さん)を見たり。
合流後、新宿のバド屋に。連休中日、天気も悪いという事で かなり込んでて待たされてみたりしましたが、ほどなくして入店。最近の 出来事やら、3D系の話やら、グラフィックハードの話やら、コーディングの話やら、 彩の話やら、他、色々。そんな感じでまた次回。終電帰着後、攻殻SAC観て寝た。

2004/05/03

昼過ぎ起床。

ぐうたら過ごして、COOL GIRLを進めたり。死にまくりでどうにかボス戦をクリア し、その後もコンティニューを繰り返していたら、いきなりハングった のでリセットしたところ、ボスクリア前まで戻されたりしてぐったり。

ちょっと寒くなったのでゴロゴロしていたらいつの間にか寝こけてたり(汗;

そういや、ごくたまにTVで声を聞く事があったのですが、 今日初めて名前を知ったり。その人の名は「山崎バニラ」というの ですが、アニメ声というよりは、変調フィルタがかかっているような 感じのする不思議な声色の持ち主です。この声、どこかで聞いた事がある ような無いような.....と思っていたら、あれ、モジブリボンのCMの あの声に似てる、そんな発見をしたりする(合ってるのかは知りませんが) そんなどうでも良い一日。

2004/05/02

昼過ぎ起床。昨日は結構早い時間に力尽きたので、12時間ぐらい 寝てる事に。寝過ぎ(^^;

連休中の生活資金をリロードしたり本屋に行ったり。

ファミ通WaveDVDを見たり。「エースコンバット5」の背景の異常な 綺麗さに驚いたり。そういや何気に5作目という所に、地味に人気の あるシリーズだったりするのか?などと思ってみたり。 その他、「グラディウスV」とか個人的にチェック。背景のポリゴン化 とかレーザーとか、見た目は今風になっている感じです。とは言っても、 グラディウスシリーズは「III」のアーケード版から(IIIのスーファミ版は 普通に遊べましたが)全く歯が立たなくなったので、そちらの方が 問題かも(^^;
そして何よりこれでしょう、SIMPLE 2000 シリーズ Vol.50「THE 大美人」! ”巨大アイドル北上中!”とかいう謎のアオリも、 画面を見れば一発解決、バカバカしさ汁あふれまくりのタイトルです。

「COOL GIRL」を進めたり。遺跡ステージより前は、そんなに難しい感じ はしなかったのですが、急に難しくなってきたような気がしたり。

Webぐるぐるしていたら、GIレンダラ「lucille」の開発を行なって らっしゃる藤田さんのblog( 2004/05/02)に、PowerPC G4/G5に搭載されている AltiVecのパフォーマンス解析化ツールの事について書かれていたり。 パイプラインのサイクル解析が可視化されており、こりゃスゲー と思ったり。Mac OS Xになって、開発ツールとか比較的容易に 入手可能な様なので、興味の尽きないところです。
ところで、三角形交差判定での性能比較の話で思ったのですが、 G4-1.25GHz:PentiumIII-800MHz=6700万:(2000万〜3600万)=(3.35〜1.86)倍 という計算になりますが、クロック周波数比が1.56倍ある事を考慮すると、 AltiVecの効果は最小で1.2倍という感じになる様で、PentiumIII-800MHzの1.2倍 という値は今だと達成されているような気がしてみたり。 G4での話なので、G5だともう少し良くなっている要素もありそうですが、 劇的な性能改善が期待できるかと言うと、ビミョーな感じにも思いました。 ただ、PentiumIIIの値に、MIN:MAX=2000万:3600万=1.8倍の差があり、比較の対象と するには少し正確さにかける気はしますが。POV-Rayとかのような、 マルチプラットホーム対応可能なソフトウェアで性能比較したネタとか どこかに無いかなぁ。

POV読みいじり。先日の問題は冷静に考えるとなんて事は無いという 結論で対応してみたり。さて、本題はこれからなのですが。

COOL GIRLを進めてみたり。そして思いっきりハマってみたり。

2004/05/01

出張。帰着。ふぅ。取りあえず連休モードに移行できました。

POV読みいじり。ある関節ノードに属するオブジェクトに対して、 一部の頂点はそのノードの親ノードまでの回転を反映し、他の 頂点は自ノードの回転を反映するという操作を行ないたかった ので、単純に自ノードの回転を一番最後にするかしないか判定 するだけじゃんと思っていたのですが、ツリー構造の葉の方向 から幹に向かったり、幹から葉に向かったり、行ったり来たり してて、あれ?結局、自ノードの一つ上のまでの回転量は どうやりゃ求まるのだ?と、混乱してみたり。


TOP PREV