本文へスキップ

おちゃっこLAB Since 2002
おちゃっこLAB化け猫編バージョン2 Since 2013/12/21

Win日記[Windowsプログラミング日記]


前書き

化け猫おちゃっこのWindowsプログラミングの日記です。
勉強したこととか、作ったもののスクリーンショットとかのページにします。
3Dプログラミングに片寄っていたので
それ以外のことも勉強していきたいです。

新しい記事の方が上に来るように書いていきます。





ラプラシアンとか2次方程式とか[2017/03/20]


連休でちょっと勉強したこととか思いついたことをメモします。

時系列が変わりますが、まずは2次方程式について今まで素通りしてきたことで
あれ?ということがあったのでメモします。

2次方程式と言えば放物線です。
y = x ^ 2  式(1)
という例のやつです。
x^2という表記はxの2乗のことです。
これはy方向に重力が働く場合の放物線です。

x軸に重力が働く場合には
x = y ^ 2  式(2)
になります。

ちょっと絵を描きます。



図1の上の左が式1で右が式2です。

そして式1と式2の等式を足すと、図1の下の図になります。
円です。放物線を2つ足して円になりました。

そしてこれはX軸とY軸に重力が働いたときという意味があります。
ってことは、、、
X軸とY軸に直交する重力が働いているところにりんごを落とすと
りんごは円の上を落ち続けるということになりませんか?

てことは
X軸とY軸とZ軸のように直交する3つの重力が働いたら
りんごは球上を落ち続けるのでしょうか?

調子に乗って4次元も考えちゃいます。
x^2 + y^2 + z^2 + t^2 = 定数  式(3)
式3において4次元目のtは時間です。
式3を図に描くとどうなるか?

こういうときは変数を1つ固定して考えたりします。
つまりtを固定してみます。
そうすると
x^2 + y^2 + z^2 = 定数 - t^2  式(4)
式4のようになります。
これは「定数 - t^2」の平方根が半径となる球です。

そこでtを動かしてみます。
時間が増えると半径が減っていきます。

つまり式3は
中身が詰まった球です。

すごいことになりました。時空が球の中に入っちゃいました。

いやしかし、「定数 - t^2」が負になったとしたら
球の半径が虚数になります。

これはいったいどういうことやら、、、

この式をみて
半径が虚数はありえないのでその場合を除く場合に成り立つ式である
という風にするひとと
半径が虚数の球であるという風にするひとと
いろいろいると思われます。

どうなのか私には分かりません。

それにしても
当たり前のような不思議な話でした。


話は変わります。
2乗の次のお話は2回微分の話です。

ベクトルの成分ごとに2回微分してそれを足したものをラプラシアンと言います。

ラプラシアンにはこれまた当たり前のような不思議があります。
画像に対してラプラシアンを計算すると画像の輪郭線が抽出できるのです。

エッジの描画は昔、法線を裏返した2重ポリゴンで描画したりしました。
数学的にはラプラシアンで抽出可能です。

普通の2回微分というと、例えば
位置を2回微分すると加速度です。

ラプラシアンはこの2回微分の成分ごとの加速度を足し算したものです。
物理的には流束密度というそうです。

密度なんです。

加速度の足し算の流束密度で画像の輪郭が分かるなんて
なんかすごいです。

ラプラシアンフィルタをかける前とかけた後の画像を貼り付けておきます。








今回は連休で調べたことのメモでした。

それではまた。



補足
X軸の重力とY軸の重力と書いたけれど
2つが直交していることが重要であり、
直交し続けていることが重要である。

2つの重力は
ストローとひもと球の例の実験における力と運動方向の関係だと思われる。

ご存知ですよね?
ストローの中にひもを通して片方の先端に球を取り付ける
そして球を回す実験。

あれの証明になっているんじゃないかと思うのですが
きちんとしたい方はもっとちゃんと考えてみてください。



MameBake3Dの数学的背景 第一回[2017/03/04]


MameBake3Dは下記アドレスで公開しているオープンソースの3Dアニメーションツールです。
https://github.com/Ochakko/MameBake3D

