2012-04-19 34 views
0

カンマ区切りのファイルから姿勢と位置(ロール/ピッチ/ヨー)のデータをBlenderにインポートすることができるかどうかを知りたいですか?csvファイルからxyzとroll/pitch/yawをどのようにしてBlenderにインポートできますか?

小さなRCカーからのデータを記録しました。その動きを3D世界で表現したいと思います。

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

ご協力いただければ幸いです!

よろしくお願いいたします。

あなたはのように見えるファイル「positions.log」がある場合:ブレンダーv2.62の場合

+0

私はこのスクリプトを使うのか? 2.4xまたは2.5x? –

+0

最後はラッシュのため、私は最終的にGoogle EarthでルートXMLファイルを作成して実装しましたが、私が望んでいたものではありませんでした。 – Rommel

答えて

2

-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 

をあなたはブレンダーでこの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 

これは、ファイルを読み取り、それに応じて最初に選択したオブジェクトの位置を更新します。ウェイフォワード:何を見つけるために持っていることは、アニメーションのキーフレームを設定する方法です...

3

わずかmodifcation、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() 

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

0

はこの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) 

上記のソリューションに追加を検討し、私はそれをテストしていませんが、それはおそらく動作しますが、あなたは開始されます。

0

入力ファイルとしてspice2xyzvファイルを使用します。 「ミュータント・ボブ」によって書かれたスクリプトはうまくいくようだ。

しかし、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でそれらを入手する方法はありますか?私は速度の角度をオイラーに変換すべきでしょうか、それは実際に可能ですか?使用しているの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) 
関連する問題