
-
空間Webの新機能
visionOS 26のWeb向けの最新の空間機能を紹介します。刷新されたHTMLモデル要素を使用して3Dモデルをインラインで表示する方法や、モデルの照明、インタラクション、アニメーションなどの強力な機能について解説します。360度ビデオやApple Immersive Videoなどの新しくサポートされるイマーシブメディアをWebサイトに埋め込む方法を説明するほか、Webページにカスタム環境を追加する方法のプレビューもお見せします。
関連する章
- 0:00 - イントロダクション
- 0:55 - 3Dモデルの埋め込み
- 21:24 - イマーシブメディアの表示
- 26:14 - カスタム環境の提供
リソース
- GitHub:
element that displays 3D explainer - GitHub: model element samples
- GitHub: Spatial Backdrop explainer
- Learn more about Reality Composer
- MDN: Properly configuring server MIME types
- QuickLook example files
- The HTML model element in Apple Vision Pro
関連ビデオ
WWDC25
WWDC24
WWDC23
-
このビデオを検索
こんにちは visionOS SafariチームのEddyです 今年は空間Webにとって 重要な年となっています Web体験を新たな次元に引き上げる 新機能が追加されています
他のWebコンテンツに合わせて 3Dモデルを立体的に レンダリングできるようになりました その状態で モデルを操作することもできます また平面のスクリーンを超えて拡張された まったく新しいメディアである イマーシブメディアを 再生できるようになりました
Webサイト環境など いくつかの新しい デベロッパプレビュー機能も 追加されています これらの新しい機能を どのように導入できるか紹介します どのように3Dモデルを Webページに埋め込み イマーシブメディアと カスタムWebページ環境を提供できるか 早速見ていきましょう これまで数十年間 Webデベロッパは HTML Image要素を使用して 画像をWebに埋め込んできました 空間コンピューティングの時代を 迎えるにあたり AppleではWebコンテンツを 新たな次元に引き上げる 新しい方法を導入し Webページへの3Dモデルの 埋め込みや表示を 可能にしました それが新しいHTML Model要素です この要素は数年前に Web標準化機関に提案されたもので 今年からvisionOSのSafariで デフォルトで 利用できるようになっています 簡単なマークアップで3Dモデルを埋め込み 他のWebコンテンツと一緒に ユーザーに表示できます 既存のモデルレンダリング ライブラリとは異なり Model要素は 立体的にレンダリングされるため オブジェクトの奥行きを 把握することができ モデルを動かして 様々な角度から表示できます 3Dモデルの埋め込みについて アセットの準備から インタラクションやアニメーションを使って 上手にレンダリングする方法まで 様々な側面を掘り下げます 3Dモデルを埋め込むには まずモデルを作成する必要があります visionOSのSafariではModel要素に USDZファイルフォーマットを使用できます これは3Dコンテンツ業界で 広く使用されているフォーマットです 既存のツールを使ってUSDZファイルを キャプチャ 変換 作成できます iPhoneを使って実世界のオブジェクトを 3Dモデルファイルにすることもできます Reality Composerアプリを App Storeからダウンロードするだけです iOSのObject Capture APIを使えば 同じようにモデルファイルをキャプチャして 作成するアプリを開発できます 使用したい3Dモデルの中に 異なる形式のモデルが 含まれていることがあります macOSには 様々な3Dモデル形式を プレビューやコマンドラインツールにより USDZに変換する機能が 標準装備されています 上級ユーザーが美しい3Dモデルを 作成するために使用してきた 3Dモデリングソフトウェアである Blender Houdini Maya Reality Composer Proなどでは USDZ形式でエクスポートできます USDエコシステムには 皆さんのワークフローに使用できる 幅広いツールがあります 詳しくは「Explore the USD ecosystem」 WWDC23セッションをご覧ください 3Dモデルを 作成したことがない場合は WWDC23の 「Meet Reality Composer Pro」も ぜひご覧ください Model要素を使用して 色々試してみたいときに テスト用のUSDZファイルがあれば 便利です 最も簡単で確実な入手方法は developer.apple.com/jpから USDZファイルを ダウンロードすることです それらの中には Object Captureで作られたものもあれば 3Dモデリングソフトウェアを使用して 手間暇かけて作られたものもあります 他のすべてのWebアセットと同様に 速く読み込めるように ファイルサイズを小さくする必要があります おすすめなのは Macのプレビューを使って 圧縮テクスチャでコピーを エクスポートする方法です ファイルを最適化する方法は 他にもたくさんあります 詳細については WWDC24セッションの 「Optimize your 3D assets for spatial computing」をご覧ください アセットファイルの準備ができたら Webページに埋め込みましょう モデルを埋め込むための構文は簡単です Model要素のsource属性に USDZファイルを適用するだけです 終了タグを忘れないでください または picture要素に配置するときのように source要素を 空のModel要素に配置します
Model要素は他のビジュアルDOM要素と 同様に動作するため モデルを表示したい場所に Model要素を配置することができます モデルは常にページ平面の背後に レンダリングされることに注意してください Model要素によって ページの背後に仮想空間が開くと 考えることができます モデルはその空間に存在します これにより Model要素が ビューにスクロールされたときに コンテンツが予期せずページから はみ出すのを防げます デフォルトで ブラウザによりモデルの大きさが 要素の境界に収まるように調整されます モデルのバウンディングボックスの xy平面をセンタリングして 要素内に収まるよう調整しています
古いWebサーバまたはCDNでは USDZファイルが認識されないことがあり HTTP応答ヘッダに誤った コンテンツタイプが返されることがあります 正しいコンテンツタイプを返すには Webサーバに設定を 追加する必要があります 各Webサーバにおける USDZ MIMEタイプを指定する方法は ご覧の通りです 詳細については Webサーバソフトウェアの ドキュメントをご参照ください 優れたWebサイトの重要な条件の1つは 様々なデバイスを使用する あらゆるユーザーが閲覧できることです このため下位互換性のある フォールバックを提供することが重要です フォールバック画像を提供するには それをModel要素内に配置します
2Dでレンダリングされた モデルを提供し オブジェクトがどのようなものか 他のブラウザを使用しているユーザーも 理解できるようにします 静止画像の代わりに 既存のサードパーティ製ライブラリで 2Dビュー体験を提供できます それらのライブラリには three.jsやbabylon.js model-viewerなどがあります
これは model-viewerライブラリを 使用した例です このライブラリは JavaScriptを使用して モデルを2Dキャンバスに描画します 2Dビューアコードを Model要素で囲むことで フォールバック体験として 使用することができます この設定では visionOSのSafariを 使用しているユーザーには 奥行きのある立体的に レンダリングされたモデルが表示され 他のブラウザを使用しているユーザーは 2Dでモデルがレンダリングされます フォールバック動作のカスタマイズを 真剣に検討している場合 JavaScriptを使用して Model要素が サポートされているかどうかを検出します
window.HTMLModelElementオブジェクトが 存在するかどうかも確認します 良策と言えないのは ユーザーエージェントがvisionOS Safari であるかどうか検出することです この方法は非常に脆弱で 将来 他のブラウザで Model要素がサポートされたときに 誤作動する可能性があります エージェントではなく 機能を検出するようにしてください USDZファイルは10MBを軽く超えるため ネットワークが遅いと 読み込みに数秒かかることがあります UIをいつ更新すればよいかわかるように モデルが完全に読み込まれたタイミングを 知りたいかもしれません これを行う一般的な方法は ローディングインジケータです
Model要素にはpromiseオブジェクトを返す readyプロパティがあります モデルが完全に読み込まれ promiseが解決されたら ローディングインジケータを非表示にして Model要素を表示します 読み込みエラーでready promiseが 失敗することがあるため 再試行ボタンを表示するなど エラーを適切に処理することを 忘れないでください 自分の経験から言えば データを読み込んでいることを示す 視覚的な要素を表示することで ユーザーがページから離れず とどまりやすくなります
これでモデルを埋め込むことができました 次にWebサイトでの モデルの見栄えを改善しましょう Model要素では モデルをレンダリングする 仮想空間を定義できます Model要素がページに うまく溶け込むように 空間の色を 周りのWebコンテンツの色と 同じにすることを おすすめします
Model要素をページに追加すると 要素全体が 仮想空間に置き換えられるため その部分の元の背景色は 表示されなくなります これを修正するには CSSのbackground-color属性を使用して 仮想空間の色を設定する必要があります この設定は祖先ではなく Model要素自体に行う必要があることを 忘れないでください アルファを付けて 背景色を指定すると 不透明に変換されます 色の定義を 毎回繰り返したくない場合は CSSカスタムプロパティを使用して コードをDRY化できます Model要素を ページに溶け込ませることで クリエイティブなことがしやすくなります
先ほどの例で 右側のパネルの裏側まで Model要素を拡張しました すりガラスエフェクトを パネルに適用することで 特定の角度では カメラが裏側にあることがわかるようになり レイヤ感を強めることができました
このエフェクトを追加する方法は たくさんありますが 自分の方法を紹介したいと思います まずposition: absoluteを使って Model要素を パネルの裏側まで拡張します 次にbackdrop-filterで Model要素のピクセルをぼかし すりガラスのエフェクトを 表現します linear-gradientを使用して エッジに反射ハイライトを追加し 厚みを表現します パネルの色は テキストが読みやすいように明るくします これらすべては昔からある 優れたCSSの手法ですが Model要素の奥行きと組み合わせると 非常に効果的です このままでも見栄えはいいのですが 照明エフェクトを調整すると さらに改良できます これは同じモデルファイルに 異なる照明を適用したものです 選択した照明によって 見え方が変わることに気づきます 照明エフェクトを制御するには 特殊な画像を使用して モデルの環境が どのように見えるかを定義します その環境がもたらす光を モデルに反射させます この手法を画像ベースの照明 略してIBLと呼び その画像をIBLファイルと呼びます IBLファイルは歪んで見えますが これは360度すべての環境を 平面の画像に 投影しているためです この平面にした球面投影は 正距円筒図法とも呼ばれ IBLファイルでは非常に一般的です IBLファイルは USDZファイルに含まれていないため レンダリング時に 指定する必要があります
Model要素にIBLを指定するには environmentmap属性を 使用する必要があります 何も指定しないと デフォルトの照明がモデルに適用されます IBLはUSDZファイルに 含まれていないため モデルファイルを Webページの外部で使用すると 同じ照明エフェクトは適用されなくなります このため プレゼンテーション用アプリ側で 視聴体験に最も適した照明を 適用することができます コツの1つは IBLファイルにOpenEXR形式や Radiance HDR形式を使用するのを 検討することです これら2つの形式は 表現できる輝度が桁違いであるため 反射を格段に リアルに表現できます 一方 JPEG IBLは 非常にくすんで平坦に見えます モデルの見栄えがよくなったら 次はユーザーの操作を作成しましょう Model要素にはすぐに使用できる様々な ユーザーインタラクションがあります デフォルトではモデル要素を ピンチしたままにすると ドラッグ&ドロップ インタラクションが開始し モデルを別のアプリや 空の場所にドロップできるようになり クイックルックを介して 自分たちの空間にモデルを表示できます これはモデルを実物大で見ることができる 素晴らしい方法で リアルな照明エフェクトのおかげで 本物のように見えます モデルは表面に貼り付けたり 回転や拡大縮小したりできます ドラッグ&ドロップに加えて Model要素をピンチ&ドラッグすることで モデルをインラインに表示したまま 回転できます モデルを上下に傾けることもできます 指を離すと モデルの傾きがリセットされます
このインライン回転動作を有効にするには model要素で stagemode=orbitと指定します 回転はy軸に沿って行われ ジェスチャ中は 垂直方向に少し傾けることができます 回転時にモデルが ページ平面から飛び出ないように ブラウザによってモデルのスケールや オフセットが調整されます このstagemodeの回転動作が ユースケースに十分でない場合は カスタムインタラクションを 手動で実装できます モデルを特定の方法で手動で 動かしたり向きを変えたりしたい場合は JavaScriptを使って行うことができます 仮想空間内の モデルの位置と向きを 正確に 制御することもできます これを行うには Model要素により公開される 変換行列を変更します
変換行列は entityTransformプロパティを 通して公開されています モデルを読み込むときに ブラウザによりデフォルトの配置に必要な 変換が計算され entityTransformプロパティに保存されます ready promiseが解決されると このプロパティにデータが入力されます
モデルの配置を カスタマイズする方法の一例を紹介します ここではモデルを右向きに回転させる リンクを提供してみます turnRight関数で ブラウザの計算された変換行列を entityTransformプロパティから 読み取ります 次に DOMMatrixクラスの 既存のAPIである rotateAxisAngleメソッドを使用して y軸に沿って モデルを90度回転させます 0, 1, 0はy軸を意味し 90は90度回転することを意味します 新しい行列を準備できたら その行列を 元のentityTransformプロパティに設定して 行列を有効にします entityTransform行列で サポートされている操作には 均一スケーリングや 回転 また平行移動などがあります サポートされていない操作が 含まれる行列を entityTransformプロパティに 割り当てようとするとエラーになります ほとんどのユースケースでは デフォルトのentityTransformで十分です デフォルトの計算の 仕組みを知りたいと 思われるかもしれません これを理解するために 基本に戻って 恒等行列に対する entityTransformの動作について説明します
entityTransformを 単位行列に設定すると USDZファイルの 原点が Model要素の中心点に 合わせられます モデルはページ平面の背後の空間にのみ レンダリングされるため 前方に飛び出した部分は すべてクリッピングされます またUSDZファイルの1cmが CSSの1cmになるように 正確にレンダリングされます これはCSSでは約38pxに相当します visionOSでは ユーザーから離れると Safariウインドウは大きくなります そのため モデルが Webページに表示されるときには USDZファイルで使用される単位と 現実世界の実際の単位との間に 関係性はありません オブジェクトを実際のサイズで 表示する必要がある場合 最善なのは 先ほど紹介したように ユーザーがオブジェクトを ページからドラッグして クイックルックで表示することです entityTransformプロパティを 非常に独創的な方法で使うこともできます 前の例では カメラの様々な機能を紹介するときに それに合わせて モデルの各部をズームアップしました ただ回転させるだけでなく モデルアニメーションを使用して カメラのスクリーンを開閉できます その方法をご紹介します USDZファイルフォーマットでは ファイル内でアニメーションを定義できます この機能は主要なすべての オーサリングツールでサポートされています 一部のUSDZファイルには 複数のアニメーショントラックが含まれています Model要素では USDZファイルで定義された最初の アニメーショントラックを再生できます 単純なループアニメーションには loop autoplay属性を 使用することができます アニメーションを 手動で制御したい場合は Model要素で playおよびpauseメソッドを使用できます アニメーションが再生されているかどうかは pausedプロパティを使用して判断できます これらのいくつかのAPIは video要素のものと同じであるため 馴染みがあるかもしれません
もっと複雑なユースケースでは 3Dモデリングソフトウェアを使用して モデルのタイムラインを作成し 各状態の間をアニメーション化します このカメラモデルファイルでは まずカメラのフラッシュライトの開閉を アニメーション化し 続いてカメラのスクリーンの開閉を アニメーション化しました アニメーション情報は USDZファイル内に保存されます Model要素に アニメーションモデルを配置したら currentTimeプロパティを使用して タイムラインの任意の時点に移動できます 例えば カメラのフラッシュを開きたい場合は currentTimeプロパティを 1に設定するだけです currentTimeプロパティの単位は 秒であることに注意してください 同様にスクリーンを開きたい場合は 3に設定するだけです モデルが中間のアニメーションなしで 瞬時に更新されることに注目してください これにより 不連続なタイムスタンプにジャンプし 必要な特定のエフェクトを作成できます currentTimeプロパティと インタラクションを組み合わせることで 面白い体験を生み出すことができます
ここに タイムラインの スクリーンが開くアニメーション の部分に対応する 値の範囲が2~3のスライダがあります イベントリスナーを追加し スライダの値の変化を監視します 値が変化したら currentTimeを スライダの値に設定します こうすることで スライダを使用して スクリーンの位置を制御できます この方法はページのスクロールや カスタムドラッグイベントなど 他のインタラクションにも 拡張できます また currentTimeとentityTransformを 独創的な方法で組み合わせることもできます 前のカメラページの例では タイマーで アニメーションが動いていました 各部はcurrentTimeプロパティを使用して アニメーション化されており カメラ全体の動きは entityTransformプロパティを使用して アニメーション化されていました このページは本当によくできていますが 製品に名前を刻印できるようにするなど 個性を加えられるようにすることで もっとよくできるかもしれません しかし USDZモデルに入れるテキストを 事前に知ることはできません そこで 動的に生成されるモデルの出番となります 実行時の ユーザー入力に応じて モデルを表示する必要がある場合 JavaScriptを使用して プログラムによってUSDZファイルを ブラウザに生成し Model要素内に表示することができます three.jsは強力なJavaScriptライブラリで プログラムによって 3Dモデルを作成することができます three.jsはそれ自体が 奥深いテーマであるため 今日はそれについて 詳しく説明することはしませんが 大まかに説明すると ここに THREE.Sceneオブジェクトがあります これには手順に従って作成された モデルが含まれています すでによく作り込まれた シーンオブジェクトがあるとします three.jsにはインポートできる USDZエクスポーターモジュールがあり これをインポートしたら parseAsyncメソッドを使用して モデルシーンの完全なUSDZファイルの データBLOBを生成します URL.createObjectURLメソッドで 生成したデータBLOBを指す オブジェクトURLを作成します オブジェクトURLを用意できたので これをModel要素の ソース属性に設定すると レンダリングが開始されます このテクニックを使うことで オフラインで準備した 静的な既知のUSDZファイルを 使用しなくて済みます
製品に名前を追加したり テキストの色を変えたりなど ユーザーからのデータ入力に基づいて モデルをカスタマイズできます
これの素晴らしいところは カスタマイズしたモデルをドラッグして ユーザーの空間に表示できることです
Model要素でサポートされているAPIは 他にもたくさんあります 今日はその一部しか 取り上げていません その他のAPIもWebページに モデルを導入する際に役立つかもしれません
Model要素の詳細については MDNのドキュメントページや W3C Webサイトの モデル要素に関する提案をご覧ください このセッションの関連リンクに URLを貼っています 別のカテゴリのコンテンツである イマーシブメディアについて 説明させてください 昨年 Webサイトから パノラマや空間写真を表示する 新しい方法が導入されましたが その方法が空間ビデオ 180度 360度 広視野角ビデオ さらにはApple Immersive Videoにまで 拡張されました パノラマや空間写真の表示についても いくつかのアップデートがありました iPhone 15 Pro以降では カメラアプリで 空間ビデオを撮影し Apple Vision Proの写真アプリで 空間ビデオとして表示することもできます visionOSで新たにサポートされる 3つのイマーシブメディアタイプは 180度ビデオ 360度ビデオ 広視野角ビデオです これらのメディアタイプでは 画面が平面にとどまらず ユーザーを包み込むような イマーシブ体験を提供します またApple Immersive Videoも 表示できるようになりました これは撮影したカメラの 各レンズについて 完璧にキャリブレーションされた 高解像度ステレオビデオです これらのメディアタイプについては 今年のWWDCセッション 「Explore video experiences for visionOS」を ご覧ください
360度ビデオなどの イマーシブメディアファイルを ページに埋め込むと 2Dビデオとしてレンダリングされます イマーシブに見えるように フルスクリーンでビデオを表示し 正しく投影されたビデオで ユーザーを取り囲みます このフルスクリーンプレーヤーは しばしば180度ビデオ形式や Apple Immersive Video形式に見られる ステレオスコピックコンテンツも対応します 以前に撮影したイマーシブメディアを お持ちかもしれません 今こそWebサイトに 掲載する絶好の機会です 既存のvideo要素を使用して それらすべてのメディアタイプを Webサイトに埋め込むことができます 新しい要素や属性を 使用する必要はありません これまで通り HTTP Live Streamingを 大きなビデオアセットとすることができます 180度 360度 および広視野角メディアは メディアの投影に関する 追加のメタデータが含まれた Apple Projected Media Profileに 準拠している必要があります 既存のメディアを APMPに変換する方法については 今年のWWDCセッションの 「Learn about the Apple Projected Media Profile」をご覧ください Apple Immersive Videoの詳細については 「Learn about Apple Immersive Video technologies」をご覧ください これは 広視野角APMPの一例です メタデータは録画中に使用された カメラのパラメータをキャプチャします visionOSは各ピクセルが 目的の位置に並ぶような形状にして メディアを表示することで 再生時に 正しく投影されるようにします フルスクリーン表示にしたときに エッジ部分でも 直線がまっすぐに表示されています これがAPNPの威力です video要素のデフォルトのコントロールで フルスクリーンにできます JavaScriptの requestfFullScreen APIにより プログラムでも フルスクリーンにできます 実際 これはWebページから パノラマや空間写真を 表示するときに使用するAPIと まったく同じです パノラマについては 同じpicture要素に 異なるソースを指定できるようになりました これにより フルスクリーン表示になる前に 適切なサムネールを表示できます フルスクリーン表示になったら 最も幅が広いバリエーションが使用されます
空間写真については requestFullscreen APIが 同じように機能するようになりました インラインで表示するときには 空間写真は平坦な2D画像として レンダリングされますが フルスクリーンで表示するときには 空間写真としてレンダリングされます 自分の経験から言えば 写真が実は空間写真であること また写真をタップして 本当の美しさを見るべきであることを 常にユーザーに 伝える必要があります 将来的には visionOS 2.4以降 デベロッパプレビュー機能として追加された 新しいcontrols属性を使うことで これをもっと簡単に行えるようになります controls属性は その画像が空間写真であることを示す 空間写真バッジを 追加します フルスクリーンボタンを組み合わせることで JavaScriptを1行も記述せずに ユーザーが空間バージョンの画像を 簡単に表示できるように することができます 他のすべての デベロッパプレビュー機能と同様に この機能を試すには 機能を明示的に有効にする必要があります これを行うには 「設定」>「アプリ」> 「Safari」>「詳細」>「機能フラグ」で 「Spatial Image Controls API」を 有効にします この画面を開いているうちに 次に説明する もう1つの「Website environments」も 有効にしておきましょう Webサイト環境は 今年から導入された 新しいデベロッパプレビュー機能で Webサイト上でユーザーに 仮想環境を提供することができます その仕組みはこうです このサンプルページでは USDZファイルが環境として指定され ユーザーはページメニューから 環境を表示するかどうか選択できます その際 SafariとWebサイトは 表示されたままになります Digital Crownを使用すると 気を散らされず 環境に完全に没入できます これはWebサイトを ブラウザのウインドウを超えて拡張させる 素晴らしい方法です
環境を提供するにはrel=spatial-backdropを 指定したlink要素を使用します 次に href属性を使用して 環境USDZファイルを指定します 3Dモデルと同じように environmentmap属性で USDZファイルに カスタムIBLを指定します よく作り込まれた環境により ユーザーはレストランや潜水艦 地下室など 別の場所にテレポートしたように 感じることでしょう これはデベロッパプレビューであるため この機能を試す前に 「設定」で有効にする必要があります Web標準化プロセスにあるため マークアップは将来変更される 可能性があります Appleは この機能の開発を 積極的に主導しており 皆さんからのご意見を 今後の開発の参考としています カスタム環境の作成方法の詳細については WWDC24の 「Create custom environments for immersive apps in visionOS」 をご覧ください 今日は 新しい空間Web機能について たくさん取り上げました 新しいHTML Model要素について サポートされているインタラクション カスタム照明 また手動配置について 説明しました 既存のvideo要素を使用して 様々な新しいイマーシブメディアを Webサイトから直接表示できます 将来のWebサイト環境を 垣間見ることができました
取り掛かりやすいように Model要素の使用例を webkit.orgにいくつか追加しました これを体験する最も優れた方法は 実際にApple Vision Proを使って 見てみることです 覚悟ができたら 一歩踏み出して 必要に応じて 3DモデルをWebページに追加し 驚くような新しい体験を ユーザーに提供しましょう Webサイトでビデオを提供する場合 今こそWebサイトにイマーシブメディアを 組み込む絶好の機会です 試しに カスタム環境を追加してみて ご意見をお寄せください 空間Webの他にも 多くのWeb向けの 新しい機能が追加されています 詳細については 今年の「What’s new for Safari and WebKit」 セッションをご覧ください
Webテクノロジーに関するバグレポートや 機能のリクエストは WebKit向けの問題追跡システムである bugs.webkit.orgから送信できます Safariのインターフェイスや visionOSに関する問題 Appleプラットフォームの問題は feedbackassistant.apple.comから 送信してください 新しい技術を活用した 皆さんの素晴らしい作品を 見られることを心待ちにしています ありがとうございました
-
-
1:00 - Embed 3D models - Basic syntax
<model src="teapot.usdz"></model>
-
4:15 - Embed 3D models with source element
<model> <source src="teapot.usdz" type="model/vnd.usdz+zip"> </model>
-
5:30 - Example server configurations to add USDZ MIME type support
# Apache ``` AddType model/vnd.usdz+zip .usdz ``` # NGINX mime.types ``` types { ... model/vnd.usdz+zip usdz; } ``` # Python HTTP server ``` import http.server Handler = http.server.SimpleHTTPRequestHandle Handler.extensions_map = { ".usdz": "model/vnd.usdz+zip" } httpd = http.server.HTTPServer(("", 8000), Handler) httpd.serve_forever() ```
-
5:51 - Specify a fall back image for
element <model src="camera.usdz"> <img src="camera.png"> </model>
-
6:17 - Example 2D rendering fallback experience
<!-- <model-viewer> library from https://modelviewer.dev/ --> <script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/4.0.0/model-viewer.min.js"> </script> <model src="camera.usdz"> <!-- Fallback experience for backward compatibility --> <model-viewer src="camera.glb"></model-viewer> </model>
-
6:52 - Detect if the model element is supported
if (window.HTMLModelElement) { // Supported by this browser } else { // Not supported by this browser }
-
7:32 - Implementing a loading indicator using .ready promise
<model src="camera.usdz" id="mymodel"></model> <script> const mymodel = document.getElementById("mymodel"); if (window.HTMLModelElement) { mymodel.ready.then(result => { // Hide the loading indicator // Show the model }).catch(error => { // Loading error occurred, show a retry button }); } </script>
-
8:23 - CSS example for setting the color of the virtual space
<body> <!-- page content here --> <model src="camera.usdz" class="my_model"></model> </body> <style> :root { --main-bg-color: rgb(240, 240, 240); } body { background-color: var(--main-bg-color); } .my_model { /* set the virtual space color */ background-color: var(--main-bg-color); } </style>
-
9:21 - CSS example for frosted glass panel on top of a
<div class="container"> <model src="camera.usdz"></model> <div class="panel"> ... </div> </div> <style> .container { position: relative; } .panel { position: absolute; left: 60%; backdrop-filter: blur(20px); background: linear-gradient(to right, rgba(240, 240, 240, 0.8), rgba(240, 240, 240, 0.5) 4px); } </style>
-
10:56 - Setting image-based lighting (IBL) with environmentmap
<model src="camera.usdz" environmentmap="sunset.exr"></model>
-
12:41 - Allowing inline rotation with stagemode
<model src="teapot.usdz" stagemode="orbit"></model>
-
13:31 - Customize placement with JavaScript entityTransform
<model src="teapot.usdz" id="mymodel"></model> <script> const mymodel = document.getElementById("mymodel"); mymodel.ready.then(result => { const matrix = mymodel.entityTransform; // DOMMatrixReadOnly }); </script>
-
13:49 - Make the model face right with entityTransform
<model src="teapot.usdz" id="mymodel"></model> <a onclick="turnRight()">Right</a> <script> const mymodel = document.getElementById("mymodel"); function turnRight() { const matrix = mymodel.entityTransform; // DOMMatrixReadOnly const newMatrix = matrix.rotateAxisAngle(0, 1, 0, 90); mymodel.entityTransform = newMatrix; } </script>
-
15:03 - Setting the entityTransform to an identity matrix
model.entityTransform = new DOMMatrix();
-
16:31 - Basic animation control
<model src="toy.usdz" id="mymodel" loop autoplay></model> <button onclick="toggleAnimation()">Play/Pause</button> <script> const mymodel = document.getElementById("mymodel"); function toggleAnimation() { if (mymodel.paused) { mymodel.play(); } else { mymodel.pause(); } } </script>
-
17:35 - Jump to animation timestamp using .currentTime property
<model src="camera.usdz" id="mymodel"></model> <script> const mymodel = document.getElementById("mymodel"); function openFlash() { mymodel.currentTime = 1; // Unit is seconds } function openScreen() { mymodel.currentTime = 3; // Unit is seconds } </script>
-
18:11 - Update .currentTime with a slider
<model src="camera.usdz" id="mymodel"></model> <input type="range" id="slider" min="2" max="3" step="any" value="2"> <script> const mymodel = document.getElementById("mymodel"); slider.addEventListener("input", (event) => { mymodel.currentTime = event.target.value; }); </script>
-
19:35 - Generate USDZ with three.js and display with
import * as THREE from "three"; import { USDZExporter } from "three/examples/exporters/USDZExporter.js"; async function generateModel() { const scene = new THREE.Scene(); // ... create a really nice scene procedurally ... const bytes = await new USDZExporter().parseAsync(scene); const objURL = URL.createObjectURL(new Blob([bytes])); const mymodel = document.getElementById("mymodel"); mymodel.setAttribute("src", objURL); }
-
23:10 - Embed immersive media
<video src="spatial_video.mov"></video> <!-- Single file --> <video src="360_video.m3u8"></video> <!-- HTTP Live Streaming -->
-
24:25 - Going full screen with Javascript for
<video src="360_video.m3u8" id="player" controls></video> <script> const player = document.getElementById("player"); player.requestFullScreen(); </script>
-
24:35 - Embed panoramas and offer full screen with Javascript
<picture> <source media="(max-width: 799px)" srcset="thumbnail.jpg"> <source media="(min-width: 800px)" srcset="panorama.jpg"> <img src="panorama.jpg" id="pano"> </picture> <script> const pano = document.getElementById("pano"); pano.requestFullScreen(); </script>
-
24:57 - Embed spatial photos and offer full screen with Javascript
<img src="spatial.heic" id="img"> <script> const img = document.getElementById("img"); img.requestFullScreen(); </script>
-
25:21 - Embed spatial photos with the new "controls" attribute
<img src="spatial.heic" id="img" controls>
-
26:49 - Provide a custom environment
<link rel="spatial-backdrop" href="office.usdz" environmentmap="lighting.hdr">
-
-
- 0:00 - イントロダクション
The visionOS Safari team introduces new features for the spatial web this year, including stereoscopic 3D model rendering, immersive media playback, and developer preview features like website environments.
- 0:55 - 3Dモデルの埋め込み
The evolution of web development introduces the HTML Model element, enabling the seamless embedding of 3D models directly onto webpages. This new feature, now available by default in Safari on visionOS, revolutionizes how people interact with web content by providing stereoscopic rendering, allowing them to perceive depth and explore 3D objects from various angles. You can create 3D models using various tools, including iPhone's Reality Composer app, macOS Preview, or professional software like Blender and Maya. The USDZ file format is supported, ensuring compatibility across the 3D content industry. To embed a 3D model, developers simply use the '
' element in their HTML markup, specifying the USDZ file source. The browser automatically scales the model to fit within the element's bounds. For backward compatibility, you can include fallback images or use third-party 2D viewing libraries. Optimizing file size is crucial for fast loading times. You can utilize tools like Preview to compress textures and employ techniques discussed in WWDC24 sessions. Additionally, the 'ready' property of the ' ' element allows you to handle loading events, such as displaying loading indicators, ensuring a smooth user experience. The model element in web development serves as a virtual space for rendering 3D models. Be sure to handle loading errors and provide visual cues during loading to maintain user engagement. To ensure the model integrates seamlessly into the page, set the background color of the virtual space using CSS. Apply the 'background-color' attribute directly to the model element, as it replaces the original background color of the region. You can employ styling techniques — such as 'position: absolute', 'backdrop-filter', and 'linear-gradient' — to create effects like frosted glass and specular highlights, enhancing the model's visual appeal. Control the lighting effect on the model using image-based lighting (IBL), defined by an IBL file, which projects the entire 360-degree environment onto a planar image. The model element supports various user interactions out of the box, including drag-and-drop, pinch-to-rotate, and inline rotation. You can customize these interactions using JavaScript, allowing them to control the model's exact location, orientation, and transformation within the virtual space. By manipulating the transformation matrix exposed by the model element, you can create specific actions, such as rotating the model to face a certain direction. The 'entityTransform' matrix in USDZ files enables scaling, rotation, and translation of models. Setting it to an identity matrix aligns the model's origin to the center point, rendering 1 cm in USDZ as 1 cm in CSS (approximately 38 px). You can define animations within USDZ files and play them back using the model element's built-in APIs, similar to those for video elements. The 'currentTime' property allows jumping to specific timestamps in the animation timeline, enabling interactive control. For dynamic models based on user input, you can use JavaScript to programmatically generate USDZ files using libraries like Three.js. This allows for customizations such as adding text or changing colors, and people can still interact with and view the generated models in real space. - 21:24 - イマーシブメディアの表示
Support for immersive media on websites is expanded, enabling you to embed various formats such as spatial, 180-degree, 360-degree, and wide-field-of-view videos. With iPhone 15 Pro or later, users can capture spatial video directly from the Camera app and view it on Apple Vision Pro. visionOS now supports these immersive media types, which wrap around the user to provide an all-encompassing experience. Apple Immersive Video is also supported, featuring high-resolution stereo video perfectly calibrated to each camera lens. To view these immersive media files fully, people need to enter full-screen mode, where the video correctly projects around them. You can use the existing '
- 26:14 - カスタム環境の提供
There's also a new developer preview feature for Safari called Website Environment. This feature allows websites to create virtual environments using USDZ files, enabling visitors to experience immersive settings — such as restaurants, submarines, or dungeons — while still keeping Safari and the website in view. You can implement this feature by using specific HTML markup, linking to USDZ files, and customizing the environments with IBLs. The feature is currently in development, and feedback is encouraged to shape its future.