Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-vtk围绕行旋转actor_Python_Vtk_Actor - Fatal编程技术网

python-vtk围绕行旋转actor

python-vtk围绕行旋转actor,python,vtk,actor,Python,Vtk,Actor,我是python和VTK新手,请耐心等待:) 简言之,我有一个演员,我想围绕我使用vtkLineSource()绘制的一条线旋转它。我选择了起点和终点,然后画了一条线。现在我想的是(如果我错了,请纠正我),我应该在直线上做一个轴,然后应用vtkTransformWXYZ()绕轴旋转。它不起作用,它会围绕所选的点进行奇怪的旋转,但不是我想要的。 我还尝试在我绘制的线的中间定义轴并对其应用旋转,但当我尝试时,它会围绕全局坐标旋转,而不是局部坐标。我也试着输入点或线,但同样,旋转非常奇怪 有没有办法将

我是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,现在它显示了正确的位置