1


X、Y、Zの3軸の加速度計で遊んでいます。サプライヤーのサイトには、重力を測定すると書かれています。

このデータをブレンダー ゲーム エンジンに送信し、そこで加速度計からのデータ値に応じてキューブをリアルタイムで回転させます。ただし、通過する値は一致していないようです。

各軸で、加速度計は各軸で -700 から 700 までの値を吐き出し、これらの値を Blender で使用できる値に変換する必要があります。私の数学の知識はゼロではないので、どこから始めればよいかわかりません。

誰かがこれに光を当てることができれば、それは素晴らしいことです.

どうも
ありがとう

編集 現在、回転値を行列に変換するために少しのPythonコードを使用しています:

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 
  matrix = [[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]]
  return matrix 

次に、 setOrientation(matrix) を使用して立方体の回転に影響を与えます。ただし、現在、マトリックス reorient() 関数に間違った値をスローしています

4

2 に答える 2

1

測定された加速度を使用して、重力の方向(つまり、下)を見つけていると思います。加速度計を回転させるだけでなく、動かす場合は、追加の力がかかります。加速度計から振り子のおもりが動いていると考えてください。それを動かすと、振り子が揺れます (ただし、この場合、非常に短く反応の速い振り子になりますか?)。ある種の動きの補正を試みることもできますが、センサーを固定位置に保つようにする方が簡単かもしれません.

編集:わかりました、質問を完全に読み違えたようです-スクリプトで回転を行う方法を知りたいですか?

各 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()
于 2011-03-24T15:13:03.697 に答える
1

加速度計を使用して、どちらが「上」であるかを正しく判断できると仮定しましょう。そのベクトルをNと呼ぶことができます。立方体の「上」方向をNに合わせたいようです。すでに述べたように、キューブは自由に回転できますが、目的を達成する可能性のある回転行列を見つけることはできますが、2 つの別々のケースを考慮する必要があります。そうしないと、ソリューションに特異点が生じます。 . 「Z」が立方体の「上」にあると仮定します。

3 つの加速度計の値をベクトルとして扱い、それを正規化すると ( Nを取得するため)、回転行列の新しい「Z」軸部分が得られ、z 方向を指すベクトルが「上」に整列するようになります。 ' ベクトル。

| a d N.x |   |0|   |N.x|
| b e N.y | * |0| = |N.y|
| c f N.z |   |1|   |N.z|

そのため、af をどうするかを決める必要があります。よくあることの 1 つは次のとおりです。Nがほとんど元の 'Z' 軸に沿って指している場合、行列の新しい 'Y' 軸部分をM = NクロスXにします。

d =  0
e =  N.z
f = -N.y

Mを正規化し、行列の 'X' 軸部分を見つけます: L = M cross N . Lを正規化します。

Nが主に「Z」軸に沿って指していない場合(Nz < .707)、M = N cross Zとして新しい「Y」軸部分が見つかります。Mを正規化し、 L = MクロスNを見つけ、最後にLを正規化します。


編集:

Ax、Ay、Az の 3 つの加速度計の値があります。最初のステップは、それらを正規化することです。

a = sqrt(A.x*A.x + A.y*Ay + A.z*A.z);      and then 
N.x = A.x/a;  N.y = A.y/a;  N.z = A.z/a;

N == [0, 0, 1]その場合、正しい回転行列は恒等行列であると仮定します。Nがz 軸に沿って直接指していない場合、立方体の z 軸を回転させてNと一直線になるようにする行列を作成します。

于 2011-03-24T17:24:12.983 に答える