昔の最近の出来事(2004.04)

2004/04/30

出張。

2004/04/29

出張。

2004/04/28

出張。

2004/04/27

出張。のハズが新幹線が強風の影響か何かで停電停止していて、しかたなく 引き返してきたり。

gccのテスト。povrayをPPCクロスビルドしてppcsimで 実行。コンパイル結果としては大丈夫そう。で、命令数だけの 比較を行なうと、gcc-3.3.3でのコンパイル&実行結果に対して 6.2%程度命令数が減っていました。実時間にするとどれだけ効く のかは判りませんが、かなり改善率の高い結果の様に思います。
あと、ポリゴン描画テストコードも試してみました。こちらは 整数演算だけのコードなのですが、gcc-3.3.3でのコンパイル&実行 結果に対して1.2%程度命令数が減っていました。
命令の系統の使用割合はgcc-3.3.3と3.4.0とではどちらも変わらず、 見た事の無い命令が極端に多く実行されているような事は無い様です。 他にもPCH(Pre Compiled Header )が正式に取り込まれたりとか、 コンパイラ自体も色々付加機能が付いている様です。そんな感じで、 gcc-3.4.0、イイかも。

2004/04/26

日付け越え前に帰着。

gcc-3.4が出ているのに気づいてダウンロードしてみたり。 でもしばらくしても終らず。

ダウンロードし終わって、PPCクロスビルドでconfigure/makeを 仕掛けて寝る。

2004/04/25

昼過ぎ起床。

ぐうたら過ごして一日終了。

POV読みいじり。変形の仕込みを入れようと思った所で、 データ構造上うまく表現できない部分があったり。むむ。

そういや、宇多田ヒカルの旦那が創った映画「CASSHERN」ですが、 TVとか見てても、宇多田が歌っているとか、夫婦で出てきたのが初めてだとか、 そういった所ばかりが取り上げられてて、作品の内容に関する 話が殆ど無いのにガッカリしていたり。

