Вращение объекта в Майави (python) - PullRequest
0 голосов
/ 06 марта 2020

Пара вопросов: я собрал несколько частей доступных онлайн-сценариев, в основном веб-сайты matplotlib и mayavi, для создания приведенных ниже сценариев.

Как повернуть один из шперов относительно другого, используя углы Эйлера или кватернионы каждой сферы? (Я не имею в виду вращение точки обзора, просто вращение всего объекта с его цветовой картой)

или вообще, как я могу повернуть один из shperes относительно другого на произвольный угол?

Если я установлю непрозрачность на 1,0, то точки me sh на поверхности будут видны, как я могу создавать непрозрачные объекты без потери качества поверхности? С другой стороны, если я установлю непрозрачность на 0,9, у меня будет очень гладкая поверхность, но я могу видеть сквозь каждую сферу. Я высоко ценю вашу помощь и обратную связь. opacity = 1.0

from mayavi import mlab
import numpy as np
from scipy.special import sph_harm

[theta,phi] = np.mgrid[0:2*np.pi:400j,0:np.pi:400j]
x = np.sin(phi)*np.cos(theta)
y = np.sin(phi)*np.sin(theta)
z = np.cos(phi)

mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300))
mlab.clf()

def plot_sphere(p):
    m=0
    n=2
    s = sph_harm(m, n, theta , phi).real
    r,a,b,c = p
    return mlab.mesh(r*x+a, r*y+b, r*z+c, scalars=s, colormap='jet', resolution=50, opacity=0.9, transparent=False)  

#c = np.loadtxt("../data/d1.dat") 
c = [[10.0, 45.89, -10.99, -38.79], [10.0, 15.17, -22.34, -41.31]]
#plot_sphere(c[0])
for k in range(2):
    plot_sphere(c[k])


mlab.show()

Обновление 1:

Я нашел здесь Mayavi: вращение вокруг оси y метод вращаться вокруг одной оси. Как я могу расширить его, чтобы вращать объект (сферы) в 3D? либо с использованием углов Эйлера или кватернионов. Последовательное использование этого стиля вращения для создания чего-то вроде матрицы вращения R (x) R (y) R (z) не работает или, по крайней мере, я не очень хорошо знаком с ее деталями, чтобы это сделать.

Кстати, где я могу найти больше информации об этом синтаксисе "actor.actor"? Это стиль vtk?

Вот код:

from mayavi import mlab
import numpy as np
from scipy.special import sph_harm

[theta,phi] = np.mgrid[0:2*np.pi:400j,0:np.pi:400j]
x = np.sin(phi)*np.cos(theta)
y = np.sin(phi)*np.sin(theta)
z = np.cos(phi)

mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300))
mlab.clf()

def plot_sphere(p,ang_x):
    m=0
    n=2
    s = sph_harm(m, n, theta , phi).real
    r,a,b,c = p
    m = mlab.mesh(r*x+a, r*y+b, r*z+c, scalars=s, colormap='jet', resolution=50, opacity=0.9, transparent=False)  
    mx = m.actor.actor.rotate_x(ang_x)
    return 

#c = np.loadtxt("../data/d1.dat") 
c = [[10.0, 45.89, -10.99, -38.79], [10.0, 15.17, -22.34, -41.31]]
plot_sphere(c[0],0)
plot_sphere(c[1],90)
#for k in range(2):
#    plot_sphere(c[k])


mlab.show()

Обновление 2; возможное решение:

Я думаю, что нашел что-то, что работает, но я ценю решения, использующие кватернионы напрямую. Я не смог найти подробную информацию о синтаксисе «актер», но вот мое решение (мы можем вращать все или каждый отдельный объект, предоставляя углы поворота отдельно):

from mayavi import mlab
import numpy as np
from scipy.special import sph_harm

[theta,phi] = np.mgrid[0:2*np.pi:400j,0:np.pi:400j]
x = np.sin(phi)*np.cos(theta)
y = np.sin(phi)*np.sin(theta)
z = np.cos(phi)

mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300))
mlab.clf()

def plot_sphere(p):
    m=0
    n=2
    s = sph_harm(m, n, theta , phi).real
    r,a,b,c = p
    m = mlab.mesh(r*x+a, r*y+b, r*z+c, scalars=s, colormap='jet', resolution=50, opacity=0.9, transparent=False) 
    m.actor.actor.orientation = [30,90,45] #rotate all object  "[yaw, pitch, roll]" 
    return 

#c = np.loadtxt("../data/d1.dat") 
c = [[10.0, 45.89, -10.99, -38.79], [10.0, 15.17, -22.34, -41.31]]
plot_sphere(c[0])
plot_sphere(c[1])
#for k in range(2):
#    plot_sphere(c[k])


mlab.show()
...