几个问题:我将可用在线脚本的多个部分(主要是 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()