Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Compositing 編)

続き:
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(2D/3D Procedural/Texture 編)
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Adjustment 編)
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Application 編)

Compositing は、複数の値をもとにひとつの値を生成するノードカテゴリ。

  • Compositing
    • Premultiply
    • Unpremultiply
    • Additive Mix
    • Subtractive Mix
    • Difference
    • Burn
    • Dodge
    • Screen
    • Overlay
    • Disjoint Over
    • In
    • Mask
    • Matte
    • Out
    • Over
    • Inside
    • Outside
    • Mix

膨大にあるが、Input / Output は共通しているものが多いので分類して見てみる。
Premultiply, Unpremultiply を除くすべてのドキュメントにサンプル画像あるので理解しやすい。2枚のテクスチャの合成に使うっぽいが、具体的にどういったケースで使いたくなるかはイメージできていない。

In: Color4 → Out: Color4

Premultiply, Unpremultiply

Premultiply は、ストレート(RGB画像+透明度を示すアルファチャンネルの画像)に対して透明度を乗算し、アルファが高いほど暗くしたもの。
Unmultiply はその逆で、プリマルチ処理を逆算し、ストレートを復元するもの、と理解した。

以下記事が画像付きで解説しており参考になった。

コンポジターに必要なアルファチャンネルの知識(後編) – コンポジゴク

(Foreground: Float, Background: Float, Mix: Float) → Out: Float

Mix, Additive Mix, Subtractive Mix, Burn, Dodge, Screen, Overlay

Background, Foreground の2色を、それぞれのノードごとに定義された数式(各ドキュメントに記載あり)で計算し、アウトプットの色を生成するもの。

Mix 値は基本的にブレンドのウェイトであると説明されているが、Mix ノードに限っては数式内の係数として明示されている。

Over, Disjoint Over, Matte

Foreground, Background それぞれのアルファチャンネルを用いた合成処理。Over が単純な合成で、Foreground のアルファに応じて合成される。

一方 Disjoint Over は、説明読むところ、Foreground のアルファと Background のアルファの合算値によって処理が変わるようで、1を超えない場合は単純な合成、ただし1を超えると Background 側の重みが下がるっぽい(ドキュメントの数式が F+b(1-f)/b となっていたが、F+B(1-f)/b の間違いでは?)。これにより、Output のアルファは 1 よりも常に小さくなる。

Matte は、RGB チャンネルが Ff+B(1-f)、アルファチャンネルが f+b(1-f) によって計算され、つまり Foreground 側のアルファチャンネルの反転で Background をマスクしている?

In, Out, Mask

In は Background アルファと重なる Foreground を残し、
Out は Background アルファと重ならない Foreground を残す。
(Background はアルファチャンネルのみを利用するため、Background テクスチャ画像は描画されない)

Matte は In の逆で、Foreground アルファをもとに Background を残す。
(Foreground はアルファチャンネルのみを利用するため、Foreground テクスチャ画像は描画されない)

(In: Float, Mask: Float) → Out: Float

Inside, Outside

いわゆるマスク画像をバイパスしてマスキングする、っぽい。(ドキュメントのサンプルを見れば一目瞭然)

Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Application 編)

続き:
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(2D/3D Procedural/Texture 編)
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Adjustment 編)

Application はシステムの値を取得するノードカテゴリで、Time は現在時刻(秒)、Up Direction は上方向(デフォルトではワールド空間)をそれぞれ取得可能。

システム時間は他のノードと接続することで継続的に変化し、時間に応じたダイナミックなマテリアルが実現できる。(ドキュメントにサンプル動画あり)

Reality Composer Pro の Share Graph で使えるノードを眺めてみる(Adjustment 編)

前回の試みの続き:
Reality Composer Pro の Share Graph で使えるノードを眺めてみる(2D/3D Procedural/Texture 編)

  • Adjustment
    • Remap
    • Smooth Step
    • Luminance
    • RGB to HSV
    • HSV to RGB
    • Contrast
    • Range
    • HSV Adjust
    • Saturate
    • Step (RealityKit)

