首頁>技術>

關鍵字: 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的強大之處。後面我們會增加更為複雜的聯動的案例來說明。

祝大家新年快樂。

#動畫# #資料視覺化#

18
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 高斯樸素貝葉斯教程與Python實現