Я полагаю, вы используете измеренное ускорение, чтобы найти направление гравитационного притяжения (то есть вниз). Если вы двигаете акселерометр, кроме его поворота, будет дополнительная сила; Подумайте о акселерометре, имеющем маятниковую массу, которая движется от него, когда вы перемещаете его, маятник качается (хотя в этом случае это будет очень короткий, быстро реагирующий маятник?). Вы можете попытаться выполнить какую-то компенсацию движения, но может быть проще просто держать датчик в фиксированном месте.
Редактировать: хорошо, похоже, я полностью неправильно понял вопрос - вы хотите знать как сделать поворот в скрипте?
Похоже, что каждый объект Blender имеет три свойства (.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); они дают некоторые матрицы преобразования. Также похоже, что ваши данные акселерометра недооценены (вам нужно еще одно ограничение, задающее поворот вокруг направление «вниз» - может быть, какой-то инерционный расчет «наименьшего расстояния от предыдущей позиции»?)
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()