我希望在某个位置(下例中的[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()
关于python - 如何旋转 vtkVectorText 使其面向某个方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57676873/