名の通り値や範囲を変換するノードカテゴリ。分からなかったものだけ以下にまとめてみた。


Remap

In を In Low~In Hight の区間に正規化 (clampはしない) した上で、Out Low~Out Hight の区間に線形補間する。以下が参考になった。
ShaderGraphのRemapについて

たとえば

  • InMin = 0
  • InMax = 1
  • OutMin = 0
  • OutMax = 100

の場合、In 0.3 は Out 30 に変換される。

ChatGPT によると以下のような使い所があるらしい。

  • ノイズの出力を別レンジにマッピング
    • 0〜1 → -0.2〜0.8 とか
  • 距離(Position から算出した長さ)を 0〜1 に正規化
  • depth / mask などの 特定範囲だけを抽出して強調
  • テクスチャから取った値を別の物理量レンジに変換
    • 例:0〜1 のテクスチャ → 金属度 0.1〜0.8 に変換

参考:
Remap ノード | Shader Graph | 10.0.0-preview.27

Range

Remap に対し、さらにガンマ補正と clamp を可能にしたもの。といってもイメージがわかないのだが、ChatGPT によると使い所は以下らしい。

  • ノイズのコントラスト調整
    • ガンマで “柔らかい山” や “トゲのある山” を作れる
    • OutLow/High でオフセット付きノイズにできる
  • テクスチャのレベル補正(Photoshop の「レベル」みたいなこと)
    • InLow/High = 0.2〜0.8
    • Gamma = 0.8
    • → 暗部/明部の強調ができる
  • マスクの精密調整
    • Smoothstep より鋭い/柔らかいコントロールが可能
  • エッジ表現
    • Gamma > 1 で “暗い部分を広く、明るい部分を締める” ことができる

Step (RealityKit)

In が Edge よりも大きいか小さいかに従って、0 / 1 に二値化する。

Smooth Step

In が Low~High の区間で clamp し、区間内ではなめらかにS字状で補完 (エルミート補完) する。「これは補間が開始点から徐々に加速し、終了点に向かって減速することを意味します。この補間は、自然なアニメーション、フェード、その他の遷移を作成するのに有用」らしい。
Smoothstep Node | Shader Graph | 14.0.12

Step と Smooth Step の違いは以下がわかりやすかった。
ShaderGraphの頻出ノード!機能別で覚えよう #ポケテク|ポケラボ

Luminance

RGB を人の視覚的特性にあわせたグレースケースに変換する。輝度係数 (Luma coefficients) とカラーベクトルの内積を計算することで画像のグレースケール値を算出する。(ドキュメントにサンプル画像あり)

ChatGPT による用途は以下。

  • テクスチャ/カラー → グレースケール変換
    • 色の情報を無視して「明るさだけ」で処理したいとき。
  • マスク/マットの生成
    • たとえば “明るさが一定以上なら反応” とか、“暗い部分だけにエフェクトをかける” といった用途。
  • フェード、ディゾルブ、ディゾルブマスク
    • カラー画像の輝度差を利用して、部分的に透明/不透明を切り替えるような表現。
  • ポストプロセス/エフェクトの輝度依存処理
    • 明るさに応じてぼかし/エッジ/グローを変えるなど。
  • ライティングや雰囲気の制御
    • 色ではなく「明るさ」を元に音、パーティクル、光量の変化を制御する場合など。

Reality Composer Pro の Share Graph で使えるノードを眺めてみる(2D/3D Procedural/Texture 編)

Reality Composer Pro を使って、Shader Graph Material をノードベースでカスタム定義することができる、ということを WWDC23 のセッションで学んだ。表現したいイメージを持てていることはもちろん重要だろうが、それ以前に各ノードごとの役割や、それらを組み合わせてどんな表現が可能なのかを知ることが重要だと思った。

エディタをの背景をダブルクリックするとノードピッカーが現れる

