如何从csv文件导入xyz和roll / pitch / yaw到Blender?

时间:2012-04-19 20:49:08

标签: blender

我想知道是否可以将逗号分隔文件中的态度和位置数据(滚动/俯仰/偏航和xyz)导入Blender?

我记录了一辆小型遥控车的数据,我想在3D世界中代表它的运动。

我也有时间戳,所以如果有办法动画对象的动作,那就太棒了!

任何帮助将不胜感激!!

最诚挚的问候。

4 个答案:

答案 0 :(得分: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中的delimiter参数,相应地更改它。通过RC汽车的真实示例文件,我们可以提供更完整的解决方案。

答案 1 :(得分: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

这将读取文件并相应地更新第一个选定对象的位置。前进方向:您需要了解的是如何设置动画的关键帧......

答案 2 :(得分: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)

我没有测试过,但它可能会起作用,让你开始。

答案 3 :(得分:0)

使用spice2xyzv文件作为输入文件。该脚本由" Mutant Bob"似乎工作。

但是我认为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)