将 3D 对象与方向向量对齐

Align 3D object to direction vector

我代表一个 vtk 多边形数据对象,我用 vtkPlyReader 读取它并希望将它与给定的归一化方向向量对齐,以便它的方向与该向量匹配。

directionVector = np.array([-0.1134, -0.0695, 0.9911])

plyReader = vtk.vtkPLYReader()
plyReader.SetFileName(filePath)

transform = vtk.vtkTransform()
transform.RotateWXYZ(-90, 0, 0, 1) #initial rotation  
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetTransform(transform)
transformFilter.SetInputConnection(plyReader.GetOutputPort())
transformFilter.Update()

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(transformFilter.GetOutputPort())
mapper.ScalarVisibilityOn()
mapper.Update()

actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.Modified()

renderer.AddActor(actor) 

我知道我应该使用 vtkTransform 中的 Rotate() 函数,但不知道如何对齐它。

您可以尝试类似的方法:

        rotation = 0 # around new axis
        initaxis = [0,0,1] # old object's axis
        crossvec = np.cross(initaxis, newaxis)
        angle = np.arccos(np.dot(initaxis, newaxis))
        T = vtk.vtkTransform()
        T.PostMultiply()
        T.Translate(-pos)
        if rotation:
            T.RotateWXYZ(rotation, initaxis)
        T.RotateWXYZ(np.rad2deg(angle), crossvec)
        T.Translate(pos)

例如vedo 使用 above

from vedo import Cube, show
c0 = Cube(side=2).lw(1)
c1 = c0.clone().alpha(0.2).c('tomato')
c1.orientation([1,1,1], rotation=20).pos([2,2,0])
show(c0, c1, axes=1)