reveal-3d について
reveal-3dは、ReactとTypeScriptを使うFlowsアプリに公開済みの@cognite/reveal-widgetを組み込むスキルです。CDFの3Dコンテンツを表示するCognite Revealビューアの設定と命令型制御を案内し、モデル閲覧、ハイライト、カメラ操作を扱います。
主な機能
- 01@cognite/reveal-widgetの統合
- 02CAD、点群、360°画像、CDFシーンの表示
- 03モデル閲覧とモデル識別子の直接指定
- 04リソースとカメラの命令型制御
- 05コンテキスト化されたインスタンスの強調表示
- 06Vite、CSP、アプリ設定のガイド
活用シーン
- 01FlowsアプリへのCDF 3Dコンテンツの埋め込み
- 02モデルの閲覧や指定されたモデル参照の読み込み
- 03読み込み済みモデル内のマッピング済みインスタンスの強調表示
- 04アプリイベントからビューアのリソースとカメラを操作
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cognitedata/ builder-skills --skill reveal-3dインストール後、Claude Code で/reveal-3dを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/csp-and-fixes.mdimplementation.mdvite-config.md詳細
Reveal 3D Viewer
公開済みの @cognite/reveal-widget npm パッケージを使って、Flows アプリに Cognite Reveal 3D ビューアーを追加します。CDF の CAD モデル、点群、360°画像コレクション、CDF シーンを表示でき、モデルの参照、またはモデル/リビジョン ID の直接指定に対応しています。
可視化する DM インスタンス:$ARGUMENTS
Use This When
ユーザーが Flows アプリに、CDF 3D コンテンツ用のインタラクティブな Cognite Reveal ビューアーを組み込みたい場合に使用します。
静的な図、グラフの可視化、または無関係なカスタム Three.js シーンには、このスキルを使用しないでください。
非推奨のアプリ内「バンドルをコピーする」方式は使用しないでください。この方式(プロバイダー/フックのソースをコピーした src/features/reveal-3d/ フォルダー)は、@cognite/reveal-widget を直接インストールする方式に置き換えられています。以前の統合でコピーしたバンドルが残っているアプリでは、拡張するのではなく、このパッケージに移行してください。
Prerequisites
- アプリで React + TypeScript を使用し、
@cognite/app-sdkのCogniteSdkProvider(Flows 認証)でラップされている必要があります。これにより、@cognite/app-sdk/reactのuseCogniteSdk()を通じてCogniteClient(sdk)が提供されます。@cognite/cliはアプリのスキャフォールディング/デプロイに使う CLI であり、実行時の認証ライブラリではありません。npx @cognite/cli apps createで作成されたアプリでは、この用途に@cognite/cli自体ではなく@cognite/app-sdkが依存関係として含まれます(useDune()/@cognite/dune/authフックは、レガシーな--classicスキャフォールドにのみ存在します)。 - CDF プロジェクトに 3D モデルがあるか、ユーザーからモデル/リビジョン ID、または CDM のモデル参照(
externalId/space)が提供されている必要があります。 - DM に関連付けられた 3D では、CDM の
externalId/spaceのペア、または従来のmodelId/revisionIdを使って、インスタンス/モデルを特定できる必要があります。モデルを読み込み、インスタンスがモデルにコンテキスト化(マッピング)されると、インスタンスのハイライト表示が機能します。 viewerOptions.useCoreDmを設定する前に、プロジェクトの 3D コンテンツが Core Data Model と従来の 3D API のどちらに存在するかを確認してください。これをデフォルトでtrueにしないでください。これを判定する単一のフラグはありません。csp-and-fixes.md に、直接確認するための正確な SDK 呼び出しが記載されています。
統合ワークフロー
以下の手順を順番に実行してください。新しいパスを独自に作るのではなく、対象アプリの規約に合わせてパスを調整してください。
- 対象アプリを調査します。
package.json、vite.config.ts、src/main.tsx、およびアプリのフォルダー/エイリアスの規約を確認します。 - アプリのパッケージマネージャーを使ってパッケージとピア依存関係をインストールします。Dependenciesを参照してください。既存の固定済み React と SDK のバージョンがピア依存関係の範囲を満たす場合は、それらを再利用します。
- Vite を設定します。 vite-config.mdを確認し、
three/@cognite/revealの重複排除エントリーを追加します。プロセス/ユーティリティ/アサートのポリフィルは不要です。パッケージはブラウザー対応済みです。 manifest.jsonの CSP 許可設定を、シーン/モデルに実際に含まれるもの(シーンの地面/スカイボックスのテクスチャ、360°画像コレクション)に合わせて設定します。 csp-and-fixes.mdを確認してください。点群に必要なアプリ側の修正箇所(manifest.jsonでは直接許可できません)と StrictMode の注意点も説明されているため、アプリにシーンや360°コンテンツがまだなくても必ず確認してください。- コントローラークラスを追加します。
RevealWidgetControllerをラップし、useEffectでプロパティの変更に反応させるのではなく、独自のイベントハンドラーから命令的に操作(リソースの読み込み、インスタンスのスタイル設定/ハイライト表示、カメラの制御)します。implementation.mdを参照してください。 RevealWidgetをマウントします。viewerOptions={{ sdk, useCoreDm }}(useCoreDmはハードコードせず、プロジェクトに合わせて設定します。csp-and-fixes.mdを参照してください)、setControllerRef、ホストアプリを識別する文字列である必須のappIdentifierを指定し、高さを明示的に設定したコンテナー内に配置します。RevealWidgetは内部の Reveal コンテキストを独自に管理するため、このパッケージの別のプロバイダーでラップしないでください。- リソースのパターンを選択します。 ユーザーから CDM の
externalId/spaceモデル参照がすでに提供されている場合を除き、モデルブラウザーパターン(sdk.models3D.list()と従来のmodelId/revisionId)をデフォルトとして使用します。詳しい例はimplementation.mdを参照してください。 - クリーンアップします。 不要になった
addResourceの戻り値であるReveal3DResourceHandleに対して.remove()を呼び出します(選択の変更時、アンマウント時)。 - 型チェックとビルドを実行し(
tsc --noEmit、pnpm buildなど)、依存関係やピア依存関係のバージョンに関する問題を修正します。
最小限の例
import { useRef } from 'react';
import type { CogniteClient } from '@cognite/sdk';
import {
RevealWidget,
type Reveal3DResourceHandle,
type RevealWidgetController,
type ThreeDResourceIdentifier,
} from '@cognite/reveal-widget';
class ThreeDViewerController {
private model: Reveal3DResourceHandle | undefined;
constructor(private readonly widgetController: RevealWidgetController) {}
async loadModel(resource: ThreeDResourceIdentifier): Promise<void> {
this.model = await this.widgetController.addResource(resource);
this.widgetController.cameraController.focusModel(this.model);
}
dispose(): void {
this.model?.remove();
}
}
export function ViewerPage({
sdk,
resource,
}: {
sdk: CogniteClient;
resource: ThreeDResourceIdentifier;
}) {
const viewerRef = useRef<ThreeDViewerController>();
function handleWidgetController(widgetController: RevealWidgetController | undefined) {
viewerRef.current?.dispose();
if (widgetController === undefined) {
viewerRef.current = undefined;
return;
}
const viewer = new ThreeDViewerController(widgetController);
void viewer.loadModel(resource);
viewerRef.current = viewer;
}
return (
<div style={{ width: '100%', height: '70vh', position: 'relative' }}>
<RevealWidget
viewerOptions={{ sdk, useCoreDm }} // set per the project — see csp-and-fixes.md
setControllerRef={handleWidgetController}
appIdentifier="my-flows-app"
/>
</div>
);
}
依存関係
推奨バージョンは開始時の目安です。対象アプリですでに互換性のあるバージョンが固定されている場合は、アプリの設定を優先してください。
| パッケージ | 推奨バージョン | 用途 |
|---|---|---|
@cognite/reveal-widget | ^0.3.0 | RevealWidget コンポーネントとその型 |
react / react-dom | ^18.3.1(peer) | UI フレームワーク — ピア依存関係であり、アプリと一致させる必要があります |
@cognite/reveal | 4.36.0 | Reveal ビューアーのランタイム — 完全一致が必要です。@cognite/reveal-widget 自身が宣言しているピア依存関係の範囲にある 4.35.3 ではなく、4.36.0 に固定してください。下記の注を参照してください。 |
@cognite/sdk | ^10.14.0(peer) | CDF API クライアント — ピア依存関係です |
その他すべて(three、@tanstack/react-query、@base-ui/react、@floating-ui/react、@tabler/icons-react、dayjs、lodash-es、ml-matrix、random-seed、@cognite/aura、@cognite/reveal-components)はこのパッケージの推移的依存関係であり、自動的にインストールされます。アプリでバージョンを固定する必要がある場合、またはアプリのコードから直接インポートする場合を除き、手動で追加しないでください。implementation.md のモデルブラウザーのパターンでは、@tanstack/react-query(useInfiniteQuery/useQuery)を実際に直接インポートしています。この場合は直接依存関係として追加してください。宣言されていない推移的依存関係からのインポートは、pnpm のような厳格なパッケージマネージャーでは問題が発生するためです。
インストール例(pnpm の場合。アプリのパッケージマネージャーに合わせてください):
pnpm add @cognite/reveal-widget @cognite/[email protected] @cognite/sdk react react-dom
@cognite/[email protected] 自身が指定するピア依存関係の範囲は、引き続き @cognite/[email protected] となっています。しかし、依存関係にある @cognite/reveal-components は、内部で @cognite/[email protected] をハードコードしています。アプリでは 4.36.0 に固定し、ロックファイルで @cognite/reveal のバージョンが1つだけ解決されていることを確認してください。ピア依存関係の範囲は古くなっています。また、ここで実際にバージョンが分かれると(resolve.dedupe の不足とは異なり)、Reveal の共有ビューアー状態が気付かないうちに壊れます。
このパッケージでは、ソースバンドルをアプリにコピーしないでください。また、process、util、assert、ajv、vite-plugin-node-polyfills もインストールしないでください。いずれも必要ありません。
重要なルール
setControllerRefで取得したRevealWidgetControllerを使って、ウィジェットを命令的に操作してください。Reveal の以前の宣言的なプロバイダーツリー(CacheProvider/RevealProvider/RevealCanvas/Reveal3DResources)を再構築しようとしないでください。この API は古いバンドルをコピーする方式向けであり、このパッケージが公開しているものではありません。RevealWidgetは内部で独自の Reveal コンテキストをラップします。このパッケージの別のプロバイダーの内側にネストしないでください。setControllerRef内で新しいコントローラークラスのインスタンスを作成する前に、以前のインスタンスを破棄(追跡中のハンドルに対して.remove()を呼び出す.dispose())してください。また、widgetControllerがundefinedになったとき(アンマウント時)にも破棄してください。addResourceに渡すリソースは、type/sourceTypeの組み合わせに対応する識別子の正確な形式である必要があります(implementation.md を参照)。classic と CDM のフィールドを混在させると、型エラーになります。- インスタンスのハイライトは、読み込み済みモデルにコンテキスト化(マッピング)されているインスタンスにのみ適用されます。先にモデルを読み込み、その後で
styleByInstance/focusInstancesを呼び出してください。 RevealWidgetのコンテナーには明示的な高さが必要です。ウィジェットは親要素いっぱいに広がります。- ルート/ページを追加する際は、キャンバスを多用するビューアーコンテンツを
React.lazyとSuspenseで遅延読み込みしてください。 useCoreDmはtrueをデフォルトとして使わず、プロジェクトに合わせる必要があります。そうしないと、誤った 401 エラーや、360 コレクションの処理がエラーを表示せず失敗する問題が発生します。アプリをReact.StrictModeでラップしないでください。開発環境で読み込み中にRevealWidgetのビューアーを破棄してしまい、本番環境では発生しないエラーが出るためです。ポイントクラウドには、アプリ側で同一オリジンの修正が必要です。manifest.jsonでは、本来必要となるdata:の CSP 許可を設定できないためです。これら3点については、csp-and-fixes.md を参照してください。appIdentifier(ホストアプリの名前を指定する文字列)は、@cognite/[email protected]以降、必須のプロパティです。これを指定せずにRevealWidgetをマウントすると、型エラーになります。デフォルトでは、ウィジェットは匿名の利用状況メトリクス(リソースの追加やカメラの移動など、どの機能が使われたか)を専用のmixpanel-browserインスタンスに送信します。これを変更するには、任意のtrackingプロパティを渡してください。送信を完全に停止するにはtracking={{ disabled: true }}を、別の Mixpanel プロジェクトに送信するにはtracking={{ mixpanelToken }}を指定します。
詳細リファレンス
リソース識別子の全カタログ(CAD、ポイントクラウド、360画像、シーン)、インスタンスのハイライト、カメラ制御については、implementation.md を参照してください。
Vite/重複排除の設定については、vite-config.md を参照してください。
CSP/manifest.json の許可設定、useCoreDm/StrictMode に関する注意点、ポイントクラウドのアプリ側修正、360 コレクションのトラブルシューティングについては、csp-and-fixes.md を参照してください。
検証チェックリスト
-
@cognite/reveal-widgetが、互換性のあるバージョンの依存パッケージ(react、react-dom、@cognite/reveal、@cognite/sdk)とともにインストールされています。 - アプリの
@cognite/revealは4.36.0に固定されています(@cognite/reveal-widgetのピア依存関係の範囲にある古い4.35.3ではありません)。また、ロックファイルで解決される@cognite/revealのバージョンは 1 つだけです。 - ソースバンドルはアプリにコピーされていません。すべてのインポート元は
@cognite/reveal-widgetであり、アプリのコードから@cognite/reveal-componentsを直接インポートしていません。 -
vite.config.tsにresolve.dedupe: ['three', '@cognite/reveal']が含まれています(アプリに既存の dedupe エントリーがある場合は、それらも含めます)。 - このパッケージのために
process/util/assertのポリフィルやvite-plugin-node-polyfillsを追加していません。 -
RevealWidgetは 1 回だけマウントされ、別の Reveal プロバイダーの内側にネストされていません。コンテナには明示的な高さが設定され、必須のappIdentifier文字列プロパティが渡されています。 -
viewerOptions.useCoreDmは、対象プロジェクトが実際に Core-Data-Model ベースかどうかと一致しています。 - アプリを
React.StrictModeでラップしていません。 - アプリが地面や空の背景を含むシーンを読み込む場合、
manifest.jsonでhttps://*.cognitedata.comに対するimg-srcが許可されています。また、360° 画像コレクションを読み込む場合は、CSP 違反から確認した実際の署名付き URL のホストに対するconnect-srcが許可されています。アプリでポイントクラウドのサポートが必要な場合は、同一オリジンのBlobパッチによる修正を適用し、検証済みです。 - コントローラークラスが
RevealWidgetControllerをラップし、setControllerRef経由で取得して、addResource/styleByInstance/focusInstances/cameraControllerを命令的に操作しています。 - 新しいコントローラーが設定されたときとアンマウント時(
widgetController === undefined)の両方で、コントローラークラスを破棄し、追跡中のリソースハンドルに対して.remove()を呼び出しています。 - リソース識別子では、読み込むモデルに適した
type/sourceTypeの形式を使用しています。 - 型チェックとビルドが成功します。