關鍵字: VTK 視覺化程式設計;動畫演示;幀 ;旋轉;聯動
今天我們進一步地講解一下,動畫中的幀和旋轉。
1、時間幀
2、旋轉(基本變換)
3、一個案例(附程式碼)
可能大家搜尋引擎中檢索“VTK 機器人”什麼的關鍵字,就會看到一位VTk高手,XXX已失聯,的文章,以及上面的這個動畫影片。今天我們就詳細分析一下這個製作過程。
1、時間幀
在前面我們已經介紹了時間,是使用觀察者響應的方式來記錄時間的,其實我們可以理解這個概念。畢竟每一個人都會有一個自己的時間,雖然絕對時間是不變的(牛頓力學體系下)。
例如,很多人每天都是工作8小時,所以按天來計算,這個的工作天數就等於8小時。
我,可能工作時間通常在12小時以上,這個工作天數,可能要按12小時每天來計算。
所謂幀,就是一個響應所間隔的時間。也就是隔多長時間做一次事情。
在VTK裡,除了用time_counter這個引數來計算時間。
還有一個變數,
timerId = renderWindowInteractor.CreateRepeatingTimer(20)
也就是定義迴圈的時間。這個20,也就是20微秒重複一次。
重複的是什麼?就是重複整個過程。也就是每隔20微秒,把所有的過程全做一次。
2、旋轉
今天演示的這個過程,主要是2D的旋轉。2D的形變主要有三個,平移,縮放,旋轉。
VTK對這個變換的處理是有一個順序的:
TT
=T(px+ox,py+oy,pz+oz)⋅RZ⋅RX⋅RY⋅S(sx,sy,sz)⋅T(−ox,−oy,−oz)
從右到左(因為都是矩陣運算)
(1)先將模型平移到原點T(−ox,−oy,−oz)
(2)做一個縮放 S(sx,sy,sz)
(3)針對X,Y,Z做旋轉,也可以對其他的,總之第三步是做旋轉
(4)平移到模型原來的位置
也就是說平移是最後的。即使,我們要單獨做一個平移,也是在最後進行處理。
由於平移變換是可以交換的,也就是你先平移到東,再平移到西,和你先平移到西,再平移到東,是一樣的。最後的結果都不變。
實際上,我們不管在定義的時候,順序在程式碼上這麼變化,都不會變化。
而且變換是針對原模型的變化。
3、一個案例
以下,是我寫的一個程式碼:
class TimerCallback: def __init__(self): self.timer_count = 0 self.bleg = None self.sleg = None self.degree = 0 self.step = 1 self.direction= 1 def execute(self,obj,event): print(self.timer_count) if self.degree == 60: self.direction = -1 if self.degree == -60: self.direction = 1 self.degree += self.step*self.direction self.bleg.RotateY(self.step*self.direction) radian = self.degree*math.pi/180 x=math.cos(radian) z=math.sin(radian) o=[200*x-200,0,-200*z] o1=[200*x,0,200*z] self.sleg.SetOrigin(200,0,0) # self.sleg.RotateY(self.step*self.direction*2) self.sleg.SetPosition(*o) obj.GetRenderWindow().Render() self.timer_count += 1
有兩條腿,bleg就是大腿,主驅動。sleg是小腿。
大家可以揣摩上面的程式碼,來理解旋轉和平移中的關係。
4、結束
這些簡單的案例來說,可能不能顯示VTK的強大之處。後面我們會增加更為複雜的聯動的案例來說明。
祝大家新年快樂。
#動畫# #資料視覺化#