カウンタ
今日:00000003
全体:00020300

 VRMのページにVRMQuickLookが追加されていた / magicien 

気づいたら、VRMのページにVRMQuickLookが追加されていました。ありがとうございます!

で、さらに気づいたら、VRMQuickLookをこのサイトで公開するのを忘れていました。
GitHubに公開しただけで満足してしまった...

VRMQuickLook:macOS、VRM用QuickLookプラグイン
VRMQuickLook ScreenShot

実際のところ、VRMPreviewに、このVRMQuickLookが組み込まれているので、VRMPreviewをインストールしている場合は、こちらを別途インストールする必要は無いです。

以上、雑な紹介でした!

2018/08/18(Sat) 15:59:13

 Mac用VRMビューアを公開しました / magicien 

image ご無沙汰です。ここ数週間ほどでVRMがにわかに盛り上がってきているので、iOSのアプリ開発を一旦放り出してVRMビューアを開発していました...
ダウンロードはGitHubから。

実のところ、以前作ったglTF向けのライブラリをほぼそのまま使っているだけで、VRM専用のデータはほとんど使っていません。
やっているのは、シェーダの差し替えと、VRMのメタ情報の読み込みくらい。

VRMのシェーダのうち、VRM/MToon だけはマルチパスシェーダのため未対応。SceneKitの場合、マルチパスシェーダはビューかカメラかライトにしか設定できないはず(APIが変わっていなければ)なので、マテリアル毎の設定は難しいのです。
シェーダ内で毎回分岐させるのは抵抗があるので、やるとすれば MToon用のカメラを別途用意する感じでしょうか。デプスバッファや影の処理がうまくできるのかは怪しい。

紹介動画は時間があるときに作る...

2018/08/14(Tue) 03:17:32

 WWDC2018のKeynoteメモ / magicien 

Keynoteに一時間遅刻してしまった...ギル様を優先したとも言う。別言語で2窓は流石に無理だった。まだまだ修行が必要。

ただ、2時間のライブであれば、1時間の遅刻は遅刻にはならない。
YouTubeには便利な機能があって、ライブ中でも1時間遅れで再生出来るので、倍速で再生すれば、1時間後には最新の映像に追いつけるという寸法である。

さて、3D好きとしては、やはりARKit2に注目したい。
複数の端末で一つのAR空間を共有出来るのは非常に嬉しい。
背景を実写ではなく3Dモデルにすれば、VRも出来るので、顔認識用の人数分のiPhoneXとカメラモーション用のiPhone端末が用意できれば、同じVR空間で複数のVTuberがわちゃわちゃ動き回る様をライブ配信出来るようになりそう。ネット越しの同期もサポートしてくれるなら、物理的に集合する必要はない。出演者だけではなく、観客も同じ空間に入り込んで自由に動き回れる。どこまで出来そうかは後でAPIを確認しよう。
→確認した結果、ネット越しだとあんまり使えなさそう。表情の変化をリアルタイムに反映するのもだいぶ頑張らないといけないようだ。ライブラリにお任せ出来ると思ったのに、結局自分で実装しないといけないのか。

usdzというファイル形式は、usdの拡張でzip対応しているっぽい。ネット経由での利用を意識してのものだと思うので、glTFと競合していくことになるのかな。個人的にはVRMがglTFの公認拡張仕様になってglTFが流行って欲しい。

正直、他に気になるものがあまり無かった。あとはSessionのスケジュールを見て気になるものを選んで見ていけば良いかな、と考え中。ReplayKit 2、HLS、ARKit 2、Ray Tracing、Video Effects Using Depthあたり。MapKit JSも地味に気になる。あとはかなり望み薄だけど、SafariがWebGL2、GLES3に対応する気があるかどうか。
→OpenGL ESがdeprecatedって書いてある!WebGLをどうするつもりなんだ。

そういえば、MicrosoftがGitHubを買収するとかなんとか。アメリカのIT企業は他社のイベントに爆弾を放り込むノルマでもあるんですかね...
2018/06/05(Tue) 05:00:54

 バーチャルYouTuberになれるアプリ「Showar」をリリースしました / magicien 

前々から作っていたARKitを使ったアプリが、ようやく公開出来ました。
アプリの名前は、Showar(シャワー)です。



ダウンロードはこちらから↓
https://itunes.apple.com/jp/app/showar-3d-vr-ar-avatar/id1369578518

