Blenderのpythonでクオータニオン(Quaternion)を勉強した。しかし、BlenderのQuaternionの機能は一切使わない。Quaternionを使った計算方法、モデルの操作方法が知りたいからだ。
まとめ
先に、まとめを書く。
クォータニオンで
オブジェクトの回転ができる。
回転が、任意のベクトルでできる。
注意点
- アフィンと違い、行列の積ではない。Quaternion同士の積は、独自ルールのかけ算が要る。
- 原点を中心として回転になるので、原点を通らないベクトルで回転させたいときは、座標系の変換がいる。
やりたい事、やりたくない事
- やりたくない事
- Quaternionの数学的な理解。
- やりたいこと
- Quaternionの数学的操作。
ググったら、
blenderのpythonを使って、オブジェクトを回転させている記事はあった。)
しかし、オブジェクトの操作のAPIが、クォータニオンを直接受け取れるから実行できるコマンドの記事だった。クォータニオンを使って、計算をしているわけではなかった。
クォータニオンが、回転のどこら辺に効いているのかを知りたい。
そこで、自分で用意した3×3×3=27個の点の回転をクォータニオンで計算する。
クォータニオンは…
その前に、クォータニオンについて、参考書やネットなどで情報収集した。
- クォータニオンは複素数の拡張版。実数一つに、虚数三つ、計四つ。これは暗記した知識として持っている。「先頭が角度で、その後にx,y,zに関わる何か?」な状態。何も具体的にイメージできない。
- プログラムとかだと、独自の型をもったクォータニオン型の変数として表されることが多い。行列みたく、単なる長さ4の配列じゃなめなのか。
- 回転を表すクォータニオンはサイズが1らしい。だったらサイズ1以外だったらどうなっちゃうのか。
そもそも、回転を表すクォータニオンを準備できたとして、どうやって物を(例えばxyz座標上の点を)回転操作するのか。掛け算?
「どうせアフィンみたく行列の掛け算でできるんだろ?もったいぶるなよ。」とか思ってたが違った。
Blenderのモデル
下記コードでできたモデルを使った。
coord = [[[[i,j,k] for i in range(3)] for j in range(3)] for k in range(3)]
for i in range(3):
for j in range(3):
for k in range(3):
bpy.ops.mesh.primitive_uv_sphere_add(size=1, view_align=False, enter_editmode=False, location=(coord[i][j][k][0]*3, coord[i][j][k][1]*3, coord[i][j][k][2]*3), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
mat = bpy.data.materials.new("Material_%s_%s_%s"%(coord[i][j][k][0]+1, coord[i][j][k][1]+1, coord[i][j][k][2]+1))
bpy.context.object.data.materials.append(mat)
bpy.context.object.active_material_index = 0
bpy.context.object.active_material.diffuse_color = (coord[i][j][k][0]/3.0, coord[i][j][k][1]/3.0, coord[i][j][k][2]/3.0)
bpy.context.object.data.name = "ball_%s_%s_%s"%(coord[i][j][k][0]+1, coord[i][j][k][1]+1, coord[i][j][k][2]+1)
bpy.context.object.name = "ball_%s_%s_%s"%(coord[i][j][k][0]+1, coord[i][j][k][1]+1, coord[i][j][k][2]+1)
拾ってきた式
クォータニオンの操作は、この本を参考にした。。面白かった。
クォータニオン
クォータニオンは、こんな感じで4つ1セット書かれている。
座標
位置ベクトルをクォータニオンで表す。
座標が[x,y,z]だとしたら、
クォータニオンは[0,x,y,z]と最初に0をつけるだけ。(本当は0+xi+yj+zkと書くべき?)
回転を表すルール
上記が成立するクォータニオンは、回転を表現できる。
回転を表しつつ、上記ルールを守るための、三角関数を使ったクォータニオン
「二つしかないからクォータニオンじゃないじゃん!」→実部と虚部を分けて書いてあるだけ。
- 右側(虚部)の数値は、虚部で分け合って使う。
- 分け合い方で、回転軸のベクトルを作る。
- さらに上記「二乗して合計して1」というルールも守って作らなければならない。
は、逆四元数。虚部の正負がひっくり返った四元数。
cosとsinがどんな塩梅で合計1になりそうかは、ちょっと分からん。
↑こんな感じで配分してみた。
1/3は、三等分だから。
√2は、わからん。
とにかく、√2/3しとくと、「二乗して合計して1」ルールを満たす。
回転操作
クォータニオンのかけ算
回転にはクォータニオンのかけ算を使う。
クォータニオンのかけ算のルールは、以下の式。独自ルール。甘くはなかったか。
これは、関数を使って実現しておく。スカラー,i,j,kは別々に計算して返せばいいだろう。自作なので、わざわざクォータニオン型とか作らんで、配列でやっとけばいっか。自分がわかってればいいもんね。
def quakakezan(q=[1,2,3,4],r=[5,6,7,8]):
a=q[0]*r[0]-q[1]*r[1]-q[2]*r[2]-q[3]*r[3]
b=q[0]*r[1]+q[1]*r[0]+q[2]*r[3]-q[3]*r[2]
c=q[0]*r[2]+q[2]*r[0]+q[3]*r[1]-q[1]*r[3]
d=q[0]*r[3]+q[3]*r[0]+q[1]*r[2]-q[2]*r[1]
e =[a,b,c,d]
return e
想定外の変数が入ってきたら、エラーで止まるかも。
最初から値が入っているのは、自分がどんな値を入れたらいいか忘れそうだし、関数のすぐ下にコメントアウトで説明書き入れたって、どうせ読まないから、あえて入れちゃう。
回転操作
- 座標の位置クォータニオンを作る。
- 前述、回転のためのクォータニオンを作る。
- 2.を、前と後ろから、かける
もちろん、四元数のかけ算のルールで計算する。
テクスチャを貼っていないから気づかないだろうけど、ボールは回転していない。同じ向きを画面に向けたまま。
BlenderのQuaternionの機能を使って回転させると、ボールの向きも変わるが、それはしなかった。
コード全体は、YouTubeの説明のところに書いてあるので、ぜひ見てください。
振り返ってみると
テクスチャを貼って、オブジェクトのvertexを回転させるのでもよかった気がする。
が、あえてオブジェクトをすべて動かすことで、何か理解した気になった。
https://mydurogti.mystrikingly.com/blog/czech-hunter-50
https://seesaawiki.jp/riewatrandsi/d/Crack OutWit Hub For Firefox 2 1 2 32 Bewerbungs Schleife
https://pavbedstonni.mystrikingly.com/blog/rar-ginghina-mic-tratat-cardiologie-38-ebook-pdf-full-edition-torrent
https://kiyversandsum.mystrikingly.com/blog/usb-to-db9-rs232-serial-adapter-driver
https://neu-social.lovestorm-people.com/post/129359_ik-multimedia-modo-bass-v1-5-0-incl-keygen-rar-full-versionl-ik-multimedia-modo.html
https://www.adultzoo.club/post/900_ranchi-diaries-movie-720p-download-kickass-ranchi-diaries-movie-720p-download-ki.html
https://www.obee.vip/post/367580_termus-acca-crack-v20-termus-acca-termus-acca-crack-termus-acca-prezzo-termus-ac.html
https://valocean.com/post/903_resnick-halliday-walker-class-11-pdf-free-resnick-halliday-walker-class-11-resni.html
https://ferslaphiwa.mystrikingly.com/blog/kahin-iso-activation-download-pc
https://wakelet.com/wake/q-K1c_gx_OgbFr_NhK3sg
https://battlefinity.com/upload/files/2021/11/3zUc1RWwNn4DpODRi6DA_28_cf18f420bc3153959016dd5bd59e4b20_file.pdf
https://www.homify.in/ideabooks/8497102/microsoft-playready-drm-crack-11
https://www.japanesewomenorg.com/read-blog/333
https://uploads.strikinglycdn.com/files/c90469c5-5593-4efa-beb4-45f1e6a73dea/Whatsapp-Messenger-Hack-V30-20.pdf
https://mapagepo.weebly.com/uploads/1/3/9/4/139455971/cracked-app-store-no-jailbreak.pdf
https://www.pixnet.net/pcard/3200360225c9b3cd49/article/3a7d0910-4f58-11ec-8f3c-7bd703e91398
https://bullpoufdanin.weebly.com/lapielquehabito720pmega.html
https://giosaikedapar.wixsite.com/questikamvi/post/mkv-harry-potter-e-o-prisioneiro-subtitles-film-dubbed
https://trello.com/c/PvbNA0ON/15-ibm-pc-and-clones-by-govindarajulu-e-book
https://obretabfisamb.wixsite.com/ryahardphartua/post/veerappan-movie-download-in-hindi-hd-kickass-720p
https://lifeso.me/read-blog/8705
https://uploads.strikinglycdn.com/files/c3d80091-abaa-421b-9d6b-1fd1cba6603c/2d-Fighter-Maker-2002-Pc-41-ludeljames.pdf
https://docs.google.com/viewerng/viewer?url=www.photowall.name/read-blog/313
https://docs.google.com/viewerng/viewer?url=www.beautyafricana.com/upload/files/2021/11/rurXW7Uqij27vKQHNT7v_29_957fc9751c5da590f469e9820bb910a1_file.pdf
https://www.cloudschool.org/activities/ahFzfmNsb3Vkc2Nob29sLWFwcHI5CxIEVXNlchiAgICfm_XeCQwLEgZDb3Vyc2UYgICA_8TltwgMCxIIQWN0aXZpdHkYgIDAoLLKnAgMogEQNTcyODg4NTg4Mjc0ODkyOA
https://www.cloudschool.org/activities/ahFzfmNsb3Vkc2Nob29sLWFwcHI5CxIEVXNlchiAgID_pPu5CgwLEgZDb3Vyc2UYgIDAgPKMwAgMCxIIQWN0aXZpdHkYgIDAoLO99wgMogEQNTcyODg4NTg4Mjc0ODkyOA
https://www.cloudschool.org/activities/ahFzfmNsb3Vkc2Nob29sLWFwcHI5CxIEVXNlchiAgMDAx5uRCQwLEgZDb3Vyc2UYgIDAgLiPrwoMCxIIQWN0aXZpdHkYgIDAkIqv2wgMogEQNTcyODg4NTg4Mjc0ODkyOA
https://www.cloudschool.org/activities/ahFzfmNsb3Vkc2Nob29sLWFwcHI5CxIEVXNlchiAgMCA37GTCQwLEgZDb3Vyc2UYgIDAgOK1mwgMCxIIQWN0aXZpdHkYgIDAkOjVjQoMogEQNTcyODg4NTg4Mjc0ODkyOA