ノードベースでさぞ直感的に意のままに操れるのかと思いきや、手始めにノードピッカーをスクロールしてみると、その数の多さに面食らってしまった。

試しに全種類列挙してみた。(クリックして展開)
2D Procedural
    Cellular Noise 2D
    Noise 2D
    Ramp 4 Corners
    Ramp Horizontal
    Ramp Vertical
    Split Horizontal
    Split Vertical
    Worley Noise 2D

2D Texture
    Image
    Tiled Image
    Transform 2D
    UV Texture

3D Procedural
    Cellular Noise 2D
    Fractal Noise 2D
    Noise 3D
    Worley Noise 3D

3D Texture
    Triplanar Projection

Adjustment
    Contrast
    HSV Adjust
    HSV to RGB
    Luminance
    Range
    Remap
    RGB to HSV
    Saturate
    Smooth Step
    Step (RK)

Application
    Time (float)
    Up Direction

Compositing
    Additive Mix
    Burn
    Difference
    Disjoint Over
    Dodge
    In
    Inside
    Mask
    Matte
    Mix
    Out
    Outside
    Over
    Overlay
    Premultiply
    Screen
    Subtractive Mix
    Unpremultiply

Data
    Combine 2
    Combine 3
    Combine 4
    Convert
    Extract
    Primvar Reader
    Separate 2
    Separate 3
    Separate 4
    Swizzle

Geometric
    Bitangent
    Geometric Property
    Geometric Color
    Normal
    Position
    Reflect (RK)
    Refract (RK)
    Tangent
    Texture Coordinates

Logic
    And (RK)
    If Equal
    If Greater
    If Greater Or Equal
    Not (RK)
    Or (RK)
    Select (RK)
    Switch
    XOR (RK)

Material
    Node Graph

Math
    Abs
    Acos
    Add
    Asin
    Atan
    Atan2
    Ceiling
    Clamp
    Copy Sign (RK)
    Cos
    Cos Pi (RK)
    Cross Product
    Determinant
    Distance (RK)
    Distance Square (RK)
    Divide
    Dot Product
    Exp
    Exponential 10 (RK)
    Exponential 2 (RK)
    Floor
    Fractional (RK)
    Fused Multiply-Add (RK)
    Hyperbolic Cos
    Hyperbolic Sin
    Hyperbolic Tan
    Inverse Hyperbolic Cos
    Inverse Hyperbolic Sin
    Inverse Hyperbolic Tan
    Invert Matrix
    Log 10
    Log 2
    Magnitude
    Magnitude Square (RK)
    Max
    Max3 (RK)
    Median3 (RK)
    Min
    Min3 (RK)
    Modulo
    Modulo (RK)
    Multiply
    Natural Log
    Normal Map
    Normal Map Decode
    Normalize
    One Minus (RK)
    Place 2D
    Power
    Reciprocal Square Root (RK)
    Rotate 2D
    Rotate 3D
    Round
    Safe Power
    Sign
    Sin
    Sin Pi (RK)
    Square Root
    Subtract
    Tan
    Tan Pi (RK)
    Transform Matrix
    Transform Normal
    Transform Point
    Transform Vector
    Transpose
    Truncate (RK)

Organization
    Dot

PBR
    Preview Surface

Procedural
    Boolean
    Color3 (Float)
    Color4 (Float)
    Float
    Half
    Image File
    Integer
    Integer2
    Integer3
    Integer4
    Matrix2x2 (Float)
    Matrix3x3 (Float)
    Matrix4x4 (Float)
    String
    Vector2 (Float)
    Vector2 (Half)
    Vector3 (Float)
    Vector3 (Half)
    Vector4 (Float)
    Vector4 (Half)