Bakeの部分はベイクと読んでも化けと読んでも自由です。

今回から数回にわたり?MameBake3Dの数学的な背景について書いてみようと思っています。
数回にわたり?と?が付いているのは、自分や周りの状況をみつつということです。

さて第一回ですが、第一回から核心に近い部分を語ります。
座標系変換の部分を説明します。
行列演算ついてはクリアしているものとして書きます。

まず前置きとしてとあるボーンのアニメーション行列AをBに更新することを考えます。
FBXにおいてはグローバルのアニメーション行列を扱うことになるので

A * invA * B = B  (式1)

というように計算するのがFBX公式の方法です。
invAとはAの逆行列です。
これは良いですよね?

さてこれを少し応用します。
例えば

Aの回転以外 * Aの回転 * invAの回転 * Bの回転  (式2)

というような演算を考えます。
前回と違うのはAが回転ではない部分と回転の部分に分かれていることです。
そして逆行列によりAの回転のみを初期化してBの回転で置き換えています。
式2の方法により回転だけを更新できるのです。

MameBake3Dの数学の背景には式2のようなやりかたが多数使われています。
式2では回転に着目しましたが、初期行列や初期姿勢などに着目して式を作ることで
更に世界が広がります。

そんなことをして何の役に立つのかがピンとこない人がいるかもしれないので
書き方を変えてみます。

FBXのアニメーション情報はグローバル行列が基本です。
そしてボーンごとに初期行列があります。
ということは、グローバル行列からローカル行列を計算したとしても
「異なる初期行列」と「異なる初期姿勢」と「異なるボーン構造」  (3要因)
が立ちはだかって
モデル間でアニメーションを使いまわすことが難しいのです。

しかし、グローバル行列と言えども行列の掛け算の結果です。
式2の応用により3要因についての変換を行えば
異なるモデル間でもアニメーションを使いまわすことが可能なのです。

式2はそういう可能性を秘めた考えなのです。


さて前置きはこの程度にして
MameBake3Dのリターゲット(異なるモデル間でのアニメーション変換)において
実際にどのような計算をしているかを少しだけ説明します。


[初期仕様]

 初期行列が異なるので回転と移動に分ける方法を採った。
 移動は一番親の移動しか適用していない。

 まずローカルの姿勢を求める。
 localmat = worldmat * invparmat
 座標系の変換をする。
 curmat = invmodelinit * localmat * modelinit;
 ここでmodelinitとは設定される側の現在のworldmatである。

 curmatの回転成分rotmatを取り出して設定する。
 curmp->GetWorldMat() * rotmat;// * tramat;

 更に子供方向に向かってこの設定を再帰的に適用する。


[仕様修正その1]
 最初のフレームのポーズと形状側の最初のポーズが同じであっても
 最初のフレームにモーションが設定してある場合に、
 上記の方法ではうまくいかなかったので方法を変更した。

 姿勢をmodelの初期姿勢への演算としてあらわすことができれば解決すると考えた。
 つまり、
 bvhfirst0 * bvhanim * bvhpar = modelinit * bvhfirst0 * modelanim
 の式におけるmodelanimを求めればよい。

 modelanim = invbvhfirst0 * invmodelinit * (bvhfirst0 * bvhanim * bvhpar)
 = invbvhfirst0 * invmodelinit * bvhmat
 この式におけるmodelanimを求めた後、その回転を抽出してから
 modelmat = modelmat0 * modelanim
 を計算してモーションポイントにセットした。

 最初のフレームのポーズと形状側の最初の見かけ上のポーズが同じであれば
 最初のフレームにモーションが設定してあってもうまく変換できるようになった。

 実際のコードでは
 modelinitは初期状態のworldmatであり、bvhfirst0は初期状態のbvhmatであるから
 modelmat = modelmat0 * invbvhmat0 * invmodelmat0 * bvhmat
 ということである。


