如何旋转 vtkVectorText 以面向一个方向?

How to rotate a vtkVectorText to face a direction?

我想在某个位置(下例中的[1,1,1])放置一个文本,它面向从原点[0,0,0]到文本所在位置的方向[1,1,1]

我试图计算 xy 和 xz 轴之间的两个旋转角度,并将它们与 RotateWXYZ 变换一起应用,但它不起作用。 在这种情况下,函数 GetAngleBetweenPoints 计算三个坐标之间的角度

此外,如果可能的话,我希望文本居中。

到目前为止我有这个代码:

from vtk import*
import numpy as np


def GetAngleBetweenPoints( endPt1, connectingPt, endPt2):
    x1 = endPt1[0] - connectingPt[0]
    y1 = endPt1[1] - connectingPt[1]
    x2 = endPt2[0] - connectingPt[0]
    y2 = endPt2[1] - connectingPt[1]
    angle = np.arctan2(y1, x1) - np.arctan2(y2, x2)
    angle = angle * 360 / (2 * np.pi)
    if (angle < 0) :
        angle += 360
    return angle


textSource = vtkVectorText()
textSource.SetText("Hello")
textSource.Update()

transfo = vtk.vtkTransform()
transfo.Identity()
transfo.PostMultiply()

x = 1
xo = 0
y = 1
yo = 0
z =1
zo = 1 
#angle Z
teta = GetAngleBetweenPoints( [x,y], [0,0], [xo,yo])
print(teta)
transfo.RotateWXYZ(+(teta),0, 0, 1)
# angle Y
teta = GetAngleBetweenPoints( [x,z], [0,0], [xo,zo])
print(teta)
transfo.RotateWXYZ(+(teta), 0, 1, 0)
transfo.Translate(x,y,z)

filter = vtk.vtkTransformPolyDataFilter()
filter.SetInputConnection(textSource.GetOutputPort())
filter.SetTransform(transfo)
filter.Update()



#Create a mapper and actor
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(filter.GetOutputPort())

actor =vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(1.0, 0.0, 0.0)

#Create a renderer, render window, and interactor
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

renderer.AddActor(actor)
renderer.AddActor(vtk.vtkAxesActor())
renderer.SetBackground(0.4, 0.3, 0.2)

renderWindow.Render()
style = vtk.vtkInteractorStyleMultiTouchCamera()
renderWindowInteractor.SetInteractorStyle(style)
renderWindowInteractor.Start() 

vtkplotter 的解决方案:

from vtkplotter import Text

t = Text('hello', pos=(1,1,1), c='white', justify='center') # t is a vtkActor
t.orientation([1,1,1])
t.show()