バーチャルYouTuberとか言っておきながら、ニコ動だけに投稿するのもおかしな話だと思ったので、YouTubeにも動画アップしておきました。

ところで、今更ですが、ぽんぽこ24時間生放送お疲れ様でした。出演者の方々はもちろん、視聴者の皆さんも。
最近、ただでさえ睡眠時間が削られているところに24時間生放送をぶっこんでくる鬼畜さに惚れました。


2018/05/05(Sat) 22:34:43

 MMDSceneKitをCocoaPodsに対応させた / magicien 

1ヶ月ぶりです。2月はにわかに忙しくなってアプリ開発が全然進まず。3月はペースを戻していきたい所存。
それはさておき、MMDSceneKitをCocoaPodsに対応させました

なぜCocoaPodsに対応させたかというと、今作っているiOSアプリにMMDSceneKitを組み込んだところ、ダイナミックライブラリを入れないで!とAppleから怒られたから。
それならソースからコンパイルすれば良いのだろう、ということでMMDSceneKitのプロジェクトを丸ごとワークスペースに取り込んでみたものの、細々とエラーが出て面倒くさい。 なぜだ!CocoaPodsで入れた他のライブラリは問題ないのに・・・と考えた結論は、MMDSceneKitだけCocoaPodsを使っていないから(思考停止)。

頑張れば手動でもうまく組み込めるんだろうけど、頑張らないと使えないフレームワークとはいったい・・・うごごご!
そんな感じです。そのうちCarthageにも対応するかもしれない。

2018/03/04(Sun) 21:21:13

 macOSをアップデートしたら辞書データが消えました / magicien 

Missing dictionaries for Dictionary app in 10.13.4 beta (17E139j)
バージョンは、10.13.4 Beta 1。辞書をよく使う人は次のバージョンが出るまでアップデートを待った方が良いかもしれない。


割と使っているから早く直してくれ〜。AppleのQAチームが息してないぞ。

追記:手動でデータをダウンロードして復旧できた。原因は辞書データのダウンロード先がhttpであること(httpsではないこと)な気がする。

/System/Library/Assets/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/com_apple_MobileAsset_DictionaryServices_dictionaryOSX.xml に辞書一覧が入っているようだったので、
$ plutil -p /System/Library/Assets/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/com_apple_MobileAsset_DictionaryServices_dictionaryOSX.xml
で中身を見て、手動でデータダウンロードしたら復旧できました...
辞書一覧データの中身は配列になっていて、__BaseURL と __RelativePath をつなげたURLに辞書データが置いてある模様。
例えば、ウィズダム英和辞典の場合は、
11 => {
      "__BaseURL" => "http://appldnld.apple.com/osxassets/058-55450-2016008023-8A4D782E-661F-11E6-B483-D75733D2D062/"
      "__CanUseLocalCacheServer" => 1
      "__InstallWithOS" => 1
      "__RelativePath" => "com_apple_MobileAsset_DictionaryServices_dictionaryOSX/1a184f41ee27bbb203ba596a25c8ea104c13d98f.zip"
      "_CompatibilityVersion" => 5
      "_CompressionAlgorithm" => "zip"
      "_ContentVersion" => 5
      "_DownloadSize" => 29800639
      "_IsZipStreamable" => 1
      "_MasteredVersion" => "2610"
      "_Measurement" => <41bb8766 3a4e0a5f a296262d 5fd506a4 bae32e1e>
      "_MeasurementAlgorithm" => "SHA-1"
      "_UnarchivedSize" => 33202176
      "Countries" => [
        0 => "JP"
      ]
      "DictionaryCopyright" => "ウィズダム英和辞典 / The Wisdom English-Japanese Dictionary <br/> Copyright © 2007, 2013 Sanseido Company Ltd., under licence 
to Oxford University Press.  All rights reserved. <br/><br/> ウィズダム和英辞典 / The Wisdom Japanese-English Dictionary <br/> Copyright © 2007, 2013 Sanseido
 Company Ltd., under licence to Oxford University Press.  All rights reserved."
      "DictionaryIdentifier" => "com.apple.dictionary.ja-en.WISDOM"
      "DictionaryPackageDisplayName" => "ウィズダム英和辞典 / ウィズダム和英辞典"
      "DictionaryPackageName" => "Sanseido The WISDOM English-Japanese Japanese-English Dictionary.dictionary"
      "DictionaryType" => "Bilingual"
      "FormatVersion" => 2
      "IndexLanguages" => [
        0 => "ja"
        1 => "en"
      ]
      "Language" => "ja"
    }