[仕様修正その2]
 モデル全体が一回転するような場合などに足がクロスしたりしてうまくいかなかった。
 コンバートのための行列にモデル全体の回転を考慮する必要があった。
 bvhのHipsの各フレームのworldmatをbvhfirstmpmatとすると
 modelmat = modelmat0 * invbvhfirsthipmat * invbvhmat0 * bvhfirsthipmat * invmodelmat0 * bvhmat
 のようになった。
 モデル全体が一回転しても初期姿勢のコンバートがうまくいくようになった。


という感じの数学的背景がMameBake3Dにはあります。

かなり説明をはしょりましたが
全てを説明するよりは読者の研究心や探求心を引き出したほうが良いと思いそうしました。


これらの仕様は実際にソースコードになってコンパイルすれば動く状態です。
動作確認もしています。
https://github.com/Ochakko/MameBake3D


ちょっと興味が湧きましたか?
君も化けちゃいなよ!


MameBake3Dにリグ機能が付いちゃいました[2016/06/02]


MameBake3Dの更新をしました。

遅ればせながらリグ機能というものを付けてみたら付いちゃいましたというお話。
動画を作りました。

こちらは設定方法と操作方法を12分ほどにまとめた動画です。
【使い方説明】 MameBake3D 【Rig機能が付いちゃいました】
https://youtu.be/gkqCJNsUsKE


こちらは操作画面と操作例をダイジェストで32秒の動画にしたものです。
MameBake3D CustomRig 動画。32秒。
https://youtu.be/o7UUAqea6io


アニメーションツールにおけるリグとは
複数ボーンを一度に簡単に操作することが出来る仕組みのことです。

複数のボーンの回転の仕方を登録しておいてそれ用のGUIコントロールをドラッグすることで
ポーズを付けます。

MameBake3Dのリグの特徴は
マウスのUV方向(横と縦)それぞれにボーンの回転を設定することが出来る点と
ユーザが自分でGUIでリグの設定をすることが可能な点です。

1つのボーンに対して10個のリグを自分で設定して登録することが出来ます。


MameBake3Dのリグの今後についてですが。
1、リグモードのオンオフをもっと簡素化したい、スムーズにしたいです。
 (現状、大きめのダイアログの表示非表示で切り替えています。)
2、現在は1つのRigによって、親子関係のあるボーン5つに対する操作が出来ます。
 手の指を開いたり閉じたりするためにはこれだけではできません。
 1本1本の指のためのRig5つをまとめるようなRigの存在が必要になります。
 つまり、RigのRigというかRigの連結というかそういう仕組みが必要になります。
 最近はノードというやり方が流行っているようですので、リグノードなんてのもありかもしれません。
 この辺の仕様を考えて実装したいです。


という感じです。



MameBake3Dの編集オプション[2016/04/24]


MameBake3Dの更新をしました。
もっといろいろ違うことを勉強しようと思っていたのですが
それってぶれてるっていうことかな?などと考えているうちに
気が付くとまた3Dプログラミングばかりしています。
どうしたものか、、、?

そして最近の成果を動画にしました。

「MameBake3D [編集オプションの説明]」動画。
https://youtu.be/cA7ceFJ2oLY


編集オプションの話です。
今までの編集方式ですと、複数フレームに対して、姿勢を決定するフレームの姿勢を適用していたので
複数フレームの間に体の向きが回転した場合に想定と異なる結果になっていました。

例えば、体が反対を向いていても姿勢決定フレームと同じ効果を適用したので
編集時に足を開かせても、体が反対を向いたときに足がクロスしていたのです。

この現象を名付けるとすれば、perfumeのCOSMIC EXPLORERのジャケ現象とでも言いましょうか。

そこで疑似的にローカル姿勢に変換して姿勢に適用するオプションを作りました。
PseudoLocal(疑似ローカル)オプションです。
日本語っぽく発音すると「スードローカル」です。
デフォルトでオンにしました。

姿勢を適用するボーンの親の姿勢を考慮して計算したので
体が回転したりしても編集時と近い見栄えの効果が出ます。

そんな感じのことを実演してみた動画です。

あ、あとはマウントステート(謎)についても言及しています。
まうんと すてーーーとぉーーー!!!



もう1つその前に作った動画も紹介しておきます。

