2013年11月28日

Direct3DとOpenGLの行列変換

D3DXMatrix 系の関数で作成した行列を OpenGL に流用しようとしてハマったときの記録です。

例えば
D3DXMatrixTranslation(matrix, x, y, z);
で作った行列 matrix を glLoadMatrixf にセットする、という事をしたかったのですが、
「Direct3D と OpenGL の行列は転置関係にある」というのは分かっていたため、
あまり深く考えずに D3DXMatrixTranspose に通して転置し、それを glLoadMatrixf にセットしたのですが、うまくいきませんでした。

で、よくよく考えてみると、OpenGLの行列は平行移動の場合

m[0] m[4] m[ 8] m[12]   1 0 0 x
m[1] m[5] m[ 9] m[13] = 0 1 0 y
m[2] m[6] m[10] m[14]   0 0 1 z
m[3] m[7] m[11] m[15]   0 0 0 1

となり、一方 Dirext3D での平行移動は、D3DXMATRIX だと

_11 _12 _13 _14   m[0][0] m[0][1] m[0][2] m[0][3]   1 0 0 0
_21 _22 _23 _24 = m[1][1] m[1][1] m[1][1] m[1][1] = 0 1 0 0
_31 _32 _33 _34   m[2][1] m[2][1] m[2][1] m[2][1]   0 0 1 0
_41 _42 _43 _44   m[3][1] m[3][1] m[3][1] m[3][1]   x y z 1

となります。確かに転置関係にあるので、Direct3D の行列を OpenGL で使えるようにすれば転置すれば良いように思えるのですが、
ここでひとつ重要なことがあります。Direct3D の行列は2次元の配列であり、OpenGL の行列は1次元の配列として実装されているという事です。

そこで Dirct3D の行列における2次元配列をそのまま1次元配列と解釈してみると、

m[ 0] m[ 1] m[ 2] m[ 3]   1 0 0 0
m[ 4] m[ 5] m[ 6] m[ 7] = 0 1 0 0
m[ 8] m[ 9] m[10] m[11]   0 0 1 0
m[12] m[13] m[14] m[15]   x y z 1

となり、結局、行列成分の格納順序は Direct3D と OpenGL で変わらない、ということになります。
どちらの場合でも、x, y, z の移動量を指定するべき場所は m[12], m[13], m[14] です。

というわけで、例えば行列の作成に D3DXMatrix* 関数を利用し、それを OpenGL で使いたいなら、

D3DXMATRIX mat;
D3DXMatrixTranslation(mat, x, y, z);
glLoadMatrixf((float *)mat.m);

でよいし、逆に OpenGL 向けの行列を Dirext3D で使いたいなら

D3DXMATRIX mat;
glGetFloatv(GL_MODELVIEW_MATRIX, (float *)mat.m);
device->SetTransform(D3DTS_VIEW, &mat);

とすればよく、わざわざ転置処理する必要はない、ということです。

posted by JUNOSOFT at 06:29| Comment(0) | プログラミング

2013年11月19日

SublineText2

Subline Text 2 では UTF8 しか開けない!!とか騒いでいたのですが、早とちりでした。
Preference メニューの Settings - Default を選ぶと設定ファイルが開くので、そこで
"default_encoding": "UTF8",
になっている部分を
"default_encoding": "SJIS",
にすればいいだけでした。
ついでに
"font_face": "MS ゴシック",
とも指定しておけばOK… だと思ったんですが、どうもうまくいかないんですよね…?
posted by JUNOSOFT at 20:18| Comment(0) | 雑談

2013年11月16日

TurboCのカラーテーマをまねる

デフォルト設定である白地に黒文字が目にやさしくないので、
昔懐かしい Borland Turbo C のエディタの色を思い出してみる事にしました。
このカラーテーマ、たしか Delphi にもあったような。

_TurboC.png

背景 - 紺
テキスト - 黄
文字列リテラル - 赤紫
予約語 - 白
数値 - 水色
プリプロセッサ - 黄緑
コメント - 灰色

でした。昔を懐かしんでみましょう。


-- 追記 --
うっかり書くのを忘れていましたが、これは一般的なテキストエディタでの色設定の話です
posted by JUNOSOFT at 17:36| Comment(0) | 雑談

2013年11月08日

テキストエディタSublimeText

Sublime Text がテキストエディタとしても、デザイン的にもすごくヒットなんです!
ただこれ、UTF8 がデフォなんです。SJIS とか開こうとすると盛大に文字化けします。
いや、Python も UTF8 だし、UTF8だいすきですけど、
それだと BOM つき UTF8にしか対応していないVisualStudio との互換性が…
なぜ MS は BOM なし UTF8 を使ってくれないのでしょうか?

http://www.sublimetext.com
http://snickerjp.blogspot.jp/2012/12/sublime-text-2windows2.html
posted by JUNOSOFT at 14:37| Comment(0) | 雑談

2013年11月02日

シワトリ

オタクグッズの中でも一線を越えてしまった感のある「添い寝シーツ」や「等身大抱き枕」ですが、一大決心して買って開けてみたら無残にシワシワだった、という悲しい経験は誰にでもあるのではないでしょうか?

正攻法で考えれば洗濯やアイロン掛けでシワを伸ばすべきなのですが、洗濯機に放り込んで色落ち、色移りは大丈夫なのか、一体どこに干せばいいのか、そもそもこんなデカイものにアイロン掛けられるのか、悩みは尽きません。


今回はそんな貴方に伝授する、洗濯もアイロンも必要ない、簡単なシワ取り方法です。

1.洗濯バサミ等を駆使して、広げて(壁などに)吊るします
2.扇風機で風を当てます

なんとたったのこれだけです。
風の当て方は、全体的にゆっくり波打つ程度にするのがコツです。
これなら布地を傷める心配もありませんし、要は風が当たればいいのでエアコンや空気清浄機の風でも大丈夫です。
原理は良く分かりませんが、風で揺すられる内に、少しずつシワや折れ目が伸びていくのだと思います。


最大の欠点は、ものすごく時間が掛かるところ……。

広げてみたらシワだらけになっていた月子ちゃん添い寝シーツ

まぁポスターみたいなものだと思って、半年ぐらい吊るして眺めてみてはいかがでしょうか。
ちなみに、一時的に外してもあんまり影響はありませんので、部屋に人が来るときとかは外すか、せめて裏返しにしておきましょうね!
posted by JUNOSOFT at 21:21| Comment(5) | 雑談