昼間、ぐぅたらしながら見ていたTV番組(の再放送)で、普段使っている 言葉や当たり前だと思っている事で、改めて聞かれると答えづらい 疑問なんかをクイズにした番組をやってました。その中で 「本屋で立ち読みしているとトイレに行きたくなる」という話がありました。 私はそういう現象に遭遇した事は一度も無いのですが、 その現象がとある雑誌の投稿欄で 最初に掲載され、多くの人の共感を得た事から、投稿者の名前を 取って「青木まりこ現象」と言うらしいです。因みにその現象を 生ずる原因は、立ち読み時に目線が下向きになる事により、 まぶたが伏し目気味になると、まぶたの状態と関連のある腸の働きが 活性化され、結果、便意を もよおすという事らしいのですが、本当の所はよく判っていないみたいです。 どれだけトイレに入る人が多いかという事で、本屋と本屋以外の店に定点 カメラを設置して人数をカウントした所、圧倒的に本屋でトイレに 入る人が多かった(本屋で2時間あたり70人というのに対して、他では 10人以下)という結果が得られていました。でもTANEが思う 所、調査に使用された本屋は「神田の三省堂」である為、あの辺の 地理から言うと単位面積当たりのトイレ設置率が極めて低い、 例えるなら「秋葉原のLaox Computer館」という感じ(<判りにくいよ)である 所から、参考になるのかどうかが少々疑問に思ったりもしました。
他にも「うんともすんとも」の「うん」と「すん」て何?とか、 「コク」って何?とか色々ありました。前者「うんすん」は 先日、「エンタの神様」で「すん」て何よ?というのをネタにして いた芸人が出てた辺りが個人的にタイムリーだったりして(^^; 語源は「うんすんカルタ」という 江戸時代に流行ったカルタが元になっていて、ゲーム中、 「うん」とか「すん」とか言いながら進める(麻雀の「ポン」とか「ロン」とか そういう感じ?)ものらしいです。で、「うん」と「すん」は、カルタの 札の中にそういう札があって、ポルトガル語で「うん」が一番、 「すん」が最高という意味があるとの事でした。「言わなくなった」というのは、 江戸幕府の禁止令により、博打にあたるこの「うんすんカルタ」 が全国的に禁止された事から、自然に消滅していったという事 らしいです。そういう背景から、何か作用させる事で反応しなく なった状況に対して、「うんともすんとも言わない」という 慣用句が生まれたという事の様です。13へぇ。

2004/04/24

朝割と普通に目覚めたのですが、その後ぐぅたら寝倒したり。

そんな訳でCOOL GIRL ASKA編をちょっと始めた所、 思いっきりハマって風呂の水を溜めていたのを忘れてしまっていたり(汗; ICEとの大きな違いとして、アイテムのフックを使う事で相当に 高い位置に上がれたりします。なもんですから、ICEの時は大体その辺を見渡せば 足がかりがあり、移動範囲がある程度制限されていたのに対して、ASKAの方は 自由度が高くなっている予感がします。ヤバいです。

久々にPOV読みいじり。と言っても、初期姿勢からの回転角を回転行列で 保持していたのをクォータニオンに置き換えてみただけ。
メリットとしては、回転量を生成するのに 行列よりも クォータニオンを使用した方が計算量が少なくて済む点と、 4×4の行列の掛け算に比べるとクォータニオンの掛け算を使用した方が計算量が 若干少ないという点だけかも。3×3行列だとクォータニオンの掛け算の 方が計算量が多いのですが、回転量の生成にかかる計算量が少ない ので、トータルで見るとクォータニオンの方が若干お徳という感じ。
しかしながら、メッシュの回転は「回転クォータニオン」 を「回転行列」に変換して、変換した回転行列を使用して メッシュの頂点座標変換しているので、 結論として、クォータニオンを使用する事自体は速度向上に 殆ど寄与していません(^^;;

2004/04/23

出張。帰着。ふぅ。

COOL GIRL。攻略本の力を借りて(^^;どうにかICE編をクリア。 これ、ノーコンティニュークリアするのは多分無理。そんな感じ。

2004/04/22

出張。

2004/04/21

出張。

2004/04/20

回復せず今日も死亡。

2004/04/19

具合が悪くなって死亡。

2004/04/18

昼過ぎ頃起床。ぐーたら過ごしてみたり。

Cygwinのスナップショットをビルドしていたのですが、どうにも最新版を 入れた所、Cygwinの再ビルド(最新版を使って再び自分自身をconfigureから 実行)がうまくいかなかったり。configureが通らないというものですが、 ハングしたりcygwin1.dllのメッセージを出して止まったりという感じでは ないので、謎。
以前、Cygwinのアップデートを かけた時、configureが通らなかったりと謎が多かったのですが、 最近はファイルハンドラ周りをいじりまくっている様なので、その影響を 受けている様な気がしなくもない所。

COOL GIRLやって、疲れてちょっと横になったら思いっきり寝てたりして(汗;

TVをだらだら観たり。「バンパイアホスト」が面白いなぁなどと微妙に はまっていたりするこの頃。

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

2004/04/17

夕方頃起床(滝汗; 寝過ぎ。

COOL GIRLやって時間があっという間に過ぎ去ったり。

モンテカルロ法。普段、一意に答えの求まる問題しか扱った事が無い ので、あまり縁の無い方法だったのですが、Webで調べてみると 円周率を求める例があったので試してみたり。辺の長さが1.0の正方形 の中に内接する円を描いた時の、 円の面積と正方形の面積の比を式を変形して求めるというもの。 この時、正方形内にランダムに点を打ち、その点が円の内側にも入る割合 を 円の面積:正方形の面積 に当てはめます。生成される乱数に 片寄りが無ければ、十分な数の点を打つ事で面積比が徐々に正確に なっていくというものです。

#define RADIUS (0.5)
int main()
{
  int    j  ;
  double pi ;
  long long int i,n,sum ;

  for( j=0 ; j<10 ; j++ ){
    n=pow(10,j) ;
    sum=0 ;
    for( i=0 ; i<n ; i++ ){
      double x,y ;
      x=genrand_real1()-RADIUS ;
      y=genrand_real1()-RADIUS ;
      if( sqrt(x*x+y*y)<=RADIUS ){
	sum++ ;
      }
    }
    pi=(double)sum/(double)n / (RADIUS*RADIUS) ;
    printf("sample=10**%d : pi=%f\n",j,pi) ;
  }
  exit(0) ;
}

genrand_real1()は0〜1.0までの実数の乱数を返す関数です。 実行すると次のような感じ。

sample=10**0 : pi=4.000000
sample=10**1 : pi=2.400000
sample=10**2 : pi=3.200000
sample=10**3 : pi=3.108000
sample=10**4 : pi=3.152000
sample=10**5 : pi=3.136840
sample=10**6 : pi=3.142000
sample=10**7 : pi=3.141650
sample=10**8 : pi=3.141623
sample=10**9 : pi=3.141667

小数点以下5桁くらいまではすぐに求まるかと思ったのですが、 意外とサンプル数が多くないとダメな様に感じました。

あと、「モンテカルロ」の由来について次のような事が書いてありました。

------
第二次大戦中、アメリカのロスアラモス国立研究所で、
コンピュータの父と呼ばれるJohn von Neumann氏らが
中性子が物質の中を動き回る様子を探るために考案した
手法が起源とされる。そのときこの手法を「モンテカルロ」
という暗号名で呼んだそうだが、これはギャンブルの国
モナコの首都モンテカルロから取ったと言われている。
------

へぇ。なるほどねぇ。

2004/04/16

出張。帰着。ふぅ。

COOL GIRLをちょっと進めるつもりが思いっきりハマっていたり(汗;

2004/04/15

出張。

2004/04/14

出張。

2004/04/13

出張。

2004/04/12

出張。

2004/04/11

昼頃起床。

クォータニオンについて少し整理する為のメモ書き。

  1. q=[q0,v]とした時、q0はスカラ量、vは回転軸が指す方向を表す。 単位ベクトルuを任意軸とし、回転角をthとした時、
    「q=[cos(th/2),sin(th/2)u]」と書ける。
  2. 1.を踏まえて、あるクォータニオンqの回転角度を求めるには 「th=2acos(th)」となる。

これらを踏まえて考えると、

  1. 角度thは実数部(スカラ部)と虚数部(ベクトル部)とのなす角。
  2. 回転角度th=0では、回転軸ベクトルは0。
  3. クォータニオン内で保持しているベクトル部は単位ベクトルではない。

という感じ。 「2.」と「3.」の条件があるので、回転軸をクォータニオンから取り出して 使うのは基本的に不可。
クォータニオンでの回転をイメージできていなくて、思い通りに動かす 事ができてません。

本屋に。ちっとも先に進めず延々と同じマップを行ったり来たりしていた 「COOL GIRL」ですが、ついに攻略本を探してみる事にしてみました。 攻略本なんて買ったこと無いのですが、書棚には様々なゲームの攻略本が 唸るほど並んでいて、 世の中にはこんなにゲームがあるのかと改めて思い知ったりします。 そんな感じで、つい最近発売されたらしいコナミの公式ガイドをゲット したり。因みに、その本屋では攻略本はビニールカバーがかかっていて 立ち読み不可だったりしました(^^; 他、出張中の読み物などちょこり 物色したり。 そういえば、クォータニオンの本がありましたが、数学的な説明の要素 が強かったのでそっと元に戻したり。Cによるライブラリのソース が載っていましたが、先日書いた上書きバグを持ったソースコードに なっている様でしたので、実際に使う際には注意する必要がありそう です。

そんな感じで、早速つまづいていた所の説明を読んで、「あいた〜〜〜〜、 その手がありましたか〜〜〜〜〜」そんな感じでありとあらゆる思いつく 方法を試したつもりだったのに、一番単純で明快な方法に気づかなかった 自分に腰が抜ける気分です。という訳で先に進んで、 ちょっと面白くなってきました。

TVを観ながらぼんやり考えていた所、なんとなく閃いたり。
クォータニオンの虚数部(ベクトル部)は3DのX,Y,Z軸に対応すると して、回転角は実数部(スカラ部)の大きさと虚数部の大きさ(ベクトルの長さ) で保持されているという風に考えれば良い気がしてきました。 後、座標を保持する為の数ではなく、座標を変換する為の係数と して使用する事を前提とした方が考え易そうです。つまり、 今の姿勢があったとすると、そこからヨー、ロール、ピッチを どれだけ動かすか(変化量)を表すのにクォータニオンを使用 する様に考えるという感じ。この様に考えると、例えばクォータニオン で表された変化量を glRotateX() を使って表現する場合、 angleはth=2acos(th)で求め、回転軸ベクトルは クォータニオン の虚数部(ベクトル部)を正規化して使用すれば良いという事に なりそうです。

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

2004/04/10

午前中に起きてケロロ軍曹を観たら、またいつの間にか寝てたり(汗;

クォータニオンのテスト。何故か値が期待値と違うという点を 調べていたら、一つは手が滑っていたのですが、もうひとつは 書き戻しのバグが発覚したり。後者の方はHairMakerなど で使用している外積を求める関数とかでも間違えていて、 今使っている範囲ではバグは発覚しないというものでした(^^;
具体的には以下の様な間違いです。

void Quat_MulQV( struct Quat *qa, struct Vec3D *v, struct Quat *qs )
{
  qs->n  =-(qa->v.x * v->x) - (qa->v.y * v->y) - (qa->v.z * v->z) ;
  qs->v.x= (qa->n   * v->x) + (qa->v.y * v->z) - (qa->v.z * v->y) ;
  qs->v.y= (qa->n   * v->y) + (qa->v.z * v->x) - (qa->v.x * v->z) ;
  qs->v.z= (qa->n   * v->z) + (qa->v.x * v->y) - (qa->v.y * v->x) ;
}

qsの実体がqaの実体と同じでなければ問題無いのですが、 Quat_MulQV( &Q, &V, &Q ) ;という様に、qaとqsの 実体が同じ時、qsの演算の過程で入力となるqaがどんどん書き換わる為、 例えばqa->n は最初のqs->nの演算で全く別モノになってしまう ので、以降qa->nを使用する演算は全てメチャクチャくなるという 感じです。驚くほど初歩的なミスです。修行が足りません。 で、それを直してなんとなく回る様にはなった所で、色々試して みたり。でも、何か思っていたのとちょっと違ってみたりで、また 脳味噌がウニ状態になってきたり(^^;;;;

食事のついでに、行きつけのCD屋で攻殻の2ndGIGを購入。 そして鑑賞。んふーーっ。密度の高さは1stの時と全く変わらず、 まだ大きな展開はありませんが、これからの展開が楽しみです。

2004/04/09

出張。帰着。ふぅ。

クォータニオン仕込みの続き。座標変換をするのに必要な分を全て 入れて、printfでもって数値表示でデバッグ。でも、何か変な予感。

「MATRIX REVOLUTIONS」の特典ディスクを観たり。 超高精度なモーションキャプチャーだとか実写との合成部分だとか、 どれも大掛かりなものばかりでスゲーと思ったり。個人的には APUという人が乗って操作する二足歩行の重機みたいなメカが出てくる のですが、動きが全くスムーズでない、本当に重機のような動きなの にも関わらず、乗ってる人の揺れ方とバッチリ同期していて、 どうやって動きを付けているのだろうと思ってました。 実際にはコックピットに相当する部分は実写で、体感ゲームの様な シミュレータ筐体の動きと連動させる事であのような絵になって いるという感じでした。
所で、前作「Reloaded」の時にもそうでしたが、多くのシーンについて、 実写の動きを想定したCGのプリビューシミュレーションが行なわれている様です。 実際の所ここまでやった方が効率が良いのかどうかは判りませんが、 プリビューレベルでも偉く細かい所まで描かれている所に なんかスゲーと思ったりしました。
そういや、映画公開前は、最後の決闘シーンに70億円かかったというのが 話題になってたと思います。どこからを、その部分と指すのかは不明ですが、 TANEがそこだと思っている部分には、あまり金がかかっていない様に 思えたのですが、実際のところどうなのでしょう。

2004/04/08

出張。

2004/04/07

日付け越え前に帰着。

ちょっと気分を変えてクォータニオンを使った姿勢制御の実験プログラム を書いてみる事にしました。でも、時間が無さ過ぎて仕込みをちょっと して終了。むぅ。

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

2004/04/06

出張。帰着。ふぅ。

出張中に 以前 買ったまま積読状態となっていた「ゲーム開発のための物理シミュレーション入門」 をじっくり読んでみたり。と言っても、物理シミュの所ではなくて、 四元数(クォータニオン)についての部分を読んでみました。 これもまた ほぼ積読状態となっている「GAME PROGRAMMING Gems」 で 初めてクォータニオンなるものを知り、回転を表現するのに クォータニオンを用いると、色々と都合が良い事が書かれているの ですが、Gemsの方では数学的にあまりにも簡潔(エレガント)に書かれすぎていて、 私の脳味噌では概念自体がイメージできず理解のかなり外という感じでした。 「物理シミュ入門」の方では、もう少し詳しい事が書かれているのですが、 それでも理解の外という感じだったりします(^^;。くじけそうになりながらも、 巻末付録のクォータニオンの演算ライブラリのソースリストを眺めながら 説明を読むと、なんとなく雰囲気を掴んだような気がしたという感じ になりました(気のせいかも知れませんが(^^;)。

以下、クォータニオンの勝手なイメージ。

  1. クォータニオンはq=w+xi+yj+zk(i,j,kは虚数でそれぞれ向きが違うという 設定らしい)で表されるのですが、この時の虚数部分を3D空間と置き換えて 相互変換するというのが基本みたい。
  2. 回転行列と同じく、クォータニオンの乗算を行なう事で、複数の回転を合成し 保持する事ができるので、クォータニオンでオブジェクトの姿勢を保持する というような使い方をするのが良いみたい。
  3. 3次元座標をクォータニオンを通して回転後座標を得る事ができるのですが、 ここんところは共役クォータニオンとの乗算を行なう必要があり、演算量は 回転行列を使うよりも多くなるみたい。

そんな感じ。ただ、クォータニオンでも回転行列でも、回転するだけに 使用する点では どちらでも同じで、姿勢制御という観点で表現する方法を 考えると、ヨー、ピッチ、ロールを定義して、一つの軸の回転で、他のニ軸の方向を 変更するという方法でないとうまく姿勢を表現できないような気がします。

以前、凹凸のある3D空間上を オブジェクトを移動させて遊んでましたが、その後、凹凸に応じて姿勢 を変えるようにしようとした所、うまくゆかずくじけてしまってました (その後、そのプログラムで書いたベクトルの正規化ルーチンを別の プログラムに流用した所、思いっきり間違えている事が発覚したり しましたが(^^;)。こいつをいじって(というか思惑通りに直して)オブジェクトの 姿勢をクォータニオンを使って制御するというのを試してみたくなった気分。 それができれば次は物理シミュで動きを付けるという感じ?

それにしても、クォータニオン自体は100年以上前に発明された概念 らしいのですが、良い使い道が無かったそうです。この奇妙な概念を 100年以上前に考えた人が居たというのにも驚きなのですが、 それを3D空間の座標変換に使えると気づいた人もまたスゴいなぁ などと思ってしまいます。あれだ、二進数自体はブーリアン代数 で大昔に思いついた人が居たけれど、それをON/OFFに置き換えて 今のデジタルコンピュータへと発展した、それと似ている感じが しました。

2004/04/05

出張。

2004/04/04

昼頃起床。

POV読みいじり。先日の回転行列の件はこれであっていそうな感じ なので良しとしてみたり。一応、共有頂点が割れる事は無くなったので、 これで様子を少しみてみたり。また、POVレンダリングに渡すパスが 無かったので、編集後データをPOV形式に再出力できる様にしてみたり。

[poview鋭角曲げ] [pov レンダリング鋭角曲げ]
[poview鈍角曲げ] [pov レンダリング鈍角曲げ]

まだ、曲げについては何の工夫もしていないので(てゆーか、その工夫をするのが 本題なのに、その仕込みに思いっきりてこずっていた訳なのですが(^^;)、 鋭角曲げの方は二の腕にめり込むような 形で曲がっています。鈍角曲げの方は、poviewのOpenGL表示で見ると 意外といけてそうに見えなくもないのですが、実際にPOVでレンダリング してみると、なんか継ぎ目が気になるという感じになっています。
と、書いてて気づいたのですが、継ぎ目となる異なるテクスチャ属性が 共有している頂点について、変形後に頂点法線の再計算をしていないのに 気づいたので、そこんところを再計算しなおせばもう少し継ぎ目が消える かも?
んーー、ウソかも。伸ばす方は法線の再計算で継ぎ目が消えそうですが、 縮める方は裏返しになったりめり込んだり、変な形になっているので、 法線の再計算をすると余計に酷くなりそうな予感。

行列つながりで「MATRIX REVOLUTIONS」を鑑賞(<つながってねーよ)。 んー、まぁ、あんま考えて観なくて良かったので良いかも。 ただ、最後は平和的解決だったのかどうかはビミョーな感じ。 色々総合すると、あの世界の中では、現実世界で暮らすよりも、 マトリックスの中の方が脳が解釈する暮らしとしては安定していると いう予感がしなくもないなぁ などと思ったりするのは年のせいですか?(^^;
全然関係無い話。以前、洋画DVDは「英語音声+日本語字幕」で観ていた のですが、最近はいきなり日本語吹き替えで観る様になりました。 この時、「日本語吹き替え+日本語字幕」という組合わせで観ると、 これが恐ろしく観るのに疲れるというのを発見しました。 言葉と字幕って意味は同じですが、字幕はやっぱり文字なので、 言いまわしも文章なのです。これと言いまわし(字面)の違うセリフとが 目と耳に同時に入ってくると、 二人の人から同じ内容の事を同時に 話しかけられているような感じになってしまい、結果 それぞれの 内容を順に解釈しようとしてしまうので、次第に追いつけなくなるというのが、 その原因のような予感がします。これが「英語音声+日本語字幕」だと、 TANEの場合、英語はBGMと同様で脳が言語として解釈しないので、 字幕と映像を交互に見るのに疲れるという感じみたい。 えーと、英会話できませんという内容の話でした(^^;

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

2004/04/03

昼過ぎ起床。

移動と回転の行列を掛けていけばそういう位置と姿勢に なるのかと思っていたら、なんかそういう感じではうまく行かず。
しばらくいじり倒し、やっとこさ期待通りになってみたり。 問題は「何故これでうまくいくのか よく判らない」という所なの ですが(激汗;;;;

んーと、ポイントは行列はあくまでローカル座標系で見た時 の座標変換器であるという所でしょうか。例えば、原点からP(√2,0,0)という 方向ベクトルを、X軸を90°回してY軸を45°回すという操作を行なった時、 2度目のY軸はグローバル座標軸のY軸で回すとP(1,0,1)という方向を 向きますが、ローカル座標系のY軸で回すとP(1,1,0)という感じに なると思います。従って、親座標系でもって回転させたい場合は、 子座標から見た時の親座標系のX,Y,Z軸のそれぞれの方向を求めて、 その座標軸でもって親オブジェクトの回転角度を子オブジェクトに 反映しなくてはならないという事です。
それにしても、2Dの場合だと回転軸はZ軸のみなので、回転の 順序など気にする所では無いのですが、3Dだとその順序が違うと 結果が全く違うというのが大変です。特に、親子関係を持ったツリー構造 だと、子から回すか親から回すかで状況が変わったりします。 作図も容易ではありませんので、表現方法なども含めると式で理解するのが 一番良いのかも。でも、行列の掛け算なんかは私には殆どイメージ不能の 世界(一応証明はできましたが(^^;)なので ニンともカンとも。

アップルシードの映画公開前特番を観て寝た。

2004/04/02

出張。帰着。ふぅ。

出張中に行列について調べてみた所、行列の掛け算を行なうと、 複数の行列を合成できるという事を、はずかしながら今頃 知ってみたり(^^;

今まで、行列と言えば見た目を見やすくするために 使っているぐらいにしか思っていませんでした。例えば、 X軸を回す回転行列とか、Y軸を回す回転行列とか、別々の説明 をするのに書く為にといった感じです。所が、X軸を回す行列RotXと Y軸を回す行列RotYを掛けると X軸を回してY軸を回す行列RotXY が生成できるという事なのです!くわっ!(<ぉぃ;)全頂点に 対してX軸を回す行列を通して、Y軸を回す行列を通してとか やってると三軸分行列掛け算を行なわなくてはならないと思っていた事が、 一発で行なえるというのですから使わない手はありません。

そんな感じで行列演算を仕込んで動かしてみたり。イイ感じに 回転してみたり。でも、やっぱ何かがおかしくて思惑と違って いたり。考え直しが必要なのですが、ごちゃごちゃになって 脳ミソは回転せず。むぅ。

2004/04/01

出張。


TOP PREV