「MameBake3D bvhそっと歩き+物理ツインテ」動画。20秒。
https://youtu.be/upwvM6yBGgw


こちらはbvhのモーションを取り込んでそれと物理シミュを組み合わせて再生したものです。
GitHubにアップしてあるファイルの中にtest12というサンプルがあるのですが
それを読み込んでF9を押したところです。
モーションスピードはスライダーでいじりました。
モーションスピードを速くしすぎると体が180度回るところでツインテールがプルプルするのですが
そういうときはスペースキーを押すとモーションを再生しながら物理がリセットされます。


こんな感じの経過です。



MameBake3Dの物理とRokDeBone2[2016/04/03]


MameBake3Dのデバッグが進んで、物理が扱いやすくなってきました。
かなり暴れやすかったというかデフォルトで暴れていたのを落ち着かせる設定をするのが手間だったのですが
現在はそれに比べると簡単に設定が出来るようになりました。
(とはいえ、やはり物理なのでパラメータが面倒ではあります。)

そんな感じでテストしてみた結果が以下の動画です。
https://youtu.be/7vLpVP0tEAA

だいぶまともになったと思います。
ソースはGitHubにpushしました。
https://github.com/Ochakko/MameBake3D


こうなってくるとbvhを適用したりするためのボーンの入ったFBXが必要になってきます。
そこでRokDeBone2の方のメンテナンスも再開しました。
RokDeBone2のbvhやFBXの修正をする予定です。

RokDeBone2もGitHubでオープンソースにしています。
https://github.com/Ochakko/RokDeBone2


RokDeBone2のサンプルを復活させたのですが
(著作権はちゃんと書いてあります)
サンプルをみていて涙がちょちょぎれました。

ああ、なんだかんだいっても、多くの人に支えられてきたのだなぁと、、、

ありがとうっ!!


追記 2016/04/03 pm8:30頃
RokDeBone2のFBX出力を改良してGitHubにpushしました。




ボーン構造の異なるFBXのモーションを適用する[2016/03/14]


おはようございます、就活中の化け猫おちゃっこです。
検索しているのですが、条件に合うところはちょっと遠い感じです。
ちょっと遠いくらいと思うかもしれませんが
日々のことになるので結構重要です。

近くの案件が出てくるまで遊んでいるのも何なので
MameBake3Dのバージョンアップをしました。

今回は
モデルのFBXにボーン構造の異なるFBXのモーションを適用する機能を付けました。
前回のbvhをFBXにする機能と組み合わせると
モデルのFBXに複数の異なるボーン構造のbvhモーションを適用できることになります。

特徴としては
ボーンの対応関係を設定するだけで良く、ボーンの位置調整をしなおさなくても良いところです。

変換方法にはちょっとこつがあるので
動画を作りました。

MameBake3D説明動画。モデルFBXにモーションFBXを適用する話。
https://youtu.be/ERaqn16GsU0


プログラムはオープンソースでの公開です。
https://github.com/Ochakko/MameBake3D




就活の習作の位置づけ[2016/02/21]


MameBake3DのVectorでの販売の取り下げ手続きをしました。
もうすぐページに反映されることでしょう。

perfumeのbvhを使用した時点で非商用縛りだったんだなぁ。
危うく売れるところでした。

今後のMameBake3Dなどのスタンスとしては
「就活のための習作」という感じにしようと思います。

GitHubにソースを公開していますが実行ファイルは含まれていません。

そんな習作ソフトでも興味があるという方は
info☆ochakkolab.moo.jp
(☆を@に変えてください)
までお問い合わせください。




隙間ツールとしてのMameBake3D[2016/02/17]


ここ数日、MameBake3Dのバージョンアップをしていました。
3Dツールと言えば、他にもたくさんあるし、すでに世間に認識されているものが多いです。
そこで、それらの隙間を狙ったツールとしてMameBake3Dを考えています。

どこが隙間かと言うと
ベイク済のFBXの編集関係に特化しようということです。

モーション作成というよりもモーション編集に重きを置きます。
物理関係の機能もあります。