RealityKit
    Absolute Derivatives Sum
    Blurred Background
    Camera Index Switch
    Camera Position
    Cube Image
    Cube Image Gradient
    Cube Image LOD
    Environment Radiance
    Fortran Difference and Minimum
    Geometry Modifier
    Geometry Modifier Model to View
    Geometry Modifier Model to World
    Geometry Modifier Normal to World
    Geometry Modifier Projection to View
    Geometry Modifier Vertex ID
    Geometry Modifier View To Projection
    Geometry Modifier World To Model
    Hover State
    Image 2D
    Image 2D Array
    Image 2D Array Gradient
    Image 2D Array Gradient Pixel
    Image 2D Array LOD
    Image 2D Array LOD Pixel
    Image 2D Array Pixel
    Image 2D Gradient
    Image 2D Gradient Pixel
    Image 2D LOD
    Image 2D LOD Pixel
    Image 2D Pixel
    Image 2D Read
    Image 3D
    Image 3D Gradient
    Image 3D Gradient Pixel
    Image 3D LOD
    Image 3D LOD Pixel
    Image 3D Pixel
    Image 3D Read
    Is Finite
    Is Infinite
    Is Normal
    Is Not a Number
    Is Ordered
    Is Unordered
    Multiply 24
    Multiply Add 24
    Occlusion Surface
    PBR Surface
    Power Positive
    Reflection Diffuse
    Reflection Specular
    Round Integral
    Screen-Space X Partial Derivative
    Screen-Space Y Partial Derivative
    Shadow Receiving Occlusion Surface
    Sign Bit
    Surface Model to View
    Surface Model to World
    Surface Projection to View
    Surface Screen Position
    Surface View Direction
    Surface View to Projection
    Surface World to View
    Unlit Surface
    View Direction

Surface
    Preview Surface


一度にすべて見るのは不可能なので、小分けに見てみたい。(リンクは Apple Developer Documentation)

  • 2D Procedural
    • Ramp 4 Corners
    • Ramp Horizontal
    • Ramp Vertical
    • Split Horizontal
    • Split Vertical
    • Noise 2D
    • Cellular Noise 2D
    • Worley Noise 2D
  • 2D Texture
    • Image
    • Tiled Image
    • Transform 2D
    • UV Texture
  • 3D Procedural
    • Noise 3D
    • Fractal Noise 2D
    • Cellular Noise 2D
    • Worley Noise 3D
  • 3D Texture
    • Triplanar Projection

そもそも 2D/3D Procedural の「Procedural」は聞き慣れない単語だが調べると、手続き型(プロシージャル)、一定のアルゴリズムに従ってアセットを自動生成する、ということらしい。

プロシージャル(Procedural)|用語集|ゲームメーカーズ

ここでは、グラデーション(Ramp)やノイズ(Noise)を生成するっぽい。それぞれの生成結果は Apple Developer Documentation 上でサンプルが提示されているので、イメージをつかむ上でありがたい。

Split は?というと、以下のように解説されていたが、なんのこっちゃ。

A left-to-right split matte, split at a specified U value.

Split Horizontal | Apple Developer Documentation

ChatGPT に解説させたら「U 座標(横方向)の指定位置で、左側と右側を分けるマスク(Matte)を作るノード。」とのこと。以下の用途があるらしい。

  • 画面の左側だけエフェクトをかける
  • U = 0.3 でカットオフし、左 30% にだけ別の色やテクスチャを適用する
  • スクロールする wipe(ワイプ) エフェクトの基礎として使う
  • トランジションのマスクを作る

Texture については、Image や Tiled Image はイメージできる。

Transform 2D は2次元インプットに対してアフィン変換(平行移動、拡大縮小、回転)を掛けるもの。

UV Texture の description についても説明がシンプルすぎて分からなかったが、

A MaterialX version of USD UV Texture reader.

UV Texture | Apple Developer Documentation

ChatGPT によると「USD(Universal Scene Description)で定義されている「UV テクスチャを読むノード」を、MaterialX 形式として利用できるようにしたもの。」とのこと。

最後、Triplanar Projection は、

Samples data from three images and projects each along its respective coordinate axis and blends them by geometric normal.
(3つの画像からサンプルデータを抽出し、それぞれを対応する座標軸に沿って投影し、幾何学的法線によってそれらを合成する。)

