跳到內容

每條游來游去的小魚,都是正在瀏覽這一頁的訪客,有一條是你自己 ( ´ ▽ ` )ノ 覺得干擾閱讀的話,可以把小魚關掉。

動態畫廊

util

自由變換排版的畫廊。

名稱描述
Babylon.js3D 引擎
Anime.js輕量級 JavaScript 動畫函式庫
JS 動畫基於 JavaScript 實現的動畫,達成更複雜、精準的動畫控制,常見套件有 GSAP、anime.js 等
物理模擬模擬真實世界物理現象,如重力、碰撞、速度等物理效果

切換 type 時,動態變更圖片排版

loading...
<template>
<div class="mt-4 w-full flex flex-col gap-4">
<util-motion-gallery
v-slot="{ isLoading }"
class="h-full"
:image-list
:layout
>
<transition name="opacity">
<div
v-if="isLoading"
class="absolute h-full w-full flex-center bg-black/50"
>
<div class="flex flex-col items-center gap-4">
<div class="h-10 w-10 animate-spin border-4 border-white border-t-transparent rounded-full" />
<span class="text-2xl text-white tracking-widest">
loading...
</span>
</div>
</div>
</transition>
</util-motion-gallery>
<select-stepper
v-model="type"
:options
class="w-full text-center"
/>
</div>
</template>
<script setup lang="ts">
import type { ComponentProps } from 'vue-component-type-helpers'
import { computed, ref } from 'vue'
import SelectStepper from '../../select-stepper.vue'
import UtilMotionGallery from '../util-motion-gallery.vue'
type Props = ComponentProps<typeof UtilMotionGallery>
type LayoutType = NonNullable<Props['layout']>['type']
const imageList: [string, ...string[]] = [
'/low/painting-codfish-bakery.webp',
'/low/painting-codfish-rain.webp',
'/low/photography-fireworks.webp',
'/low/photography-morning-light-of-rice.webp',
'/low/photography-big-stupid-bird.webp',
'/low/photography-ears-of-rice.webp',
'/low/photography-gaomei-windmill.webp',
'/low/photography-spider-at-night.webp',
'/low/photography-street-cat.webp',
'/low/photography-afternoon-cicada-chirping.webp',
'/low/photography-whispers-of-the-setting-sun.webp',
'/low/photography-city-of-lights-from-the-mountainside.webp',
]
const type = ref<LayoutType>('helix')
const layout = computed(() => ({
type: type.value,
}))
const options: LayoutType[] = [
'grid',
'wheel',
'tunnel',
'ball',
'helix',
'folder',
]
</script>
<style scoped lang="sass">
.opacity-enter-active, .opacity-leave-active
transition-duration: 0.4s
.opacity-enter-from, .opacity-leave-to
opacity: 0 !important
</style>

以 babylon.js 處理 3D 物件的旋轉、縮放、平移等等變換,以 anime.js 驅動動畫效果。

在 3D 空間中旋轉的物體需考慮每個軸的旋轉順序,會影響最終的旋轉結果。

也就是說同樣是每個軸各轉 90 度,但 XYZ、 ZYX、YZX 這三種順序的結果會不一樣呦!( ゚ ∀。)

詳細說明可見 Sequencing Rotations

常常轉到腦袋打結 ~( ゚ ∀。)~

type Layout = {
type: 'grid';
gap?: number;
} | {
type: 'wheel';
radius?: number;
} | {
type: 'tunnel';
radius?: number;
depthGap?: number;
} | {
type: 'ball';
radius?: number;
} | {
type: 'helix';
/** 螺旋半徑,預設 1 */
radius?: number;
/** 螺距(每圈上升的高度),預設 2 */
pitch?: number;
} | {
type: 'folder';
/** 照片之間的重疊間距 */
overlap?: number;
/** 聚焦照片升起的高度 */
riseHeight?: number;
}
interface Props {
layout?: Layout;
/** 不足 30 張會自動重複填充至 30 張 */
imageList: [string, ...string[]];
fpsVisible?: boolean;
/** 背景色。無限遠處的顏色 */
clearColor?: Color4;
/** 霧化色。足夠遠處的照片會被此顏色籠罩 */
fogColor?: Color3;
}