• MMDのSpecular計算

    2011年06月12日 13時53分
    前回までのあらすじ
    • MMDのライティングよくわかんない。


    古雑誌をゴミ出ししようとしたところ、Windows100%が出てきました。
    つくもたんMMDモデルが付いてるやつです。

    未開封だったため、とりあえずパンツだけは見なければと思い
    昔自作したローダに突っ込んでみました。


    つくもたん
    思いっきり表示がおかしいです。


    直せるだけ直すかと思い、いくらか調べたので書き記しておこうと思います。



    まずは自作プログラムと一番差が出るSpecularから。

    MMDのSpecular計算は次の様になっています。
    1float4 Specula = pow(max(0,dot(normalize(N),normalize(-LightDir.xyz + normalize(Eye)))),SpcColor.w);
    2Specula *- SpcColor;
    3Specula.w = 0.0f;


    ポイントは、視線・光線・法線ベクトルを使って反射率を計算している箇所です。
    1dot(normalize(N), normalize(-LightDir.xyz + normalize(Eye)))


    自作プログラムは次のように計算していました。
    1dot(normalize(-Eye), normalize(reflect(LightDir, normalize(N))))


    現実のモデルを考えると自作プログラムの方の処理になったのですが、
    MMDの方はなにやらよく解らない計算をしています。


    そこで調べたのですが、これはBlinn-Phongという計算式で、
    reflectの計算が重い処理系において、簡単に処理するもののようです。

    MMDはあまりマシンパワーが必要ないように作っているようなので、
    こういった簡略化の処理になっているのではないでしょうか。


    しかしreflectはそんなに重い処理なのでしょうか。
    MSDNを見ると、内部で「v = i - 2 * n * dot(i?n) 」という計算をしているだけのようです。
    あと、計算結果の数値もわりと差が出る気がします。
  • 新たな日本標準の提案

    2011年05月24日 20時48分
    私は普段たくさん寝ます。
    休みの日など起きなくてよい時は14時間くらい寝てたりします。

    普段たくさん寝るせいか寝不足に弱くて
    少し寝不足になるとすぐ頭が回らなくなってしまいます。

    最近は仕事が忙しく、
    昨日も睡眠時間が少なくなり、本日は重い頭でフラフラと仕事をしていました。


    それにもかかわらず、
    いや、このような追い詰められた状態だからこそなのか
    素晴らしいことを思いついたので忘れないうちに書き記しておこうと思います。



    プログラム入門では「Hello world」が一般的ですが、
    「日本ではHello workにすべき」という主張をする人が居ました。

    どこで見たかはもう覚えていないのですが
    ひどく感心した私は、以降Hello workを使うようにしています。


    他にも日本独自と思われる物に「hogehoge」があります。
    海外では「foo」とか「bar」なので、「日本ではhogehoge」と言えるでしょう。


    本日このhogehogeを見たところ、突如神が舞い降りて


    「homuhomuと書きなさい」


    と言いました。


    もしかしたらあれは鹿目さんだったのかもしれません。


    なので、「日本ではHello workにすべき」と主張した人と同じように
    私は今日から「日本ではhomuhomuにすべき」と主張しようと思います。


    次のように、プログラム例を示す時などに使用します。
    1void main()
    2{
    3    int homuhomu = 1; // ほむほむに代入(*ノωノ)
    4}



    みなさんも今日からhomuhomuと書きましょう。
  • 無線ヘッドセット買ってみた

    2011年05月15日 01時38分
    ネトゲでボイスチャットをする時に使っているヘッドセット、
    有線はちょっと邪魔だなぁと思ったので
    無線の物を2つほど買って試してみました。

    せっかく試してみたので人柱的なレポートを書いておこうと思います。
    ヘッドセット購入の際にはご参考ください。


    1つめは、今時無線といったらBluetoothだよね!
    ということでBluetooth接続のヘッドセットを買いました。

    具体的な品物はBUFFALOの「BSHSBE12」です。
    レシーバは型番がちょっとわからないのですが、同じくBUFFALOの物です。

    このヘッドセットだと、BluetoothのHeadset Profileになりますが、
    音が悪くて全く使い物になりませんでした。
    ほとんど何を言ってるかわからないし、途切れ途切れな感じになります。
    もしかしたらプロファイルではなくハードウェアのせいかもしれませんが・・・

    また、複数人のボイスチャットだったのでよけいダメだったのかもしれません。
    1対1の電話とかならなんとかなるかも・・・


    スピーカーの方はAdvanced Audio Distribution Profileで繋げるタイプなら行ける気がします。
    しかし、マイクの方はハイプロファイル的な物がないので、Headset Profileしかありません。



    そんな感じなので、Bluetoothはイマイチだなぁと思い、もう1つはLogicoolのH760を買いました。
    Bluetooth以外で無線となるとこれしか無い気がします。

    スピーカーは低音と高音がイマイチ出ていない感じです。
    CODECのせいかハードのせいかはわかりません。
    とはいっても普通に音は聞こえるレベルです。音楽を聞くにもそれなりに使えます。

    マイクの方も同様に十分の音質です。

    しかしこのH760には別の弱点が・・・
    はさむタイプなので、長時間使ってると耳が痛いです。少々残念。



    機会があったらBluetoothをもう一つくらい試してみたいです。
    音が悪いのがBluetoothのせいなのかハードのせいなのかチェックしたいなと思っています。
  • OpenSL ES でのMIDI再生

    2011年05月15日 00時49分
    OpenSL ESでMIDIの再生について聞かれましたので簡単に書いておきます。
    簡単にというのも、詳しく説明するほと知らないからです。

    MIDIは仕様上イベントを保持していたり、再生状態を制御したり出来るらしく、
    OpenSL ESもそれを扱うことが出来るようですが
    私の用途ではそこまで必要ではないため再生しか試していません。


    単純に再生する方法については、サンプルコードがドキュメントに書いてあります。
    VIVID Runtime SDKではドキュメントは「documentation/api/khronos/opensles1.0.20090316.pdf」にあり、
    MIDIの再生については「APPENDIX B.3」にあります。

    サンプルコードがそのまま乗っていますので、一連の流れが確認出来ます。
    ポイントはSLDataFormatの値で、
    mimeTypeに「audio/x-midi」を、containerTypeに「SL_CONTAINERTYPE_SMF」を設定します。


    VIVID Runtime SDK 1.3に付属のimplementation_notes.xlsを見ると
    MIDIの場合はMIMEに「audio/midi」と「audio/mobile-xmf」を使いなさいと書いて有るので
    こちらでも動くかもしれません。


    簡単に動作を試すならば、VIVID Runtime SDK付属の「simple3d」サンプルを改変すればよさそうです。
    ファイル名とファイルフォーマットの設定を変えれば動くのではないでしょうか。(未確認)

    変更前
    1uri.URI            = (SLchar *) "synth_22kHz_16b.wav";
    2
    3    mime.formatType    = SL_DATAFORMAT_MIME;
    4    mime.mimeType      = (SLchar *) "audio/x-wav";
    5    mime.containerType = SL_CONTAINERTYPE_WAV;



    変更後
    1uri.URI            = (SLchar *) "hoge.mid";
    2
    3    mime.formatType    = SL_DATAFORMAT_MIME;
    4    mime.mimeType      = (SLchar *) "audio/x-midi";
    5    mime.containerType = SL_CONTAINERTYPE_SMF;


  • 例のアレ

    2011年04月16日 21時47分
    とりあえず仮でドットをぽちぽち打ってみた。
    こいつ棒ばっかりなんで綺麗に描こうと思ったら
    イラストレータとかで描いてラスタライズした方がよさそう。
    D man

    てか、こいつ左右反転使えないんですが。超めんどくさい。
    あまりにめんどくさいんで体は左右同じにしといたんだけど、やっぱり無理がある。
    左右別々で描かないとダメ。


    プログラムの方はとりあえず基本のキー設定とか作った。
    スクリーンショット

    機能的には問題無いけど見た目が酷すぎる。


    てか、もう飽きてきた。あとはだれかまかせた。