* FBXファイルをちょっとだけ理解した
面倒くさそうな構造のファイルだなと思って今まであまり関わらないようにしていたのだけど,ファイル自体は頻繁に目にするので中身を読んでみた.とりあえず,Material, Model, Geometry, DeformerとSkinあたりを読み込んで,他のフォーマットに変換してみてそれらく動いたので大丈夫そう.
https://github.com/binzume/modelconv/
噂通り色々扱いにくいフォーマットだったけど,すごく基本的なところでは,個々のオブジェクトを表すModelのローカル座標系を得るのすら色々な値を見ないといけなくて面倒くさい.
変換行列そのものが入ってると楽なのだけど,Modelは変換行列を持ってない.DeformerとかPoseNodeは普通にMatrixで持ってるのに(このMatrixもあまり扱いやすくないのだけど)...
オブジェクトのプロパティを眺めるとLcl Translation
,Lcl Rotation
,Lcl Scaling
とかが並んでるので,これを見て,
ToTranslateMatrix(translation) * EulerToRotationMatrix(rotation, rotationOrder?) * ToScaleMatrix(scaling)
みたいにすると良さそう.プロパティは省略可能なので見つからなければ,PropertyTemplateからデフォルト値を探す.Rotationはオイラー角で入ってるけど,回転順序も設定によって変わるし,SphericXYZとか単なるオイラー角じゃないのもあるけど多くのツールは無視してるっぽいので今回も無視.
それっぽい結果になった.
……ここまでなら,世界は平和だったのだけど現実はもっと厳しかった.モデリングソフト上でのpivotやoffset周りの操作を知らないと計算できないし,いまや同じ会社の製品なのに3ds MaxとMayaでも違うあたりがすごい.
https://qiita.com/binzume/items/678baf9a20c6a96a1d81
VSCodeでGoを書いてると,たまにフォーマッタが変な挙動をして,コードをコンパイルできない状態に書き換えることがあって困ってたのだけど, Language Server として使ってたgoplsを最新にしたら問題なくなった気がする.
フォーマッタを default から gofmt に変えても改善しなかった気がするのでエディタ側の問題だと思ってたけど, Language server が有効だとgofmtの場合も Language server 経由で実行しているっぽい?
眠い・・・
fbxファイルのパーサ書いてみたのだけど,内容に関して断片的な仕様しか見当たらないの困るな.Blenderの資料が一番まっとうそうに見えるけど,色々怪しげ.
メモ
ATOM Liteはケースやコネクタのせいで厚みがあるのと,GPIO少なくて不便だったけど,M5Stamp Picoは良さげ.
https://www.switch-science.com/catalog/7360/
技適マークはシールがついてくるみたいだけど,そういう売り方OKなのか.技適の通ったESP32 Picoモジュールまだあまり種類が無いけど,しばらくはこれで良い気がする.
ESPシリーズ,CPUはTensilicaのXtensaというコアが使われてるのだけど,あまりメージャーなやつじゃないので用意されているgcc以外で開発環境作ろうと思うとめんどい.一部のコアをRISC-Vに置き換えた版があるので,そのうち全部RISC-Vに移行するのかとも思ってたけど,いまのところそういう気配はなさそう.
雨.
今までの人生で,何らかのQuaternionの計算をする処理を何度も書いてるけど,実数成分を最後に書くのがいつも気になる.構造体のフィールドや引数の順序はXYZWにしてるけど,数式上は実数成分を先頭に書きたくなるので微妙に書きにくい.回転軸に関する値を先頭に置きたいのも分からないでもないけど,実数成分を最後に書く慣例はどこから来たんだろ.同次座標系に合わせたのかとも思ったけど,あまり関係なさそうな気もする.
一日中眠いと思ったら,また熱あるな...ワクチンの副反応なのか風邪なのか微妙.
もう8月...時間が経つのが早すぎる気がする.結局,ワクチン接種したあと調子が悪くてこの週末何もできなかった……
C++のstd::numeric_limits
has_infinity=false
のとき,infinity()
はコンパイルエラーにならずに無効な値が返るのか.VC++で,std::numeric_limits<int>::infinity()
が0だった.
自分でnumeric_limits::max()
とかを使うの,ほぼ確実に何らかの探索をするときに極端な初期値が欲しい場合なので,has_infinityならinfinityを,そうでないならmaxを返すやつがほしい.真面目にstd::numeric_limits<T>::has_infinity ? std::numeric_limits<T>::infinity() : std::numeric_limits<T>::max()
みたいに書きたい気もするけど,面倒だし通常はmax()
で良いか.あと,逆の場合はlowest()
忘れててmin()
使いそうになるのも困る.