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 中的 delimiter 参数,并相应地进行更改。通过您的遥控车的真实示例文件,我们可以提供更完整的解决方案。

于 2012-09-19T11:28:34.657 回答
2

对于搅拌机 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

您可以在搅拌机中使用此 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 文件作为输入文件。“突变鲍勃”编写的脚本似乎有效。

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