トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

独り言日記(2007/05)

独り言日記

明日から数日(2007/05/31)

北海道に行ってまいります。一応はお仕事です。ANAで行くのですが、システム障害は復旧してる、、、と信じています(^_^;;。あのシステムで旅券を受け取るのでちょっと心配してました(苦笑)。

雨は大丈夫かなぁ。観光も入れてるので、携帯写真を取れればと思ってます。初の北海道入りです。さて、どうなることやら。

続続・Shadeのカメラ行列(2007/05/28)

教えていただいて解決です。私の勘違いを披露してしまいました(汗)。

camera_class *pCamera;
pCamera = &(scene->get_camera());

// 傾き
float fBank = pCamera->get_bank();

// 傾きが0のときのビュー座標変換行列を求める
pCamera->set_bank(0.0f);
mat4 wvMat0 = pCamera->get_world_to_view_matrix();
pCamera->set_bank(fBank);

// 傾きがなにか分からないけど、今の行列を求める
mat4 wvMat = pCamera->get_world_to_view_matrix();
 
// 視線ベクトル周りの回転行列を求める <== コレ!!
mat4 eyeRot = inv(wvMat0) * wvMat;

// 「傾き」に値する数値を求める
double a, x, y;
double a_c, a_s, rad;
double PI = 3.1415926535;
double n;
x = (double)eyeRot[0][0];       // cosθ
y = (double)eyeRot[0][1];       // sinθ
a = sqrt(x * x + y * y);
x /= a;
y /= a;
a_c = acos(x);
a_s = asin(y);
if(a_s > 0.0) rad = a_c;
else          rad = -a_c;
n = -(rad * 180.0) / PI;

で計算した「n」が傾きと一致。シンプルなお話でした。これより、独自のビュー変換行列が与えられた場合は、傾きなしのときの行列をあらかじめ求めておいて、上記の「傾き」の値を計算して、Shadeのcamera_classに与えてあげるとアップベクトルを指定したのと同じ動きを再現できそうです。

何をしたいのか、というのは、視点・目標点・アップベクトル・視野角度(fov-h)をcamera_classに渡したい、というものです。視野角度については、Shadeのマニュアルになぜかこれでもかというくらい詳しく書いているので、難なく解決してます。しかし、なんであそこだけ濃いのだろう・・・(^_^;;。

続・Shadeのカメラ行列(2007/05/28)

カメラの方向をいろいろ傾けていたら、どうも下記法則でも傾き算出は違うっぽい。ということで、以下は間違いです。もうちょっと練ってみます。

Shadeのカメラ行列(2007/05/28)

なんか、想定した計算と違う値がどうも出てしまうので詳しく調べてました。

Shadeのメタカメラ(デフォルト)とcreateメニューより配置したカメラはどうも挙動が違うという点が1点。

メタカメラは挙動がよく分からないので、createメニューより配置したカメラの「傾き」ってなんだろう?と思って調べてみました。

単純に考えると、

(ワールド→ビュー変換行列) x ビューでのZ軸回転行列

での後者の回転行列から傾きを割り出せるかなと思ったのですが、どうも合わないです。「(ワールド→ビュー変換行列)」は傾きが0のときの行列と考えてください。

camera_class *pCamera;
pCamera = &(scene->get_camera());

// ワールドからビューのカメラ変換行列を取得。
// これは傾きも考慮されたものが返される。
mat4 wvMat = pCamera->get_world_to_view_matrix();

// 「傾き」に値する数値を求める
double a, x, y;
double a_c, a_s, rad;
double PI = 3.1415926535;
double n;
x = (double)wvMat[0][0];       // cosθ
y = (double)wvMat[0][1];       // sinθ
a = sqrt(x * x + y * y);
x /= a;
y /= a;
a_c = acos(x);
a_s = asin(y);
if(a_s > 0.0) rad = a_c;
else          rad = -a_c;
n = -(rad * 180.0) / PI;

wvMatがカメラのワールドからビュー座標変換行列。で、これの「wvMat[0][0]」をcosθとみなす、「wvMat[0][1]」をsinθとみなす、で度数変換をかけてやります。

これで求めた「n」がずばり、Shadeでの傾きと一致しました。

え〜〜、ってかこれであってるの(^_^;;?

傾き0のときの行列(wvMat0とする)の逆行列を取って、これからZ軸回転を求めて

zRotMat = wvMat * inv(wvMat0);
x = (double)zRotMat[0][0];       // cosθ
y = (double)zRotMat[0][1];       // sinθ

として計算した角度(傾き)のほうが正しいのかなと思ってたのですが。

と思って、変換行列のZ軸成分をみると、目標点と視点から作るベクトルを正規化したものと比較して、傾きがつくと(0のときは同一)異なってるじゃないですか(視線中心回転だからこれはぶれないだろう、と思ってたんですけど。認識違いがあるのかなぁ)。

あいかわらずShadeのカメラパラメータはわからんです。素直に視線ベクトルとアップベクトルを入れた行列をセットさせてくれ〜〜。

サーバのサービスをいろいろアップデートしました(2007/05/24)

tomcat/java/apacheをアップデートしました。問答無用でガシガシサービス止めたりテストしたり、で申し訳ないです。

ということで、ようやくWebサーバ/Wiki/掲示板(サーブレッド)のサービスの動作を確認しました。tomcat 5.5で以前面倒だった設定が楽になりましたね。これでJava6の機能が心置きなく使えます。いやはや、すっきりしました。

ペルソナ3 フェス クリア(2007/05/23)

夜な夜なちょくちょくやってたのですが、クリアしました。クリア時間は37時間ほど。あんまり評判はよろしくないのですが、私としてはおまけエピソードとしてはこれはこれでいいかなぁと思ったりします。ゲームシステムはおいておいて、雰囲気は好きだったりします(まぁ、ゲームとして楽しんでるわけじゃないとはいえるのかも)。

これでしばらくはゲームは封印、かな。NDSの逆転裁判4はやりたいけど、まだNDS自身持ってないので・・・。でも、最近電車でよくNDSやってる人を見ますねぇ。

BBSしばらく停止(2007/05/23)

ft-lab.ne.jpのBBSはJavaで造ってるのですが、Javaのサービスが起動しなくなりました。う〜ん、なんでだろう?リブートしてもダメ。

ちょっと原因探ってみます。データはMySQLに蓄えられているので安心です(先日のデータは残ってました)。ついでにJavaとApacheとtomcatのバージョンをあげてみようかな。

ソフトウェア開発環境展、他(2007/05/16)

東京ビッグサイトにて「ソフトウェア開発環境展」のほか、5種類くらいの展示が開催されていたので行ってきました。今年はなぜかVIPカードをぶら下げて(毎年行っていたからかな?招待状が来てましたので)。

そして、今年も「なんだこりゃ?」という三文字英字が多いのでそれを解説してみます。

J-SOX(日本版SOX法)

これはIT関連の用語ではなく、金融商品取引法の一部規定が厳しくなったというもので、上場している企業が対象です。内部統制報告書の提出・監査が毎年義務付けられてます。単純に言うと、不正な(嘘を書いた、ようは粉飾ですな)会計処理を防ぐための監視体制です。2009年から開始されます。

http://www.atmarkit.co.jp/aig/04biz/jsox.html

当然、経理自体がややこしくなるのでそれをシステム化しましょう、というネタもありました。

SOA

サービス指向アーキテクチャ(Service Oriented Architecture)。検索サービスはYahoo!なりGoogleのバックボーンをAPI的に使用すればよい、なんてのが典型でしょうか。サービス(機能)を分散して、それぞれを組み合わせて利用する、というものです。

SOAPと似てますが、意味合い的には同じような感じですが、「Simple Object Access Protocol」なんで違いますね。ですが、SOAPはSOAの基盤となる技術であるのは確かなようです。

BPM

business process management。ビジネスを進めるにあたっての業務を見極めて(内容別に分離して)、順序良く効率的に管理しましょう、という当たり前の話。または、それを管理するシステムもあります。専門用語にする意味が分からないのですが、ウケがいいんでしょうか(^_^;;。

ただ、業務フロー(開発者であるとプロジェクト管理)を見直すものではありますので、有効かもしれません。ちなみに業務管理とプロジェクト管理は、別システムとしていろいろ展示されてました。

個人的に、インターフェースが開発者向けなものが多く、この部分は工夫すべきでないか、と思ったりします(デザイナの血をシステムにも入れるべき)。少なくとも、一般の人はそんなUIは使いたくないですよ(^_^;;。そのへんは、Webでもまれたシステムのほうがはるかに使い勝手がいいと思います(mixiとかYahooのスケジューラとか)。

「desknet's」は個人的には使いやすいかなと感じてます(ブースありました)。仕事場でもグループウェア的なものがそろそろ必要かも、とか思ったりしてるのですが(今はWikiが大活躍してます)、desknet'sは候補としてあげておきたいです。

Web2.0

私があまり好きではない言葉です(苦笑)。漠然としすぎてますねぇ。あえて説明しません。この単語にとらわれてはいけないと思います。簡単に言うと、今のGoogleでの検索エンジンとかmixiとかがそうなのかな?私が感じるのは「共有」がキーワードだと思ってます。

ただし、くくり方としては疑問ではあります。

NGN

次世代ネットワーク。これ、最近知った言葉なんですが展示内容を見るとどうやらハードウェア寄りの話ですね。ブース数も少なかったです。が、これから伸びていくのかな、という気もします(通信はすでにいろいろ頭打ちだと思われるので。次のパラダイムシフトが必要、と個人的に思います)。

私としてはFPGAのところに入り浸ってました。FPGAもようやくグラフィックに目を向け始めてましたね。ただし、2次元のGUIレベルですが、、、並列化と関係あるのかなぁ・・・。もう少し時代が進めば3DCGもFPGAが活躍し出すのかな、と期待してます。ただ、ライバルはGPUでしょうから、いたちごっこには当分ならないかなぁ(相手はnVIDIA/ATIですからね、勝負にはならないかも)。Core DuoとFPGAの説明をしていたのですが、FPGAだとマルチコアも関係ないっしょ〜〜、とは思ったりします。そもそもCPU自体を作れるわけですので。このへん、技術的には面白いのですが「実用で使えるか?」というと高いハードルをいくつも越えないといけないなぁとは思います(私もまだまだ)。

で、IPAのブースがありまして、見たことあるシステムがありました。会社名を見るとやっぱりということで、2006年の採択者の方の技術をすでに盛り込んでました(手書き文字認識のシステムです)。

私(共同開発者なんで代表ではないです)が同じPMの管理下のプロジェクト内で一番期待していたものだったりしたものです。その会社の社長さんが自ら説明くださったのですが、アナログな手書きの有効性ということで可能性を感じてます。私がかなりネタ帳を書いてためているので、そのシステムが使えるんでないか、とひそかに(その開発者に「ライブラリとしてクレ!」って言ってますが(^_^;;)展開を期待しています。でも、IPAの成果もこんな感じでビジネスマッチングできていくと面白い展開になりますよね。

最近よく思うのですが、ITは死に絶えている(というよりも飽和した、といった感じ?)のはもう見るまでもないですが、、平行線をたどっているなぁということ。正直、去年とあまり展示内容は変わらない気がしました。ハードウェア・組み込み系は去年よりも進んでいるように感じました。

ソフトウェアやサービスに関しては、ビッグバンがないとちょっと厳しいかなぁと同じ環境に身をおいている自分としては感じてます。

「>>>」(2007/05/08)

Javaのソースを読んでいて

int num  = 20;
int num2 = num >>> 1;

な記述があり、「>>>」ってなんだ?と思って調べてみました。Google/Yahoo!などの検索では">>>"は検索にひっかからないですねぇ。

実際試したところでは、符号なし整数のシフトって意味ですね。

int num  = -20;
int num2 = num >> 1;

の計算でのnum2は「-10」になりますが、

int num  = -20;
int num2 = num >>> 1;

では「2147483638」のようになってしまう。

いやはや、今まで使ったことなかったので知りませんでした(汗)。

LSCM(2007/05/08)

UVマップにて効率よく1枚のテクスチャに展開図を作る方法として調査。どうやら「LSCM(Least Squares Conformal Map)」というのがあるらしいのですが

http://www.loria.fr/~ray/s2002_lscm.pdf
http://alice.loria.fr/publications/papers/2003/hlscm/hlscm.pdf

あたりが参考になりそう。

というか、使う必要が出てきました(^_^;;。ゲームでも使えそうですね、というか、いろんな3DCGツールではすでに標準で採用されてるみたいですね(汗)。

http://blender.jp/modules/xfsection/article.php?articleid=35

より、「最小二乗法による等角マップ」という意味合いを持つようです。最小二乗法なら以前のCEDECのPRTの講演で説明があったような。もう一回資料をあさってみよう。

一枚画像から3次元情報を推定する(2007/05/06)

http://civs.stat.ucla.edu/Feng_han_research/compute_3d_shape.htm

というお話を某巨大掲示板で知りました。すげ〜〜。

ベイズ推定を使ってるそうです。この「ベイズ」ですが個人的に興味があって過去に調べたことがありました。迷惑メールのフィルタリングで使用されているというのが有名ですね。3枚くらいの角度から取った画像から三次元を推測するのならなんとなく理解できるような気がしないでもないのですが(いや、分からないけども(^_^;;)、1枚から推定するとは・・・。

時代はベイズですよ、うん。

ペルソナ3 フェス(2007/05/04)

買っちまいました。いろいろ締め切りがあるのに!!とはいえ、GW中は仕事場に毎日来て、帰宅後に夜な夜な遊んでいるだけなんでセーフと自分で信じ込ませてます(^_^;;。

しかし、オープニングが卓越です(どう考えても、映像はゲーム中の使いまわしですけど)。

個人的に、オートダンジョン生成は単調になるからどうよ?というのがあります。後、中ボスが雑魚の色違いなだけとか使い回しが多いのも厳しいかなぁと(無印からそうでしたが)。世界観と雰囲気は好きなんだけど、無印ペルソナ3から見てもたしかにファンディスクではありますね。

ライドウも続編を出してほしい。。。

続・レイヤウィンドウ上でのコントロール(2007/05/03)

レイヤウィンドウの子として生成した(CreateWindowExで作成した)PushButtonはオーナー描画が可能ではあるのですが、テキストフィールド(CreateWindowExでの"EDIT")での描画がよくわからないので、結局「WS_POPUP」で土台のコントロールを作成し、そこでイベントを受けるようにしました。レイヤウィンドウ上では「WS_CHILD」で作成したコントロールは再描画(WM_PAINT)イベントを受け取れない(そのため、画面にウィジットを表示できないためオーナー描画が必要)のですが、「WS_POPUP」だとOK。ただし、ウィンドウが動いてもついてこないので、レイヤウィンドウの移動にあわせて同期させないといけません。

その部分だけ背景が透けないけど、まぁいいか。

レイヤウィンドウ上でのコントロール(2007/05/02)

結局、レイヤウィンドウ上でのコントロールの表示は「オーナー描画」にてレイヤウィンドウのための画像(バックバッファ)に対して描画してやるのが一番手っ取り早いかもしれないという結果に。

エディットボックスの場合は、オーナー描画にてどこまで融通が利くのだろう・・・。

う〜ん、WindowsAPIはOSに近いことをし出すと、結構整合性が取れてないのも目についたりしますね。GDI+での画像読み込みとかドラッグ&ドロップ(COMまわり)とか。

ちなみに上記画像のWebブラウザのサムネイル作成も実装しました。これもCOMまわりで苦労した部分だったりします。なんであんなに扱いにくいのだろう・・・。

WS_EX_LAYEREDとWM_PAINT(2007/05/02)

デスクトップアクセサリを作る場合に、CreateWindowExの拡張スタイルにて「WS_EX_LAYERED」を指定することで、透過およびα合成を行うウィンドウを作成することができます。昨今のGoogleガジェットもAdobeのApolloも全部これが根底にあります。

しかし、その上にWindowsの標準コントロールのボタンや入力フィールドがあるアクセサリを見たことがないです。で、調べているのですが、WS_EX_LAYEREDオプションでCreateWindowExして生成したウィンドウでは、WM_PAINTメッセージが一切飛んできませんね。これの「DefWindowProc」にて標準のコントロール描画が行われるわけですが、、、これだとコントロール自体が表示されません(描画がされていないだけでイベントは受け取っているようです)。さてどうしよう?独自描画は手間がかかるし、、、。

ただ、レイヤウィンドウの子ウィンドウ(ダイアログ)は表示できるので、別ウィンドウのアイテムとしてついてこさせようかな。レイヤウィンドウはいろいろ相性がきついかも(OpenGLとも相性悪いし)。

ただ、GoogleやAdobeのプロジェクトを見ていると、これからは脱ブラウザの動きは目指しているのかな、という気もしています。(もうちょっとApolloでいろいろできれば即採用だったのですが、まだ機能不足)

Apolloで欲しい機能として

  • アクセサリのレイヤウィンドウから別のダイアログを表示する
  • ドラッグ&ドロップ(デスクトップに画像をダウンロード保存、など)

ができれば結構アプリケーションの幅が広がると思っています(そうなるど、Win32でネイティブアプリケーションを作る時代は終わる、、、かもしれない。もちろん、速度が必要なものは従来通り残るでしょうけど)。

Apollo以外のJavaスクリプト系のガジェットは、やはりかゆいところに手が届かない気がしてます。がんばれ、Apollo(笑)。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.