💡
aleph-r3fを試す
概要
以下の記事で、Aleph 3D viewerを紹介しました。
その後調べた結果、以下のリポジトリの存在も知りました。
以下のように説明されており、react-three-fiber
とshadcn/ui
を使用している点に違いがあるようでした。
Aleph is a 3D object viewer and annotation/measurement tool built with react-three-fiber and shadcn/ui
以下のように、アノテーション付与機能なども改良されているようでした。
今回の記事でも、菊池市デジタルアーカイブで公開されている「石淵家地球儀」の3Dデータを使用します。
使い方
以下で閲覧いただけます。
アノテーションタブで、アノテーションの付与を行うことができました。
アノテーションデータのインポート/エクスポートを行うことができ、JSON形式でのエクスポート結果は以下でした。
[
{
"position": {
"x": -0.06690392681702004,
"y": 0.6256817352784154,
"z": -0.7424544387001097
},
"normal": {
"x": -0.11627753958254597,
"y": 0.6430031011979032,
"z": -0.7569851687044529
},
"cameraPosition": {
"x": -0.15922188799592055,
"y": 1.1767071158114843,
"z": -1.4378842144444104
},
"cameraTarget": {
"x": -0.0023649930953979492,
"y": -0.0009789466857910165,
"z": -0.011684000492095947
},
"rotation": {
"isEuler": true,
"_x": 0,
"_y": 0,
"_z": 0,
"_order": "XYZ"
},
"label": "大西洋",
"description": "初めてのアノテーション"
}
]
カスタマイズ
「石淵家地球儀」を表示するにあたり、以下のようにソースコードを編集する必要がありました。
App.tsx
import './App.css';
import { useEffect, useRef } from 'react';
...
const [{ src }, _setLevaControls] = useControls(() => ({
src: {
options: {
// 'Measurement Cube': {
// url: 'https://cdn.glitch.global/afd88411-0206-477e-b65f-3d1f201de994/measurement_cube.glb?v=1710500461208',
// label: 'Measurement Cube',
// },
石淵家地球儀: 'https://sukilam.aws.ldas.jp/files/original/253efdf34478459954ae04f6b3befa5f3822ed59.glb',
'Flight Helmet':
'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/FlightHelmet/glTF/FlightHelmet.gltf',
...
また、Vercelへのデプロイにあたり、以下のように、tailwind.config.jsを修正する必要がありました。
GPTによる以下の回答を参考にしました。
このエラーは、tailwind.config.jsファイルがECMAScriptモジュール(ESM)として扱われており、そのためにmodule.exportsが定義されていないことを示しています。これは、ESMがデフォルトまたは強制されている環境(例えば、ViteやVercelの一部の設定)でよく発生します。
tailwind.config.js
/** @type {import('tailwindcss').Config} */
import tailwindcssAnimate from 'tailwindcss-animate';
export default {
darkMode: ['class'],
content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
theme: {
container: {
center: true,
padding: '2rem',
screens: {
'2xl': '1400px',
},
},
extend: {
colors: {
border: 'hsl(var(--border))',
input: 'hsl(var(--input))',
ring: 'hsl(var(--ring))',
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
primary: {
DEFAULT: 'hsl(var(--primary))',
foreground: 'hsl(var(--primary-foreground))',
},
secondary: {
DEFAULT: 'hsl(var(--secondary))',
foreground: 'hsl(var(--secondary-foreground))',
},
destructive: {
DEFAULT: 'hsl(var(--destructive))',
foreground: 'hsl(var(--destructive-foreground))',
},
muted: {
DEFAULT: 'hsl(var(--muted))',
foreground: 'hsl(var(--muted-foreground))',
},
accent: {
DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))',
},
popover: {
DEFAULT: 'hsl(var(--popover))',
foreground: 'hsl(var(--popover-foreground))',
},
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))',
},
},
borderRadius: {
lg: 'var(--radius)',
md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)',
},
keyframes: {
'accordion-down': {
from: { height: 0 },
to: { height: 'var(--radix-accordion-content-height)' },
},
'accordion-up': {
from: { height: 'var(--radix-accordion-content-height)' },
to: { height: 0 },
},
},
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
'accordion-up': 'accordion-up 0.2s ease-out',
},
},
},
plugins: [tailwindcssAnimate],
};
まとめ
今後、IIIFマニフェストファイルの参照などのカスタマイズにも試みたいと思います。
Discussion