となっているので、辞書データは
http://appldnld.apple.com/osxassets/058-55450-2016008023-8A4D782E-661F-11E6-B483-D75733D2D062/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/1a184f41ee27bbb203ba596a25c8ea104c13d98f.zip
にある、という感じです。
ダウンロードしたzipファイルの中にある、〜.dictionary というファイルを ~/Library/Dictionaries/ に放り込んで、辞書アプリの環境設定から使う辞書に指定してあげればOK。
抽出したURL一覧を置いておきます。

辞書一覧

macOS用

Apple Dictionary
Politikens Nudansk Ordbog
Prisma Handwoordenboek Engels
Prisma woordenboek Nederlands
Oxford-Hachette French Dictionary
Multidictionnaire de la langue française
Oxford German Dictionary
Duden-Wissensnetz deutsche Sprache
राजपाल हिन्दी शब्दकोश
Oxford Paravia Il Dizionario inglese - italiano/italiano - inglese
Dizionario italiano da un affiliato di Oxford University Press
ウィズダム英和辞典 / ウィズダム和英辞典
スーパー大辞林
뉴에이스 영한사전 / 뉴에이스 한영사전
뉴에이스 국어사전
Norsk Ordbok
New Oxford American Dictionary
Oxford American Writer's Thesaurus
Oxford Dictionary of English
Oxford Thesaurus of English
Dicionário de Português licenciado para Oxford University Press
Толковый словарь русского языка
牛津英汉汉英词典
现代汉语规范词典
Gran Diccionario Oxford - Español-Inglés • Inglés-Español
Diccionario General de la Lengua Española Vox
NE Ordbok
พจนานุกรมไทย ฉบับทันสมัยและสมบูรณ์
五南國語活用辭典
TTY Dictionary
Arkadaş Türkçe Sözlük

iOS用

Apple Dictionary
Politikens Nudansk Ordbog
Prisma Handwoordenboek Engels
Prisma woordenboek Nederlands
Oxford-Hachette French Dictionary
Multidictionnaire de la langue française
Oxford German Dictionary
Duden-Wissensnetz deutsche Sprache
राजपाल हिन्दी शब्दकोश
Oxford Paravia Il Dizionario inglese - italiano/italiano - inglese
Dizionario italiano da un affiliato di Oxford University Press
ウィズダム英和辞典 / ウィズダム和英辞典
スーパー大辞林
뉴에이스 영한사전 / 뉴에이스 한영사전
뉴에이스 국어사전
Norsk Ordbok
New Oxford American Dictionary
Oxford American Writer’s Thesaurus
Oxford Dictionary of English
Oxford Thesaurus of English
Oxford Portuguese Dictionary - Português-Inglês • Inglês-Português
Dicionário de Português licenciado para Oxford University Press
Oxford Russian Dictionary - Русско-Английский • Англо-Русский
Толковый словарь русского языка
牛津英汉汉英词典
现代汉语规范词典
Gran Diccionario Oxford - Español-Inglés • Inglés-Español
Diccionario General de la Lengua Española Vox
NE Ordbok
พจนานุกรมไทย ฉบับทันสมัยและสมบูรณ์
五南國語活用辭典
TTY Dictionary
Arkadaş Türkçe Sözlük

2018/01/28(Sun) 15:05:08

 あけましておめでとうございます! / magicien 

本年もよろしくお願いいたします。


投稿遅くなっちゃったけどぎりぎりセーフ?

今年の10の目標はこんな感じで行きたいと思います。
  • 初のiPhoneアプリをリリースする
  • iPhoneのゲームアプリをリリースする
  • AI関連の何かを作る
  • 各種ライブラリの更新
    • GLTFSceneKit:非同期読み込み対応、Exporter実装
    • MMDSceneKit:物理演算対応、Exporter実装
    • JSceneKit:Fox2サンプル対応、Exporter実装
  • 新しいプログラミング言語を2つ習得
  • 運動系イベントに参加する
  • 何かしら絵を描く
  • 何かしら曲を作る
  • 何かしら得意料理を作る
  • 今年始まった新しい何かに挑戦する

