姿勢と位置(ロール/ピッチ/ヨー&xyz)のデータをコンマ区切りのファイルからBlenderにインポートできるかどうか知りたいですか?
小さなラジコンカーのデータを記録し、その動きを3Dの世界で表現したいと思います。
私もタイムスタンプを持っているので、オブジェクトの動きをアニメーション化する方法があれば、それは素晴らしいでしょう!
どんな助けでも大歓迎です!!
よろしくお願いします。
姿勢と位置(ロール/ピッチ/ヨー&xyz)のデータをコンマ区切りのファイルからBlenderにインポートできるかどうか知りたいですか?
小さなラジコンカーのデータを記録し、その動きを3Dの世界で表現したいと思います。
私もタイムスタンプを持っているので、オブジェクトの動きをアニメーション化する方法があれば、それは素晴らしいでしょう!
どんな助けでも大歓迎です!!
よろしくお願いします。
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カーの実際のサンプルファイルを使用して、より完全なソリューションを提供できます。
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
これによりファイルが読み取られ、それに応じて最初に選択されたオブジェクトの位置が更新されます。今後の方向性:アニメーションのキーフレームを設定する方法を確認する必要があります...
上記のソリューションに追加するには、この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)
私はそれをテストしていませんが、おそらくうまくいくでしょう、そしてあなたは始めます。
入力ファイルとして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)