1

姿勢と位置(ロール/ピッチ/ヨー&xyz)のデータをコンマ区切りのファイルからBlenderにインポートできるかどうか知りたいですか?

小さなラジコンカーのデータを記録し、その動きを3Dの世界で表現したいと思います。

私もタイムスタンプを持っているので、オブジェクトの動きをアニメーション化する方法があれば、それは素晴らしいでしょう!

どんな助けでも大歓迎です!!

よろしくお願いします。

4

4 に答える 4

3

csvモジュールを利用したわずかな変更

import bpy
import csv

position_vectors = []

filepath = "C:\\Work\\position.log"

csvfile = open(filepath, 'r', newline='')
ofile = csv.reader(csvfile, delimiter=',')

for row in ofile:
    position_vectors.append(tuple([float(i) for i in row]))

csvfile.close()

これにより、ポイントがBlenderに取り込まれます。csv.readerの区切り文字パラメーターに注意してください。それに応じて変更してください。RCカーの実際のサンプルファイルを使用して、より完全なソリューションを提供できます。

于 2012-09-19T11:28:34.657 に答える
2

Blender v2.62の場合:

次のようなファイル「positions.log」がある場合:

-8.691985196313894e-002;  4.119284642631801e-001; -5.832147659661263e-001
 1.037146774956164e+000;  8.137243553005405e-002; -5.703274929662892e-001
-3.602584527944123e-001;  8.378614512537046e-001;  2.615265921163826e-001
 6.266465707681335e-001; -1.128416901202341e+000; -1.664644365541639e+000
 3.327523280880091e-001;  4.488553740582839e-001; -2.449449085462368e+000
-7.311567199869298e-001; -1.860587923723032e+000; -1.297179602213110e+000
-7.453603745688361e-003;  4.770473577895327e-001; -2.319515785100494e+000
 1.935170866863264e-001; -2.010280476717868e+000;  3.748000986190077e-001
 5.201529166915653e-001;  3.952972788761738e-001;  1.658581747430548e+000
 4.719198263774027e-001;  1.526020825619557e+000;  3.187088567866725e-002

あなたはblenderのこのpythonスクリプトでそれを読むことができます(インデントに気をつけてください!)

import bpy
from mathutils import *
from math import *
from bpy.props import *
import os
import time

# Init
position_vector = []

# Open file
file = open("C:\\Work\\position.log", "r")

# Loop over line in file
for line in file:

    # Split line at ";"
    splittet_line = line.split(";")

    # Append new postion
    position_vector.append(
        Vector((float(splittet_line[0]),
                float(splittet_line[1]),
                float(splittet_line[2]))))

# Close file
file.close()

# Get first selected object
selected_object = bpy.context.selected_objects[0]

# Get first selected object
for position in position_vector:
    selected_object.location = position

これによりファイルが読み取られ、それに応じて最初に選択されたオブジェクトの位置が更新されます。今後の方向性:アニメーションのキーフレームを設定する方法を確認する必要があります...

于 2012-05-22T12:45:35.793 に答える
1

上記のソリューションに追加するには、このPythonスニペットを検討してください

obj = bpy.context.object

temporalScale=bpy.context.scene.render.fps
for lrt in locRotArray:
   obj.location = (lrt[0], lrt[1], lrt[2])
   # radians, and do you want XYZ, or ZYX?
   obj.rotation_euler = (lrt[3], lrt[4], lrt[5])
   time = lrt[6]*temporalScale
   obj.keyframe_insert(data_path="location", frame=time)
   obj.keyframe_insert(data_path="rotation_euler", frame=time)

私はそれをテストしていませんが、おそらくうまくいくでしょう、そしてあなたは始めます。

于 2013-06-06T18:56:02.823 に答える
1

入力ファイルとしてspice2xyzvファイルを使用。「MutantBob」によって書かれたスクリプトは機能しているようです。

しかし、xyz速度データはオイラー角ではなくkm / sであり、インポートは角度に対して機能しないと思います。

# Records are <jd> <x> <y> <z> <vel x> <vel y> <vel z>
#   Time is a TDB Julian date
#   Position in km
#   Velocity in km/sec
2456921.49775 213928288.518 -446198013.001 -55595492.9135 6.9011736 15.130842 0.54325805

Blenderでそれらを取得するための解決策はありますか?速度角をオイラーに変換する必要がありますが、それは実際に可能ですか?

私はこのスクリプトを使用します:

import bpy
from mathutils import *
from math import *
from bpy.props import *
import os
import time

# Init
position_vector = []

# Open file
file = open("D:\\spice2xyzv\\export.xyzv", "r")

obj = bpy.context.object

temporalScale=bpy.context.scene.render.fps

for line in file:
    # Split line at ";"
    print("line = %s" % line)
    line = line.replace("\n","")
    locRotArray = line.split(" ")
    print("locRotArray  = %s" % locRotArray )
    #for lrt in locRotArray:
    print(locRotArray[1])
    obj.location = (float(locRotArray[1]), float(locRotArray[2]), float(locRotArray[3]))
    # radians, and do you want XYZ, or ZYX?
    obj.rotation_euler = (float(locRotArray[4]), float(locRotArray[5]), float(locRotArray[5]))
    time = float(locRotArray[0])*temporalScale
    print("time = %s" % time)
    obj.keyframe_insert(data_path="location", frame=time)
    obj.keyframe_insert(data_path="rotation_euler", frame=time)
于 2016-10-08T19:05:09.913 に答える