前半を書いたところで、ジャンル偏りすぎじゃね?っていうかライブラリに至っては目標というより予定じゃね?と思ったので後半はもうちょっと脳細胞が元気になりそうなものにしました。内容曖昧すぎじゃね?

今はiPhoneアプリを絶賛デバッグ中です。まだまだバグが多いのと、性能的に問題ありそうなんでリリースまでもうちょっとかかりそう。本当は昨年中に審査申請したかったんだけどなー。でも一度リリースまで経験すれば、次からはもっと早く作れる気がする。

2018/01/03(Wed) 18:19:56

 クォータニオンの除算 / magicien 

3Dのプログラムを書く人にとっては常識なのかもしれないけど、クォータニオンの除算ってどうやればいいんだっけと半日悩んだ結果を書いておく。

結論から言うと、除算は不要。回転角度の符号を反転したクォータニオンを乗算すればいいだけでした。考えてみれば当然なんだけど、思いつかなかったんだよ!

そもそもクォータニオンは何かと言うと、回転を表す4次元ベクトル。クォータニオンの便利なところは、クォータニオン同士を乗算することで、回転を合成できること。
右肩、右肘、右手首の回転がそれぞれわかっている時に、最終的に右手がどっちの方向を向くかは、右肩・右肘・右手首のクォータニオンを全部乗算すれば分かる。
数式で表すなら、右肩のクォータニオンをq1、右肘のクォータニオンをq2、右手首のクォータニオンをq3、最終的に右手が向く方向をqとすると、

\( q_1 \times q_2 \times q_3 = q \)

こんな感じになるわけです(q1、q2、q3はローカルの回転、qはワールド座標系(正確には右肩の親ノード)から見た回転であることに要注意)。
じゃあ、右肩・右肘の回転が決まっていて、最終的に右手をどちらに向かせたいか決まっているときに、右手首をどう回転すれば良いのか計算で求めるには、どうすれば良いのかな?と思ったわけです。(q1、q2、qが既知の時にq3を求める)

回転方向を逆にしたクォータニオンを使えば良いのだけれど、これを共役(きょうやく)クォータニオンと呼ぶらしい。w成分の符号を反転させるか、xyzを反転させるか、どっちでも良いと思うのだけど、xyzを反転するのが正式なのかなぁ。記号の書き方も人によってまちまちだけど、ここでは、クォータニオンqの共役クォータニオンをq*と書くことにする。

\( q = (x, y, z, w) \Leftrightarrow q^* = (-x, -y, -z, w) \)

で、qとq*をぶつけてやれば、回転が無かったことになるので、

\( q_2^* \times q_1^* \times q_1 \times q_2 \times q_3 = q_2^* \times q_1^* \times q \\ \Leftrightarrow q_3 = q_2^* \times q_1^* \times q \)

という感じで q3 が求められる。クォータニオンの積の計算は結構複雑なので、下手に方程式を解き始める前に気づいて良かった...

おまけ:SceneKitのクォータニオンの積はこんな感じ。

2017/12/31(Sun) 05:54:25

 iPhone Xを買った / magicien 

image昨日、ふらっとApple Storeに行ったら、iPhone Xあるよって言うものだから買ってしまいました。


iPhone Xを持ってる人たちが楽しそうにAnimojiやってるのを指をくわえて見ていたんですが、このままではくわえた指が溶けてしまう、と思って買っちゃうことにしました。
早速MMDのモデルを使ってFaceTrackingしてみたんですが、思った以上にすごいですわ。側から見た絵面が。おっさんがカメラに向かってウィンクしている様を想像してみてください。

ちょっと遊ぶつもりで作り始めたんですが、思いの外楽しいので、iOS向けアプリとして公開するのを目指すのもありかな、と考えているところです。ソースを公開したところで使える人はほんの一握りになっちゃうでしょうし。ただ、個人でアプリ公開したことないんで、勝手がわからないんですけどね...
公開するとなると、MMD関連ファイルのサポートを含めるかどうかも悩みどころ。大半のモデルがMMD以外での使用を想定されていないようなのと、権利的にグレーなものが多すぎるので、いらぬトラブルを呼び込むはめになりそう。
今は dae、obj、usd、glTF と他の選択肢も増えたので、MMDは外部ソフトに任せて自己責任で、というのが堅実なやり方かなぁ。逆にfbxはサポートしたいけど、簡単な方法はあるだろうか。

2017/12/22(Fri) 05:52:52

 SceneKitのクォータニオンをMMDのオイラー角に変換する / magicien 