Triplanar Projection | Apple Developer Documentation

Document サイト上にサンプルが提示してあるが、自分で手を動かしてみないと正確には理解できなさそう。概念的なことは、この記事が参考になりそうだった。

2DテクスチャをUVを使わずに投影するTri-Planar Texture Mapping #WebGL – Qiita

画像からEXIF情報だけを削除する(Mac)

こうしたブログに画像を投稿する場合、うっかり exif 情報付きでアップロードしてしまうとプライバシーの観点で危険。macOS の Preview.app を使って簡単に削除することができる。(サイドパネルの情報セクションを一番下までスクロールすると削除ボタンがある)

しかし、この手順を踏むと JPEG 画像が HEIC に変換されたり、JPEG でエクスポートすると再圧縮されてしまう。そして複数画像に対して一括操作することもできない。

exiftool を使うと、JPEG や HEIC ファイルから exif 情報だけを削除することが可能。

ExifTool by Phil Harvey

インストール

$ brew install exiftool
or
$ arch -arm64 install exiftool #Apple Silicon の場合

cwd 配下の画像に対して一括実行

$ exiftool -overwrite_original -all= *.jpg
$ exiftool -overwrite_original -all= *.heic

iPhone Pocket を購入した

注文していた iPhone Pocket が今朝届いた。

専用に設計された外箱とパッケージ。

サファイアの本体。


今日、1日外使いしてみて感じたこと(iPhone 17 Pro + 純正シリコンケース)。

  • iPhone がポケットに入っていない分身軽で楽
  • ただ、シリコンケースとの相性は良くなく出し入れ時の摩擦で引っかかるので結構手こずる(ケース無しだと余裕、TechWoven ケースも違和感なし)
    • これが逆に iPhone を不用意に触るクセを防止し、自ずとデジタルデトックスに繋がっている気もした
  • Suica 大丈夫か?と思ったが、Pocket に入れたままでも Suica タッチはできた
    • しかしハプティックを感じづらい上に画面が見えないので、ちゃんとタッチ認識されたかが分からない
    • また、端末向きも分からないので、端末下側をリーダーに向けてタッチしてしまうことも起きうる
  • もちろん Face ID を要する電子決済は取り出す必要がある

もうひとつの狙いであった Vision Pro バッテリーのケースとしての使い方が抜群に良く、サイズはぴったりだし、iPhone よりもやや重いバッテリーも生地が伸びたりせずしっかりと支えられ、まったく問題がなかった。


個人的に、林信行氏のインタビュー記事で言及されていた、iPhone Pocket の格子状の穴から漏れるディスプレイの光が、予想以上に楽しめたのが良かった。

伸びた時、中のものがとても繊細に、でも素敵に見えてくる。誰かがメッセージを送ってきた時、スクリーン上のものがちょっとだけ透けて見えて、それが心をくすぐる。とてもシンプルでとても巧妙な解決策でした

iPhone Pocket:イッセイ ミヤケとアップルが紡ぐ「一枚の布」の物語 | ELLE DECOR [エル・デコ]

あの有名な壁紙を透かして遊んでみた。

実装メモ:Vision Pro の向いている仰角/伏角(pitch)を求める

Vision Pro 装着時の頭部が、水平に対して何度上下に向いているか(仰/伏角、ピッチ)を知るには、頭部(カメラ)方向のベクトルについて、XZ平面に射影したベクトル長とY軸方向の成分とで atan を計算すれば、その角度(ラジアン)が求まる。

カメラ方向ベクトルの求め方は、SATOSHI さんのサンプルコードを参照。

let worldTracking = WorldTrackingProvider()

fun headPitchRadian() -> CGFloat {
    let matrix = worldTracking.deviceOriginFromAnchorTransform!
    // カメラ前方方向
    let cameraForward = simd_act(matrix.rotation, simd_float3(0, 0, -1))
    let front = SIMD3<Float>(x: cameraForward.x, y: cameraForward.y, z: cameraForward.z)
    // XZ平面に射影したベクトル長
    let horizontalLen = simd_length(SIMD2<Float>(front.x, front.z))
    return CGFloat(atan2(front.y, horizontalLen))
}