ということで、bvhは読めてFBXに変換出来たほうが良いので
その機能を修正しました。


次に紹介する動画はMameBake3DでbvhをFBXに変換する方法です。
新規に作成した動画です。

[ MameBake3Dの使い方。BVHからFBXへの変換の話。]
オイラー角出力を抜本的に見直した結果、モーション再現率がかなり上昇しました。
perfumeの3人が踊る動画。
https://youtu.be/ONnB1jDVi6k


そしてもう1つの動画は、ベイク済のモーションの編集方法について解説しています。
この動画は過去に作った動画を復活させたものです。

[MameBake3Dの使い方。ベイクの話。]
ベイク済とは。ベイク済モーションの編集方法について。
https://youtu.be/Z0UacTlXs7w


だいたいイメージはつかめていただけましたでしょうか。
まだ物理の機能もあるのですが。


こんな感じのバージョンアップと動画作成などをしていました。

そこに正義はあるのかって??
猫は隙間が好きでBakeますから、いいんですっ!!


2016/02/17 化け猫おちゃっこ



MameBake3Dを新しいメタセコに対応させました[2016/02/09]


いつの間にか、新しいメタセコイアのFBXをMameBake3Dが読めなくなっていたので
修正してアップしました。オープンソースです。

https://github.com/Ochakko/MameBake3D

メタセコイアでFBX出力をする前に面の三角化をしてください。
ボーンを入れ終わったらボーンのダイアログのポーズ出力メニューを実行してください。
FBX出力時のオプションは、スムージンググループをオフにし、バージョンは2013にしてください。

ソースのソリューションはVisualStudio2013で作成しました。
外部ライブラリの関係で、VCランタイムのバージョンは2010です。

久しぶりに半日 3Dをやりました。
まだ32ビットアプリのままです。


追記:2016/02/10
GitHubにアップしたソースが足りなかったことに気が付いて先ほどアップしなおしました。
何か赤い字が出ていたのですがcommitに-aをつけていれば大丈夫と思っていました。
ちゃんんとaddしてからcommitしました。
DX90c以外のファイル(ビルド用の)はそろっているはずです。
(実行するためにはFBXSDKをインストールして、DX90cのSDKを所定位置にコピーする必要はあります。
さらに、GLUT32.dllをexeと同じディレクトリに置きます。)



Wow64はエミュ扱い[2015/11/04]


Win64を少し調べました。
64ビットOSで32ビットアプリが動くのはWow64という32ビットアプリを動かす仕組みがあるからです。
Wow64って名前に付いているディレクトリがあるのでこれは知っていました。

しかし、Wow64は64ビットOSにおいて 32ビットアプリを「エミュレーション」で動かすための仕組み
だったのです。
つまり、64ビットOSにとって
32ビットアプリはすでにネイティブとは言いがたく、エミュで動いている存在でした。

ショーーーーック!!

あんまり64ビットに移行する気がしてなかったのですが
これを知って64ビットに移行する気が出てきました。

だって、エミュだってよぉー。
やっぱりいくらか遅いんじゃないかしら??

ということで
まだ調査は続きそうです。

とりあえず
64ビットOSでもintやlongは32ビットであり、ポインタやハンドルが64ビットになる
ということが分かりました。
32ビットから64ビットに移行しやすいような配慮だそうです。

これなら設定しなおしてコンパイルし直すだけで良いものも結構ありそうです。

しかし、RokDeBone2は 確か ポインタをunsigned longにキャストしていた箇所が数か所あったような気がします。
まあ それは いいとして。

新しく作るものは64ビットにしよう!!



Win64[2015/11/04]


Win32が使えなくなる日が来るのかは知りませんが
時代の流れとして64ビット方向に進んでいるので
一応対応しようということで、Win64を調べます。

調べる前の印象としては
ものすごい大きなファイルやメモリを扱わないのであればWin32で良い気もするのですが。

ビッグデータが流行ですし
64ビット化して実行速度が速くなれば もうけもん ってイメージ。

とりあえず調べ始めようと思います。












店舗イメージ