JSceneKitを実装するときに、オイラー角とクォータニオンを相互変換する式を計算したのだけれど、今回はSceneKitのクォータニオンをMMDのオイラー角に変換する必要があった。
が、前回使った計算式はどこかに行ってしまったので、再計算しなければならなかった。今回は途中式を記録に残しておく。

前提

  • orientation(クォータニオン)からeulerAngles(オイラー角)を直接計算するのではなく、orientation→rotation、rotation→eulerAnglesの二段階の変換をする。
  • orientationとrotationの変換は簡単なので省略。計算式は以前書いたSceneKitの系を参照のこと。
  • 今回は回転だけ気にするので、3x3行列で計算する。

計算に使う行列

SCNNode.rotation (Rx, Ry, Rz, Rw) に対応するtransform:
※rotationのxyz軸は大きさ1に正規化される。
\( rotation = (R_x, R_y, R_z, R_w) \\ \Rightarrow \left( \begin{array}{ccc} R_x^2 (1-\cos R_w) + \cos R_w & R_xR_y(1-\cos R_w) + R_z\sin R_w & R_xR_z(1-\cos R_w) - R_y\sin R_w \\ R_yR_x(1-\cos R_w) - R_z\sin R_w & R_y^2(1-\cos R_w) + \cos R_w & R_yR_z(1-\cos R_w) + R_x\sin R_w \\ R_zR_x(1-\cos R_w) + R_y\sin R_w & R_zR_y(1-\cos R_w) - R_x\sin R_w & R_z^2 (1-\cos R_w) + \cos R_w \end{array} \right) \tag{1} \)

SCNNode.eulerAngles (Ex, 0, 0) に対応するtransform:
\( eulerAngles = (E_x, 0, 0) \Rightarrow \left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos E_x & \sin E_x \\ 0 & -\sin E_x & \cos E_x \end{array} \right) \tag{2} \)

SCNNode.eulerAngles (0, Ey, 0) に対応するtransform:
\( eulerAngles = (0, E_y, 0) \Rightarrow \left( \begin{array}{ccc} \cos E_y & 0 & -\sin E_y \\ 0 & 1 & 0 \\ \sin E_y & 0 & \cos E_y \end{array} \right) \tag{3} \)

SCNNode.eulerAngles (0, 0, Ez) に対応するtransform:
\( eulerAngles = (0, 0, E_z) \Rightarrow \left( \begin{array}{ccc} \cos E_z & \sin E_z & 0 \\ -\sin E_z & \cos E_z & 0 \\ 0 & 0 & 1 \end{array} \right) \tag{4} \)

eulerAnglesのxyz回転を全て指定した場合は、SceneKitの場合、Z軸・Y軸・X軸の順番で回転する。回転行列は左側から掛けるので、次のようになる(この式は使わないけど、補足として)。
\( eulerAngles = (E_x, E_y, E_z) \Rightarrow \left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos E_x & \sin E_x \\ 0 & -\sin E_x & \cos E_x \end{array} \right) \left( \begin{array}{ccc} \cos E_y & 0 & -\sin E_y \\ 0 & 1 & 0 \\ \sin E_y & 0 & \cos E_y \end{array} \right) \left( \begin{array}{ccc} \cos E_z & \sin E_z & 0 \\ -\sin E_z & \cos E_z & 0 \\ 0 & 0 & 1 \end{array} \right) \tag{5} \)

