首页 > 解决方案 > Mayavi(python)中对象的旋转

问题描述

几个问题:我将可用在线脚本的多个部分(主要是 matplotlib 和 mayavi 网站)组合在一起,以创建以下脚本。

如何使用欧拉角或每个球体的四元数相对于另一个旋转一个球体?(我不是指旋转视点,只是旋转整个对象及其颜色图)

或者一般来说,我怎样才能将其中一个球体相对于另一个球体旋转任意角度?

如果我将不透明度设置为 1.0,那么表面上的网格点将是可见的,如何在不损失表面质量的情况下创建不透明对象?另一方面,如果我将不透明度设置为 0.9,我会得到一个非常光滑的表面,但我可以看穿每个球体。我非常感谢您的帮助和反馈。 不透明度 = 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: rotate around y axis一种绕一个轴旋转的方法。如何扩展它以在 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;可能的解决方案:

我想我找到了一些可行的方法,但我很欣赏直接使用四元数的解决方案。我找不到有关语法“actor”的详细信息,但这是我的解决方案(我们可以通过单独提供旋转角度来旋转所有或每个单独的对象):

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()

标签: pythongraphicsmayavimayavi.mlab

解决方案


推荐阅读