測定された加速度を使用して、重力の方向(つまり、下)を見つけていると思います。加速度計を回転させるだけでなく、動かす場合は、追加の力がかかります。加速度計から振り子のおもりが動いていると考えてください。それを動かすと、振り子が揺れます (ただし、この場合、非常に短く反応の速い振り子になりますか?)。ある種の動きの補正を試みることもできますが、センサーを固定位置に保つようにする方が簡単かもしれません.
編集:わかりました、質問を完全に読み違えたようです-スクリプトで回転を行う方法を知りたいですか?
各 Blender オブジェクトには、現在の値 (ラジアン単位) を含む 3 つのプロパティ (.RotX、.RotY、.RotZ) と、回転を実行するメソッド (.rot(new_rotx, new_roty, new_rotz)) があるようです (次のドキュメントを参照)。http://www.blender.org/documentation/249PythonDoc/Object.Object-class.html )。現在、回転がどのように適用されるかを調べています。もっと早く。
Edit2:角度はオイラー角 (http://en.wikipedia.org/wiki/Euler_angles) として指定されているようです。それらはいくつかの変換行列を提供します。また、加速度計データの制約が不十分であるように見えます (「下」方向の回転を指定する、もう 1 つの制約が必要です。おそらく、ある種の慣性「前の位置からの最小距離」の計算ですか?)
Edit3:役立つサンプル スクリプトがあります。私のマシンでは C:\Users\Me\AppData\Roaming\Blender Foundation\Blender.blender\scripts\object_random_loc_sz_rot.py にあります。現在選択されているオブジェクトを取得し、その回転を微調整する方法を示しています。それが役立つことを願っています!
Edit4:議論のために、ここにいくつかのサンプル コードがあります。少し冗長かもしれません (私はこれまで Blender で作業したことがありません) 。問題は解決しませんが、少なくともさらなる議論のための共通の基礎を与えてくれます ;-)
#!BPY
"""
Name: 'Set rotation by accelerometer'
Blender: 249
Group: 'Object'
Tooltip: 'Set the selected objects rotation by accelerometer'
"""
__bpydoc__=\
'''
This script sets the selected objects rotation by accelerometer.
'''
from Blender import Draw, Scene
import math
def reorient(alpha, beta, gamma):
a = math.cos(alpha)
b = math.sin(alpha)
c = math.cos(beta)
d = math.sin(beta)
e = math.cos(gamma)
f = math.sin(gamma)
ad = a*d
bd = b*d
return = [
[c*e, -a*f+b*d*e, b*f+a*d*e],
[c*f, a*e+b*d*f, -b*e+a*d*f],
[-d, b*c, a*c ]
]
def getAccel():
# test stub -
# need to get actual values from accelerometer here
dx = -700
dy = 100
dz = 250
return (dx,dy,dz)
def normalize(vec):
"Return scaled unit vector"
x,y,z = vec
mag = (x*x + y*y + z*z)**0.5
return (x/mag, y/mag, z/mag)
def main():
scn = Scene.GetCurrent()
try:
obj = scn.objects.context
euler = (obj.RotX, obj.RotY, obj.RotZ)
except AttributeError:
return
down = normalize(getAccel())
matrix = None
# do something here to find new rotation-matrix
# based on euler and down
# then
if matrix:
obj.setOrientation(matrix)
else:
# test value:
# if reorient() is working properly, the
# object's rotation should not change!
obj.setOrientation(reorient(*euler))
if __name__=="__main__":
main()