この記事では、複数のアプリケーション間で3Dモデルデータを効率的に共有するための3DSS-API(3D Shape Share API)について詳しく解説します。API設計の考え方から実装方法まで、開発者向けに包括的にお伝えします。
3DSS-APIとは何か?なぜ必要なのか
現代のアプリケーション開発において、データの一元管理と共有は重要な課題です。特に3Dモデルのような複雑なデータを扱う場合、複数のアプリケーション間でデータの整合性を保ちながら効率的に共有する仕組みが必要になります。
3DSS-API(3D Shape Share API)は、まさにこの課題を解決するために設計されたプラットフォームAPIです。Firebase Cloud Functions上に構築され、Firestoreに保存された3Dモデルのメタ情報をJSON形式で提供します。
3DSS-APIの主なメリット:
- 複数のアプリケーション間でのデータ整合性の確保
- 3Dモデルデータの一元管理
- 開発効率の向上とコードの重複排除
- スケーラブルなデータアクセス基盤の提供
3DSS-APIの概要
プロジェクト構成
3DSS-APIは以下の技術スタックで構築されています:
- プロジェクト名: 036-3dss-api(ローカルのAPI専用プロジェクト)
- Firebaseプロジェクト: shapeshare3d(本番の3D Shape Shareと同一)
- 実行環境: Cloud Functions + Express
- データベース: Firestore
Base URL
現在の主要エンドポイント
GET /models/v1- モデル一覧取得GET /models/v1/:id- 単一モデル取得
役割: 3D Shape ShareのFirestoreに保存されているモデル情報をJSONで返す「窓口」として機能します。将来的には/users/v1、/boards/v1、/articles/v1なども追加予定です。
プラットフォーム設計の考え方
3DSS-APIはプラットフォーム層とアプリ層の2層構造で設計されています。この設計により、効率的なデータ共有とアプリケーション間の疎結合を実現しています。
アーキテクチャの概念
【アプリ層】
インテリアかるた、Webプレゼン、シミュレーション等の各アプリケーション
→ それぞれ独自のFirestore/DBを持ってもOK
【プラットフォーム層】
3DSS-API(共通データへのアクセス窓口)
→ 3Dモデル、ユーザー、チーム、ボード、共通タグなどを管理
データ共有の原則
各アプリケーションは以下の原則に従ってデータを扱います:
- IDのみを保持: modelId、userId、boardId等の参照IDのみを保存
- 詳細データはAPI経由: 実際のデータは3DSS-APIから動的に取得
- 共通データの一元管理: 3Dモデル等の共通リソースはプラットフォーム層で管理
このアプローチのメリット:
- どのアプリからでも同じBase URLで共通3Dデータにアクセス可能
- データの整合性が保たれる
- アプリ間でのデータ連携が容易
- データ更新時の影響範囲を最小限に抑制
現在のAPI仕様
現在提供されている3DSS-APIのエンドポイントは以下の通りです:
| メソッド | エンドポイント | 説明 | パラメータ | レスポンス |
|---|---|---|---|---|
| GET | /models/v1 | モデル一覧取得 (学習/デモ用) | limit(任意、デフォルト10) | 200 OK |
| GET | /models/v1/:id | 単一モデルの詳細情報取得 | id(必須) | 200 OK / 404 Not Found |
レスポンス形式
APIレスポンスに含まれる主要フィールドは以下の通りです:
| フィールド | 説明 | 型 |
|---|---|---|
| id | モデルの一意識別子 | string |
| slug | URL用識別子 | string |
| title | モデル名 | string |
| thumbnailUrl | サムネイルURL | string |
| category | カテゴリパス | string |
| modelFormats | 提供フォーマット | array |
| dimensions | サイズ情報 | object |
| tags | 関連タグ | array |
レスポンス例
{
"items": [
{
"id": "0052b495-4cf6-42be-b597-ea83340a86c9",
"slug": "0052b495-4cf6-42be-b597-ea83340a86c9",
"title": "ハンギングポット",
"thumbnailUrl": "https://firebasestorage.googleapis.com/...",
"category": "lighting/pendant",
"modelFormats": [],
"dimensions": null,
"tags": []
}
]
}
API使用方法
基本的な実装(JavaScript/TypeScript)
標準のfetch APIを使用した基本的な実装例です:
const BASE_URL =
import.meta.env.VITE_3DSS_API_BASE_URL ||
"https://us-central1-shapeshare3d.cloudfunctions.net/api";
// モデル一覧取得
async function fetchModels({ limit = 10 } = {}) {
const res = await fetch(`${BASE_URL}/models/v1?limit=${limit}`);
if (!res.ok) {
throw new Error(`Failed: ${res.status} ${res.statusText}`);
}
return await res.json(); // { items: [...] }
}
// 単一モデル取得
async function fetchModelById(id) {
const res = await fetch(`${BASE_URL}/models/v1/${encodeURIComponent(id)}`);
if (!res.ok) {
throw new Error(`Failed: ${res.status} ${res.statusText}`);
}
return await res.json(); // { id, title, ... }
}
React/Viteでの実装例
Reactアプリケーションで使用する共通クライアントモジュールの例:
// src/threeDssApi.js
export const THREE_DSS_API_BASE_URL =
import.meta.env.VITE_3DSS_API_BASE_URL ||
"https://us-central1-shapeshare3d.cloudfunctions.net/api";
export async function fetchModelById(modelId) {
if (!modelId) throw new Error("modelId is required");
const url = `${THREE_DSS_API_BASE_URL}/models/v1/${encodeURIComponent(modelId)}`;
const res = await fetch(url);
if (!res.ok) {
const text = await res.text().catch(() => "");
throw new Error(
`Failed to fetch model ${modelId}: ${res.status} ${res.statusText} ${text}`
);
}
return res.json();
}
export async function fetchModels({ limit = 10 } = {}) {
const url = `${THREE_DSS_API_BASE_URL}/models/v1?limit=${limit}`;
const res = await fetch(url);
if (!res.ok) {
throw new Error(`Failed: ${res.status} ${res.statusText}`);
}
return res.json();
}
Reactコンポーネントでの利用例
import { useState, useEffect } from 'react';
import { fetchModels, fetchModelById } from './threeDssApi';
export default function ModelList() {
const [items, setItems] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchModels({ limit: 20 })
.then(data => setItems(data.items))
.catch(err => console.error(err))
.finally(() => setLoading(false));
}, []);
return (
<div>
{loading ? '読み込み中...' : `${items.length}個のモデルを表示中`}
</div>
);
}
セキュリティとCORS設定
現在のセキュリティアプローチ
3DSS-APIは現在、公開モデルを誰でも読めることを目的として設計されています:
- CORS設定: Express側でCORSを全許可設定(
origin: true) - Firestoreルール: 「publicモデルだけread を許可」のセキュリティルール
- アクセス範囲: 読み取り専用操作のみを提供
Express設定例
const functions = require("firebase-functions/v2/https");
const express = require("express");
const cors = require("cors");
const app = express();
// CORS を全世界許可(学習・デモ用)
app.use(cors({ origin: true }));
app.use(express.json());
// ここに /models/v1 などのルートを定義
// ...
exports.api = functions.onRequest(app);
将来のセキュリティ強化計画
予定されているセキュリティ強化:
- CORS制限: originをホワイトリスト方式に変更
例:["https://3dshapeshare.com", "https://your-other-app.com"] - 認証機能: 読み取り以外の操作にFirebase Authトークンまたは独自APIキーを要求
- 書き込み保護: お気に入り登録、ボード保存、削除などの操作を厳格に保護
新規アプリ開発時のベストプラクティス
3DSS-APIを使用した新規アプリケーション開発では、以下の4ステップを推奨します:
1クライアントモジュールの配置
各アプリにAPI呼び出し用のモジュールを配置します:
threeDssApi.js(JavaScript版)threeDssApi.ts(TypeScript版)
このモジュールがSDKの役割を果たし、全アプリで統一した呼び出し方を実現します。
2環境変数でBASE_URLを設定
フレームワーク別の環境変数設定例:
# Vite / React (.env.local)
VITE_3DSS_API_BASE_URL="https://us-central1-shapeshare3d.cloudfunctions.net/api"
# Next.js (.env.local)
NEXT_PUBLIC_3DSS_API_BASE_URL="https://us-central1-shapeshare3d.cloudfunctions.net/api"
# Node バックエンド (.env)
THREE_DSS_API_BASE_URL=https://us-central1-shapeshare3d.cloudfunctions.net/api
3アプリ固有データとmodelIdの紐付け
アプリのエンティティに3DSSモデルIDを参照フィールドとして持たせます:
{
id: "ne-nekko",
syllable: "ね",
keyword: "根っこのコンセプト",
modelId: "0052b495-4cf6-42be-b597-ea83340a86c9", // ← 3DSSモデルとの紐づけ
// その他アプリ固有のフィールド
}
4必要時にAPI呼び出し
画面で必要なタイミングでAPIを呼び出します:
import { fetchModelById, fetchModels } from "./threeDssApi";
// 一覧表示画面などで
useEffect(() => {
fetchModels({ limit: 20 }).then((data) => setItems(data.items));
}, []);
// 詳細画面では
useEffect(() => {
if (modelId) {
fetchModelById(modelId).then((model) => setModelData(model));
}
}, [modelId]);
これにより、どのアプリからも統一的なインターフェースで3Dモデルデータにアクセスできます。
今後の展望
3DSS-APIは今後、以下の機能拡張が計画されています:
エンドポイント拡張計画
| エンドポイント | 機能 | 説明 |
|---|---|---|
| /models/v1/search | モデル検索 | キーワード、タグ、カテゴリによる検索機能 |
| /models/v1/:id/files | ファイル管理 | GLB、3DM等のダウンロードURLやメタデータ提供 |
| /users/v1/:id | ユーザー情報 | ユーザーの公開プロフィール取得 |
| /boards/v1/:id | ボード管理 | 公開ボードのサマリ情報取得 |
外部ツール連携
将来的には以下のツールからのアクセスも想定されています:
- Unity - ゲーム開発エンジンからのプラグイン経由アクセス
- Unreal Engine - リアルタイム3Dエンジンでの利用
- Rhino - 3DCADソフトウェアでのデザイン連携
運用ポリシー
基本運用ルール:
- 共通データは全て「3DSS-API側」に集約
- 各アプリは「modelId / userId / boardId を持つだけ」でデータの詳細はAPIから動的取得
- データの整合性とスケーラビリティを最優先に設計
まとめ
3DSS-APIは、複数のアプリケーション間での3Dモデルデータ共有を効率化するための強力なプラットフォームAPIです。プラットフォーム層とアプリ層の明確な分離により、データの整合性を保ちながら開発効率を大幅に向上させることができます。
3DSS-APIの主な特徴:
- 統一されたアクセス方法: 単一のBase URLから全ての共通データにアクセス
- 疎結合設計: 各アプリは独立性を保ちながらデータを共有
- スケーラブルな拡張性: 将来的な機能追加を見据えた設計
- 開発者フレンドリー: シンプルなREST APIインターフェース
現在は3Dモデルデータの取得機能のみですが、今後はユーザー管理、ボード管理、検索機能など、より包括的なプラットフォームAPIへと発展していく予定です。
3Dアプリケーション開発に携わる開発者の方は、ぜひ3DSS-APIの活用を検討してみてください。効率的なデータ共有基盤として、開発プロセスの大幅な改善が期待できます。