MMDのカメラモーション(vmd)のオイラー角をSceneKitで再現する場合は、Z軸・-X軸・-Y軸の順で回転する必要がある。よって、回転行列は次のようになる。
\( MMDeulerAngles = (E'_x, E'_y, E'_z) \\ \Rightarrow eulerAngles(0, -E'_y, 0) \times eulerAngles(-E'_x, 0, 0) \times eulerAngles(0, 0, E'_z) \\ = \left( \begin{array}{ccc} \cos E'_y & 0 & \sin E'_y \\ 0 & 1 & 0 \\ -\sin E'_y & 0 & \cos E'_y \end{array} \right) \left( \begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos E'_x & -\sin E'_x \\ 0 & \sin E'_x & \cos E'_x \end{array} \right) \left( \begin{array}{ccc} \cos E'_z & \sin E'_z & 0 \\ -\sin E'_z & \cos E'_z & 0 \\ 0 & 0 & 1 \end{array} \right) \\ = \left( \begin{array}{ccc} \cos E'_y \cos E'_z - \sin E'_x \sin E'_y \sin E'_z & \cos E'_y \sin E'_z + \sin E'_x \sin E'_y \cos E'_z & \cos E'_x \sin E'_y \\ - \cos E'_x \sin E'_z & \cos E'_x \cos E'_z & - \sin E'_x \\ - \sin E'_y \cos E'_z - \sin E'_x \cos E'_y \sin E'_z & - \sin E'_y \sin E'_z + \sin E'_x \cos E'_y \cos E'_z & \cos E'_x \cos E'_y \end{array} \right) \tag{6} \)

SceneKitのrotationをMMDのeulerAnglesに変換

rotation(Rx, Ry, Rz, Rw) から MMDeulerAngles(E'x, E'y, E'z) を求める。
rotationとMMDeulerAnglesの回転行列を一致させてあげれば良いので、(1) = (6)より、
\( \left( \begin{array}{ccc} R_x^2 (1-\cos R_w) + \cos w & R_xR_y(1-\cos R_w) + R_z\sin R_w & R_xR_z(1-\cos R_w) - R_y\sin R_w \\ R_yR_x(1-\cos R_w) - R_z\sin w & R_y^2(1-\cos R_w) + \cos R_w & R_yR_z(1-\cos R_w) + R_x\sin R_w \\ R_zR_x(1-\cos R_w) + R_y\sin w & R_zR_y(1-\cos R_w) - R_x\sin R_w & R_z^2 (1-\cos R_w) + \cos R_w \end{array} \right) \\ = \left( \begin{array}{ccc} \cos E'_y \cos E'_z - \sin E'_x \sin E'_y \sin E'_z & \cos E'_y \sin E'_z + \sin E'_x \sin E'_y \cos E'_z & \cos E'_x \sin E'_y \\ - \cos E'_x \sin E'_z & \cos E'_x \cos E'_z & - \sin E'_x \\ - \sin E'_y \cos E'_z - \sin E'_x \cos E'_y \sin E'_z & - \sin E'_y \sin E'_z + \sin E'_x \cos E'_y \cos E'_z & \cos E'_x \cos E'_y \end{array} \right) \tag{7} \) で、E'x、E'y、E'zをRx、Ry、Rz、Rwで表せれば良いという寸法。


まずは E'x から。(7)の両辺の 2行3列目を取ると、
\( R_yR_z(1-\cos R_w) + R_x\sin R_w = - \sin E'_x \tag{8} \)
よって、
\( E'_x = \arcsin{(- R_yR_z(1-\cos R_w) - R_x\sin R_w)} \tag{9} \)

次は E'y。(7)の 1行3列目 / 3行3列目 を計算すると、
\( \frac{ R_xR_z(1-\cos R_w) - R_y\sin R_w }{ R_z^2 (1-\cos R_w) + \cos R_w } = \frac{ \cos E'_x \sin E'_y }{ \cos E'_x \cos E'_y } \tag{10} \)
よって、
\( E'_y = \arctan \frac{ R_xR_z(1-\cos R_w) - R_y\sin R_w }{ R_z^2 (1-\cos R_w) + \cos R_w } \tag{11} \)

最後に E'z。(7)の 2行1列目 / 2行2列目 を計算すると、
\( \frac{ R_yR_x(1-\cos R_w) - R_z\sin R_w }{ R_y^2(1-\cos R_w) + \cos R_w } = \frac{ - \cos E'_x \sin E'_z }{ \cos E'_x \cos E'_z } \tag{12} \) よって、
\( E'_z = \arctan \left( - \frac{ R_yR_x(1-\cos R_w) - R_z\sin R_w }{ R_y^2(1-\cos R_w) + \cos R_w } \right) \tag{13} \)

これでMMDのオイラー角が全て求められた。ちなみに、E'x が直角だと、cosE'x が 0 になり、(10)、(12)の右辺分母が0になってしまう。ので、別の方法で計算しないといけない(計算方法を忘れたので続きはまた今度)。
E'xが直角だと何が起こるかというと、 Z軸・-X軸・-Y軸の順で回転させた結果、X軸回転後にY軸がもともとZ軸があった場所に来てしまう。Y軸を回してもZ軸を回しても結果は同じ、ということで答えが一意に定まらなくなる。

2017/12/20(Wed) 03:53:33