iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Modern Web

Three.js 的學習筆記系列 第 7

[Day 7] Three.js Animations

  • 分享至 

  • xImage
  •  

由於之前淨色的object比較難睇, 現在會用wireframe: true 去令到圖形更加易理解

wireframe: true

https://ithelp.ithome.com.tw/upload/images/20220919/20128975CYzovjIFkW.jpg
https://ithelp.ithome.com.tw/upload/images/20220919/201289759MxP0gevZF.jpg

而將第六日最後的一張圖改成這樣的話

const group = new THREE.Group()
group.position.y=1
group.scale.x=2
group.rotation.y=0.2
scene.add(group)

//cube 1
const cube1 = new THREE.Mesh(
new THREE.BoxGeometry(1,1,1,2,2,2),
new THREE.MeshBasicMaterial({color: 0x06ff06, wireframe: true})

)
group.add(cube1)

//cube 2
const cube2 = new THREE.Mesh(
    new THREE.BoxGeometry(1,1,1,2,2,2),
    new THREE.MeshBasicMaterial({
        color: 0xff0606,
        wireframe: true
    })
)
cube2.position.x=2
group.add(cube2)

//cube 3
const cube3 = new THREE.Mesh(
    new THREE.BoxGeometry(1,1,1,2,2,2),
    new THREE.MeshBasicMaterial({
        color: 0x0606ff,
        wireframe: true
    })
)
cube3.position.y=2
group.add(cube3)

就會變成這樣
https://ithelp.ithome.com.tw/upload/images/20220919/20128975PkBXIN3YKO.jpg

今日最主要係講animation,你可以想像每個顯示屏都是60fps(frame per second), 圖像的移動到時每張相片構建出嚟, 就像日本的漫畫電影一樣,一頁一頁每秒鐘六十頁構建出來
以下的code 是以螢幕的fps嚟寫, 尤其 window.requestAnimationFrame(tick)

// Animations
const tick =() =>
{
    //update objects
    group.position.x += 0.01

    //render
    renderer.render(scene, camera)
    window.requestAnimationFrame(tick)
}

tick() 

可以見到物件向右邊移動, 這是因為group.position.x += 0.01
如果加上

group.rotation.x += 0.01

就會變成

但用螢幕的fps嚟當clock 會有一個問題, 就是每一個屏幕的頻率都不一樣,有些是120有些是144
這會令網頁在不同螢幕顯示下出現不同的結果
所以之後會用時間來去控制移動的速度,今次我也改動了一些轉動的方向
Date.now() 用微秒 去計算的, 而且是從1970年開始數
https://ithelp.ithome.com.tw/upload/images/20220919/20128975RQXrDFOozr.jpg

//time
let time=Date.now()

// Animations
const tick =() =>
{
    //time
    const currentTime = Date.now()
    const runningTime= currentTime - time
    time = currentTime
    
    //update objects
    group.position.x += 0.001*runningTime
    group.rotation.y += 0.001*runningTime
    //render
    renderer.render(scene, camera)
    window.requestAnimationFrame(tick)
}

tick()

其實仲有一個簡單啲嘅方法就係用clock, clock 係每次網頁refresh時許會由零開始數

//clock
const clock=new THREE.Clock()

// Animations
const tick =() =>
{
    //time
    const elapsedTime = clock.getElapsedTime()
    console.log(elapsedTime)
    
    //update objects
    group.position.x = elapsedTime
    group.rotation.y = elapsedTime
    //render
    renderer.render(scene, camera)
    window.requestAnimationFrame(tick)
}

tick()

由於clock係根據要素加上去, 我們可以用一些數學方法嚟改變物件運行的軌跡例如用sin,cos,tan

例如

//update objects
group.position.x = Math.sin(elapsedTime)
group.rotation.y = Math.sin(elapsedTime)

//update objects
group.position.x = Math.sin(elapsedTime*1.2)*4
group.rotation.y = Math.tan(elapsedTime)

好今日就到這裏,第七日完!


上一篇
[Day 6] Three.js 的 Objects Rotation
下一篇
[Day 8] Three.js Animations - gsap Library
系列文
Three.js 的學習筆記12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言