SketchUp的二次開發(fā)探索(六)自生長動畫插件>>倫敦翻滾橋

Thomas Alexander Heatherwick 倫敦翻滾橋動畫效果:

倫敦翻滾橋

SU簡化模擬旋轉動畫效果▼

SU簡化模擬倫敦翻滾橋動畫效果

上一講我們實現(xiàn)了平滑拉高的效果,今天繼續(xù)帶小可愛們來看一下如何實平滑移動和平滑旋轉效果。

時鐘那一件我們提到了Geom::Transformation ,我們再來看下官方的demo:

移動translation

vector = Geom::Vector3d.new(0, 1, 0)
tr = Geom::Transformation.translation(vector)

旋轉rotation

point = Geom::Point3d.new(10, 20, 0)
vector = Geom::Vector3d.new(0, 0, 1)
angle = 45.degrees # Return 45 degrees in radians.
transformation = Geom::Transformation.rotation(point, vector, angle)

縮放scaling

point = Geom::Point3d.new(20, 30, 0)
scale = 10
tr = Geom::Transformation.scaling(point, scale)

參考平滑拉高,我們把移動、旋轉和縮放放入我們的延時循環(huán)體中去,就能得到對應的平滑動畫效果。


那我們再來實現(xiàn)一個復雜一點的放轉效果,文章首圖介紹托馬斯·亞歷山大·赫斯維克設計的倫敦翻滾橋。

簡化版旋轉動畫效果▼

簡化版旋轉動畫效果

思路分析:

  • 簡化橋體,由八節(jié)組成,每塊占45度角

  • 簡化旋轉,讓每節(jié)橋體按順序旋轉45度

  • 第N個塊旋轉的時候帶上前面所有塊

首先初始化模型,簡化每節(jié)橋體為一個長方體,設置長寬高,.mm可以設置我們的長度單位:


# 1、初始化模型,簡化橋每節(jié)長寬高
mod = Sketchup.active_model
ent = mod.entities
width = 100.mm
depth = 200.mm
height = 20.mm

2、新建一個組件,繪制第一節(jié)橋體▼
第一節(jié)橋體

新建一個組件來存放第一節(jié)橋體,畫一個面拉成體塊得到我們第一節(jié)橋:


# 2、新建一個組件,繪制第一節(jié)橋體
gp_01 = ent.add_group
face = gp_01.entities.add_face [0,0,0], [width,0,0], [width,depth,0], [0,depth,0]
face.reverse!
face.pushpull height

3、新建一個列表存放復制的8節(jié)橋體▼
image

復制7節(jié)橋體并把8節(jié)橋體存放到列表:

# 3、新建一個列表存放復制的8節(jié)橋體
gps = Array.new
gps[0] = gp_01
(2..8).each do |i|
  gps[i-1] = gp_01.copy
  tr = Geom::Transformation.new [width*(i-1),0,0]
  ent.transform_entities tr,  gps[i-1]
end

設置總節(jié)數(shù)N ,旋轉45度拆分成45次動畫,每次旋轉-1度:

# 4、共8節(jié)橋,每節(jié)旋轉45度,拆分成45次,每次旋轉-1度
n = 7
x = -1
frequency = 44
5、第N節(jié)橋體旋轉帶上之前的橋體▼
第N節(jié)橋體旋轉帶上之前的橋體

首先通過橋體寬度width計算每次旋轉的旋轉軸坐標center。每次旋轉的時候我們需要帶上之前已經旋轉過的橋體組件。

gps[7]
gps[7]+gps[6]
gps[7]+gps[6]+gps[5]
...

最后把動作拆分到N個frequency里面:

# 5、循環(huán)延時旋轉橋體
(0..n).each do |i|
  (frequency*i..frequency*(i+1)).each do |s|
      UI.start_timer(s*0.01 , false) {
      tr_no = n-i+1

      # 計算每次旋轉的軸
      center = [width*tr_no,0,0]
      tr = Geom::Transformation.new center,[0,1,0],x.degrees

      # 第N節(jié)橋體旋轉帶上之前的橋體
      (0..i-1).each do |i|
        ent.transform_entities  tr,  gps[n-i]
      end
  } 
  end 
end

完整代碼:

# 1、初始化模型,簡化橋每節(jié)長寬高
mod = Sketchup.active_model
ent = mod.entities
width = 100.mm
depth = 200.mm
height = 20.mm

# 2、新建一個組件,繪制第一節(jié)橋體
gp_01 = ent.add_group
face = gp_01.entities.add_face [0,0,0], [width,0,0], [width,depth,0], [0,depth,0]
face.reverse!
face.pushpull height

# 3、新建一個列表存放復制的8節(jié)橋體
gps = Array.new
gps[0] = gp_01
(2..8).each do |i|
  gps[i-1] = gp_01.copy
  tr = Geom::Transformation.new [width*(i-1),0,0]
  ent.transform_entities tr,  gps[i-1]
end

# 4、共8節(jié)橋,每節(jié)旋轉45度,拆分成45次,每次旋轉-1度
n = 7
x = -1
frequency = 44

# 5、循環(huán)延時旋轉橋體
(0..n).each do |i|
  (frequency*i..frequency*(i+1)).each do |s|
      UI.start_timer(s*0.01 , false) {
      tr_no = n-i+1

      # 計算每次旋轉的軸
      center = [width*tr_no,0,0]
      tr = Geom::Transformation.new center,[0,1,0],x.degrees

      # 第N節(jié)橋體旋轉帶上之前的橋體
      (0..i-1).each do |i|
        ent.transform_entities  tr,  gps[n-i]
      end
  } 
  end 
end

那把組件里面的橋體替換成我們文章首圖的橋體,就能得到我們首圖的效果了。

然后如果我們想把折疊起來的橋再展開,需要需要怎么實現(xiàn)呢?公眾號回復 翻滾橋 獲取展開和收起的插件。

文章轉載請注明出處author by Nicaicaiwo

Nicaicaiwo
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 38公里的距離 50分鐘的路程 對你仍舊執(zhí)著的思念 亂著我的心 可我 卻不敢再奮不顧身
    灼Y妖閱讀 107評論 0 0
  • 六十六、折翼 人說要心疼手涼的人 因為他們前世是折翼的天使 你上輩子沒作孽的話 怎么會折翼呢? 六十七、羽翼 人在...
    梅涼閱讀 399評論 11 12
  • 《春雪》 新年都未有芳華,二月初驚見草芽。白雪卻嫌春色晚,故穿庭樹作飛花。
    煥小妹閱讀 304評論 0 0
  • 第一次去酒吧 民謠歌手演唱會 沒想擠到前邊 反正也看不見 就坐在后邊 酒吧一進去就給人一種不一樣的感覺 彷佛與外界...
    小滿心歡喜閱讀 231評論 0 0

友情鏈接更多精彩內容