Мне нужно построить простой анимированный вектор стрелки в трехмерном пространстве.

Я пытаюсь отобразить один вектор магнитного поля (точка в пространстве, со стрелкой от начала координат), используя данные с датчиков телефона Android. Я написал простой сервер на Python для опроса телефона на предмет данных датчиков, и я хочу отображать полученные данные в режиме реального времени. Я ищу простое решение, но не могу найти.

Я просмотрел matplotlib, blender и visual python, но не смог найти достаточно простого решения, которое просто берет 3 координаты и графики. Полученные данные представляют собой просто вектор с 3 точками. Стрелка от начала координат не так важна, я просто хочу иметь возможность визуализировать движущуюся точку в трехмерном пространстве.

Также, при необходимости, я могу переписать сервер на Java и использовать библиотеку для построения графиков Java. Мне просто нужны некоторые предложения и короткие примеры кода, которые достигают этого.


person BDuelz    schedule 14.02.2012    source источник


Ответы (3)


Вы можете очень легко нарисовать сцену с помощью VPython:

from visual import *
import math

def make_grid(unit, n):
    nunit = unit * n
    f = frame()
    for i in xrange(n+1):
        if i%5==0: 
            color = (1,1,1)
        else:
            color = (0.5, 0.5, 0.5)

        curve(pos=[(0,i*unit,0), (nunit, i*unit, 0)],color=color,frame=f)
        curve(pos=[(i*unit,0,0), (i*unit, nunit, 0)],color=color,frame=f)
    return f

arrow(pos=(0,0,0), axis=(5,0,0), color=(1,0,0), shaftwidth=0.1)    
arrow(pos=(0,0,0), axis=(0,5,0), color=(0,1,0), shaftwidth=0.1)    
arrow(pos=(0,0,0), axis=(0,0,5), color=(0,0,1), shaftwidth=0.1)    
grid_xy = make_grid(0.5, 10)
grid_xz = make_grid(0.5, 10)
grid_xz.rotate(angle=pi/2, axis=(1,0,0), origin=(0,0,0))
grid_yz = make_grid(0.5, 10)
grid_yz.rotate(angle=-pi/2, axis=(0,1,0), origin=(0,0,0))
sphere(radius=0.3)

obj = arrow(pos=(0,0,0), axis=(1,2,3), shaftwidth=0.3)
th = 0
while True:
    rate(20)
    obj.axis = (3*math.cos(th), 3*math.sin(th), 2)
    th += 0.04

введите здесь описание изображения

person HYRY    schedule 15.02.2012

VPython очень прост:

pointer = arrow(pos=(0,0,0), axis=(1,2,3), shaftwidth=1)

Просто измените ось = (1,2,3) на 3 точки в вашем векторе. Дополнительную информацию можно найти здесь.

person jpalm    schedule 14.02.2012
comment
Как построить вектор в реальном времени? - person BDuelz; 14.02.2012
comment
Но, наконец, знаете ли вы, как я могу добавить сетку, чтобы показать оси x, y и z? - person BDuelz; 14.02.2012

Если С++ - это вариант, вам действительно стоит взглянуть на VTK.

http://www.vtk.org/

Он очень мощный для отображения трехмерных векторных полей и довольно прост в использовании.

person Simon Bergot    schedule 14.02.2012
comment
+1. В качестве примечания: вы можете использовать VTK в python как через официальные оболочки (которые являются прямым клоном интерфейса C++), так и через более питонические оболочки, такие как TVTK или Mayavi. Использование VTK напрямую для этого является излишним, но mlab intervface Mayavi делает это довольно легко. - person Joe Kington; 15.02.2012