我想知道是否有可能在不移动/翻译的情况下缩放mayavi中的表面对象。
到目前为止,我只是使用surface.actor.actor.scale属性并为其分配一个3d向量。然而,表面不会保持其原始位置,而是相对于原点(0,0,0)进行缩放-这就是为什么表面看起来像在移动…任何想法?
当我询问vtk演员的origin
属性时,我是在真诚地询问他们已经尝试了什么。我已经玩了一点,但我不知道所有的细节,如何vtk演员决定定位自己,这是非常复杂和数学,我发现它大多更容易只是黑它,做数学手动(至少当数学是简单的)。
这里有一个更简单的解决方案。注意,这并不一定是最好的解决方案。也许有一个更干净的解决方案,我只是没有找到。
这个解决方案的基本思想非常简单:刮取表面顶点的x,y,z坐标,对这些点应用正确的线性平移,并将它们反馈给源。
surf = mlab.surf(*args) # somehow generate a surface
xc,yc,zc = centroid() #somehow determine the x,y,z coordinates to stabilize towards
scale_factor = 2.8
tx,ty,tz = surf.mlab_source.x, surf.mlab_source.y, surf.mlab_source.z
aff = np.eye(4)*scale_factor
aff[:,3] = (-xc,-yc,-zc,1)
dat = np.array(zip(tx,ty,tz,np.ones(len(tx))))
surf.mlab_source.x, surf.mlab_source.y, surf.mlab_source.z,_ = np.dot(aff, dat.T)