ここで、worldTracking.deviceOriginFromAnchorTransform に対して [0, 0, 1] によりZ軸方向に反転させているのは、もともとデバイス正面がZ軸の負方向を向いているため。

カメラ方向ベクトルの算出は以下でもOK。

// columns.2 がデバイスZ軸方向のワールド座標系におけるベクトル
let zAxis = SIMD3<Float>(
    matrix.columns.2.x,
    matrix.columns.2.y,
    matrix.columns.2.z
)
let cameraForward = simd_normalize(-zAxis) // 反転

実装メモ:デバイス座標系における Entity の座標を求める

以下実装のために、デバイス座標系における Entity の座標を求める必要があった。

trackingMode = .continuous とした AnchorEntity(.head) の座標系に変換すれば簡単にできるかと思ったが、デバイス位置にアンカーがうまく追従されず、原因は分からなかったが先に進めたかったので、座標変換して求めることにした。

デバイス→ワールド座標系の変換行列 の逆行列をとれば、ワールド→ワールド座標系の変換行列となり、ワールド座標系における任意の座標をデバイス座標系に変換することができる。

let worldTracking = WorldTrackingProvider()

func positionInDeviceSpace(of entity: Entity) -> SIMD3<Float> {
    guard let deviceAnchor = worldTracking.queryDeviceAnchor(atTimestamp: CACurrentMediaTime()) else { return .zero }
    let worldFromDevice = deviceAnchor.originFromAnchorTransform
    let deviceFromWorld = worldFromDevice.inverse
    let worldFromEntity = entity.transformMatrix(relativeTo: nil)
    let deviceFromEntity = deviceFromWorld * worldFromEntity
    return SIMD3<Float>(
        deviceFromEntity.columns.3.x,
        deviceFromEntity.columns.3.y,
        deviceFromEntity.columns.3.z
    )
}

WWDC23:Explore materials in Reality Composer Pro

ShaderGraphMaterial を用いた表現を試してみたく、ずっと避けてきた Reality Composer Pro でのノードベースのマテリアル設計を知るために、2年前(visionOS がまだセッション内で xrOS と呼ばれていた頃)のビデオを掘り起こし、久々にサマリしてみた(AIの手を借りて)。

こう見ているとなるほど簡単に思えるが、そもそもどんな表現をしたいかが頭に思い描けていないと、ただ闇雲にエディタをいじくる羽目になりそう。そして Reality Composer Pro での表現の可能性を知るためには、各ノードごとの Input/Output を把握する必要もある。


0:00 – Introduction

  • Reality Composer Pro と visionOS の material 基礎を俯瞰し MaterialX ベースの ShaderGraphMaterial と Reality Composer Pro の Shader Graph エディタでの制作フローを提示

0:55 – Materials in xrOS

  • material が色や画像アニメーション、geometry の変形が可能、 PBR による物理特性パラメータで外観を制御
  • RealityKit 2 の CustomMaterial と visionOS 限定の ShaderGraphMaterial、Physically Based と Custom の二種類の shader が選択可能
  • MaterialX というオープンスタンダードに基づくグラフ構成で material を設計

3:38 – Material editing

  • 地形に等高線を描く TopographyMaterial を例に Reality Composer Pro の Shader Graph 操作の実演
  • Position ノードから高さを取得し Separate で Y 値を抽出後 Modulo と ifgreater で高さ帯を判定しラインと地形色を切り替えるロジックを構築
  • inspector でノード引数を設定し Diffuse Color に接続することでカスタム shader が実際のモデルへ即時反映されるワークフローを実演

