在VTK中创建旋转和变换对象

时间:2014-10-12 16:30:35

标签: tcl transform scale vtk

我试图制作一个旋转立方体,将其比例(在每个轴上)改变到180度,然后慢慢缩小。

到目前为止,我已经得到了这个:

package require vtk
package require vtkinteraction

set xLength 2
set yLength 2
set zLength 2

vtkCubeSource cube
    cube SetXLength $xLength
    cube SetYLength $yLength
    cube SetZLength $zLength
    cube SetCenter 2 2 2

vtkPolyDataMapper cubeMapper
    cubeMapper SetInput [cube GetOutput]

vtkActor cubeActor
    cubeActor SetMapper cubeMapper
    [cubeActor GetProperty] SetColor 1 0.45 0
    [cubeActor GetProperty] SetDiffuse 0.9
    [cubeActor GetProperty] SetSpecular 0.45
    [cubeActor GetProperty] SetSpecularPower 20

vtkRenderer ren
vtkRenderWindow renWin 
    renWin AddRenderer ren

vtkRenderWindowInteractor iren
    iren SetRenderWindow renWin
    iren AddObserver UserEvent {wm deiconify .vtkInteract}
    iren Initialize

wm withdraw .

ren AddActor cubeActor
ren SetBackground 0.7 0.7 0.7
renWin SetSize 900 900

for {set i 0} {$i < 360} {incr i} {

    if {[expr $i % 2] == 0} {
        set xLength 3
        set yLength 3
        set zLength 3
    } else {
        set xLength 1
        set yLength 1
        set zLength 1
    }

    renWin Render
    [ren GetActiveCamera] Azimuth 1

}

vtkCommand DeleteAllObjects

我真的不知道如何正确地使其顺利过渡到规模并在每个循环迭代中呈现变化。有任何想法吗?感谢

1 个答案:

答案 0 :(得分:0)

您最有可能遇到的问题是您的代码太快了。当你画了一帧时,你已经推动了下一帧。慢一点! (如果使用普通Tk制作2D图形动画,这将是一个很大的问题。)

您希望在每个步骤之间稍微运行一下事件循环。也许是这样(你可能需要调整2"yes"只是一些不重要的任意值;重要的是你设置{{1} } {}导致GoOn停止服务事件循环的变量):

vwait

在这些行之后直截了当地说:

after 2 set GoOn "yes"
vwait GoOn

既然你已经给了用户实际感知动画一点时间,你应该有一些更容易看到的东西。你不必每秒处理 许多帧,让大脑认为动作是平滑的:电影用24,电视用30(在美国)或25(在欧洲)...