python-vtk围绕行旋转actor
我是python和VTK新手,请耐心等待:) 简言之,我有一个演员,我想围绕我使用vtkLineSource()绘制的一条线旋转它。我选择了起点和终点,然后画了一条线。现在我想的是(如果我错了,请纠正我),我应该在直线上做一个轴,然后应用vtkTransformWXYZ()绕轴旋转。它不起作用,它会围绕所选的点进行奇怪的旋转,但不是我想要的。 我还尝试在我绘制的线的中间定义轴并对其应用旋转,但当我尝试时,它会围绕全局坐标旋转,而不是局部坐标。我也试着输入点或线,但同样,旋转非常奇怪 有没有办法将直线定义为一个轴,并围绕轴旋转演员?到目前为止,我在下面的例子中尝试过:但是我的演员总是以一种奇怪的方式旋转 谁能帮我指一下正确的方向吗 这是我的代码中我试图旋转演员的部分python-vtk围绕行旋转actor,python,vtk,actor,Python,Vtk,Actor,我是python和VTK新手,请耐心等待:) 简言之,我有一个演员,我想围绕我使用vtkLineSource()绘制的一条线旋转它。我选择了起点和终点,然后画了一条线。现在我想的是(如果我错了,请纠正我),我应该在直线上做一个轴,然后应用vtkTransformWXYZ()绕轴旋转。它不起作用,它会围绕所选的点进行奇怪的旋转,但不是我想要的。 我还尝试在我绘制的线的中间定义轴并对其应用旋转,但当我尝试时,它会围绕全局坐标旋转,而不是局部坐标。我也试着输入点或线,但同样,旋转非常奇怪 有没有办法将
###################### create line to rotate about and display it
lineStart = [16.8879, -106.476, -782.449]
lineFinish = [-17.827, -92.2757, lineStart[2]]
lineMiddle = [(lineStart[0]+lineFinish[0])/2, (lineStart[1]+lineFinish[1])/2, lineStart[2]]
lineSource = vtk.vtkLineSource()
lineSource.SetPoint1(lineStart)
lineSource.SetPoint2(lineFinish)
lineSource.Update()
mapperLine = vtk.vtkPolyDataMapper()
mapperLine.SetInputConnection(lineSource.GetOutputPort())
actorLine = vtk.vtkActor()
actorLine.SetMapper(mapperLine)
actorLine.GetProperty().SetLineWidth(4)
actorLine.GetProperty().SetColor(1,0,0)
ren.AddActor(actorLine)
############# rotate about the line
modelMapper = vtk.vtkPolyDataMapper()
modelMapper.SetInputData(cleanFilter.GetOutput())
modelActor = vtk.vtkActor()
modelActor.SetMapper(modelMapper)
modelAxesSource = vtk.vtkAxes()
modelAxesSource.SetScaleFactor(100)
modelAxesSource.SetOrigin(lineMiddle)
modelAxesMapper = vtk.vtkPolyDataMapper()
modelAxesMapper.SetInputConnection(modelAxesSource.GetOutputPort())
modelAxes = vtk.vtkActor()
modelAxes.SetMapper(modelAxesMapper)
ren.AddActor(modelAxes)
modelAxes.VisibilityOn()
##this did not work
##modelActor.SetOrientation(lineMiddle)
##modelActor.RotateZ(45)
##ren.AddActor(modelActor)
transform = vtk.vtkTransform()
transform.RotateWXYZ(45, lineMiddle)
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetTransform(transform)
transformFilter.SetInputConnection(cleanFilter.GetOutputPort())
transformFilter.Update()
NewMapper = vtk.vtkPolyDataMapper()
NewMapper.SetInputConnection(transformFilter.GetOutputPort())
actorRotated = vtk.vtkActor()
actorRotated.SetMapper(NewMapper)
ren.AddActor(actorRotated)
我还尝试了以下方法:
rotate = vtk.vtkRotationFilter()
rotate.SetInputConnection(cleanFilter.GetOutputPort())
rotate.SetAxisToY()
rotate.SetCenter(lineMiddle)
rotate.SetAngle(45)
mapper = vtk.vtkDataSetMapper()
mapper.SetInputConnection(rotate.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
ren.AddActor(actor)
但它没有显示任何内容
感谢您的帮助
提前感谢,,
Diana您可能需要编写一些函数,如:
def旋转(obj,角度,轴=(1,0,0),轴\点=(0,0,0),弧度=假):
“”“绕通过‘轴’点的任意‘轴’旋转。”
如果是rad:
角度rad=角度
其他:
角度rad=np.deg2rad(角度)
轴=utils.versor(轴)
a=np.cos(角弧度/2)
b、 c,d=-轴*np.sin(角度rad/2)
aa,bb,cc,dd=a*a,b*b,c*c,d*d
bc,ad,ac,ab,bd,cd=b*c,a*d,a*c,a*b,b*d,c*d
R=np.array(
[
[aa+bb-cc-dd,2*(bc+ad),2*(bd-ac)],
[2*(公元前-公元前),aa+cc-bb-dd,2*(公元前-公元前),aa+cc-bb-dd,2*(公元前+公元前)],
[2*(bd+ac)、2*(cd-ab)、aa+dd-bb-cc],
]
)
rv=np.dot(R,obj.GetPosition()-np.array(axis_point))+axis_point
如果是rad:
角度*=180.0/np.pi
#此vtk方法仅在对象的原点旋转:
对象旋转xyz(角度,轴[0],轴[1],轴[2])
pbj.设置位置(rv)
使用以下工具进行测试:
来自视频导入*
c1=立方体()
c2=c1.clone().c('violet').alpha(0.5)#制作克隆副本
v=向量(0.2,1,0)
p=向量(1,0,0)
c2.旋转(90,轴=v,轴=p)
l=直线(-v+p,v+p).lw(3.c('red')#vtkActor
显示(c1、c2、l、轴=1)
谢谢您的回复!我试图安装视频,但我不能。它告诉我它不能与我的vtk版本(我有版本9)一起使用。所以我试着把代码翻译成我的,我得到了同样的结果,但我不知道为什么。也许我做错了什么。我将在这里发布它正在做什么我的帖子被删除了,但我想说的是,轮换和以前一样。它绕轴上的正确点旋转,但它绕Z和Y旋转,而不是只绕Y旋转,我不知道为什么会发生这种情况。您应该能够使用
pip install--no deps vedo
安装它。如果直线与笛卡尔坐标轴之一不平行,则不可避免地会绕其他坐标轴旋转。如果您遇到任何问题,请随时向提交问题。非常感谢!我完全忘记了笛卡尔坐标轴。事实上,我必须首先正确对齐轴,然后它应该工作!我用你给我的命令安装了视频,我以前试过使用简单的pip。再次感谢!我最后做的是在旋转一次之后构造平移矩阵,然后执行T*R*-T,现在它显示了正确的位置