python - 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()
解决方案
推荐阅读
- c# - 为什么 Xaml 在运行时反序列化 - 而不是在编译时?
- excel - 使用 VBA 切换 Excel 功能区
- docker - 如何安装 32 位 docker 容器
- android - Android Google Play Services-Vision 源码
- javascript - 如何将 GLSL 文件与 Gulp 捆绑在一起?
- linux - 如何在 Bash 中对字母数字字符串进行排序
- php - 无法使用 SquareConnect 创建变体
- sql - SQLPLUS SPOOL - NUMBER 字段上的 TO_CHAR 添加尾随空格
- mysql - MySQL WHERE IN(字符串的子字符串)?
- c# - NUnit 中的 TypeOf 和 InstanceOf 有什么区别?