我试图制作一个旋转立方体,将其比例(在每个轴上)改变到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
我真的不知道如何正确地使其顺利过渡到规模并在每个循环迭代中呈现变化。有任何想法吗?感谢
答案 0 :(得分:0)
您最有可能遇到的问题是您的代码太快了。当你画了一帧时,你已经推动了下一帧。慢一点! (如果使用普通Tk制作2D图形动画,这将是一个很大的问题。)
您希望在每个步骤之间稍微运行一下事件循环。也许是这样(你可能需要调整2
,"yes"
只是一些不重要的任意值;重要的是你设置{{1} } {}导致GoOn
停止服务事件循环的变量):
vwait
在这些行之后直截了当地说:
after 2 set GoOn "yes"
vwait GoOn
既然你已经给了用户实际感知动画一点时间,你应该有一些更容易看到的东西。你不必每秒处理 许多帧,让大脑认为动作是平滑的:电影用24,电视用30(在美国)或25(在欧洲)...