我猜你正在使用测量的加速度来找到引力的方向(即向下)。如果你在移动加速度计,除了转动它之外,还会有一些额外的力;想想加速度计有一个摆锤,当你移动它时,摆锤会摇摆(尽管在这种情况下它会是一个非常短的、快速反应的摆锤?)。您可以尝试进行某种运动补偿,但尝试将传感器保持在固定位置可能会更简单。
编辑:好的,看起来我完全误解了这个问题——你想知道如何在脚本中进行轮换吗?
看起来每个 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()