10:26 – Node graphs

  • 複雑なノード群を Compose Node Graph でまとめ Lines ノードとして再利用し SecondaryLines インスタンスでラインの間隔や色を差別化
  • Spacing と Color の入力を追加してノードグラフ間のパラメータ共有を可能にし Multiply ノードで複数ラインセットを合成す

13:16 – Geometry modifiers

  • Geometry Modifier サーフェスを追加し高さマップやカラーラスターデータを Image ノード経由で読み込み Model Position Offset と surface normal を同時に更新してフラットなディスクを地形へ変換
  • Remap ノードで法線値を -1 から 1 に補正し Combine 3 で Y 成分のみを操作
  • 新しい地形用のデータセットを追加し Mix ノードと 0 から 1 の制御値で二つの地形間を補間し Promote で Swift コードから進行度を操作できる入力として公開可能

iPhone Pocket を Apple 銀座に見に行った

先週唐突に Apple から発表された、Issei Miyake との共同開発商品である iPhone Pocket。これがその奇抜さと高価格に反して飛ぶように売れ、ロングは販売開始後数時間でオンラインストア上の在庫は売り切れ、ショートも翌日にはオンライン上では全色売り切れとなっていた。

買う/買わないは別として、製品そのもののバックストーリーであったり、店内ディスプレイの工夫について、ライター林信行さんのインタビュー記事やポストから知っていたので、一度はストアに足を運びこの目で拝んでおきたいと思っていた。

iPhone Pocket:イッセイ ミヤケとアップルが紡ぐ「一枚の布」の物語 | ELLE DECOR [エル・デコ](必読です)

が、こうも飛ぶ鳥を落とす勢いで売れているようでは、店内展示も早々に撤去されるのでは?と不安になり、週末慌てて、国内では唯一の iPhone Pocket 販売店である Apple 銀座に見に行ったのであった。

とにかく、ショートの色鮮やかさには目を奪われる。生地の質感は画像から想像していたとおりだった。ジャケットの上からでも無理なく掛けられたので、夏冬選ばずに使えそう。ストア在庫についてだが、ロングは売り切れ、ショートは一部在庫があるようだった。今後の入荷について尋ねると、スタッフも把握していないということだった。(林信行さんによると再販はなさそう。)


ちなみにここまで書いてきてなんだが、筆者はすでにロング(サファイア)を予約済みである(到着は12月初旬)。

なぜ注文したかといえば、これを見た瞬間に Vision Pro 使用中のバッテリーケースに使えそうだと直感したのもそうだが、何より先のインタビュー記事からこの製品が誕生するまでの過程に魅力を感じ、これは手元に置いて使いたいと思ったからだ。Apple に限らず、あの時買っておけばとあとになって後悔する製品はこれまでもいくつかあったが、iPhone Pocket をもし買わなければ、きっとそのひとつに加わる予感がしたのだった。

上記の記事にも言及されていることだが、パッケージは千歳飴から着想を得た意匠になっており、加えて11/14という発売日も七五三の日に合わせているのだから、素材や使い勝手だけでなく、文化に対する敬意すらもデザインへと昇華させるその姿勢には驚きを隠せない。


ちなみに、Vision Pro のバッテリーケース案は当然世界中の人間が同じことを考えたようで、Xを眺めるとすでにいくつも写真が投稿されている。

また、グラス型デバイスの登場に先んじて「バッテリーの携帯を当たり前にする」という見方は、一理あると思った笑


インタビュー記事内で言及されているタグの秘密については、以下の動画で明かされている。

シンプルなようで、モノとして美しく、しっかりとした作りの3Dニットはイッセイ ミヤケの製造技術の賜物だが、最終的な製品の形状はイッセイ ミヤケだけでは作ることができなかったと宮前は振り返る。特にそう思わせるのが製品のタグだ。iPhone本体を収納するポケットのちょっと上の側面の絶妙な位置に縫い付けられており、製品の裏側から見ても縫い目が見当たらない。

iPhone Pocket:イッセイ ミヤケとアップルが紡ぐ「一枚の布」の物語 | ELLE DECOR [エル・デコ]