-- Views
December 06, 25
スライド概要
2025/12/06に開催されたvisionOS TCでのLT資料です
岐阜の山中でヒキコモリ系プログラマー WindowsとiOSの間で生きる何か C/C++/Java/C#/Obj-C/Swift/F#/Haskell/Rustで生きている
怖くない 3Dファイルフォーマット visionOS TC 2025
自己紹介 岐阜県出身 岐阜県在住 フリーランスエンジニア 元CAD/CAM系プログラマ エンジニアと人生コミュニティに生息 @ta̲ka̲tsu
趣味で砂鉄から鉄をつくっています
3Dファイルフォーマット →難しそう →怖い
難しくないものも あるよ!
.stlファイル
.stlファイル ・ただの三角形のリスト ・ascii形式のフォーマットとbinary形式のフォーマットがある
.stlファイル 一つの三角形の情報 (nx, ny, nz) ・頂点座標1 ・頂点座標2 ・頂点座標3 (x3, y3, z3) (x1, y1, z1) ・法線ベクトル(向いている方が表) なお3つの頂点が反時計回りに見えるのが表 (x2, y2, z2)
.stlファイル 一つの三角形の情報 (nx, ny, nz) ・頂点座標1 ・頂点座標2 ・頂点座標3 (x3, y3, z3) (x1, y1, z1) ・法線ベクトル(向いている方が表) なお3つの頂点が反時計回りに見えるのが表 →表がどちらか食い違っているデータもある (x2, y2, z2)
.stlファイル(ascii形式) solid name facet normal 0.0 -1.0 0.0 outer loop vertex 0.0 0.0 0.0 vertex 1.0 0.0 0.0 vertex 0.0 0.0 1.0 endloop endfacet . . . endsolid
.stlファイル(ascii形式) solid name データの開始位置とモデルの名前 facet normal 0.0 -1.0 0.0 outer loop vertex 0.0 0.0 0.0 vertex 1.0 0.0 0.0 vertex 0.0 0.0 1.0 endloop endfacet . . . endsolid データの終了
.stlファイル(ascii形式) solid name facet normal 0.0 -1.0 0.0 outer loop vertex 0.0 0.0 0.0 vertex 1.0 0.0 0.0 vertex 0.0 0.0 1.0 endloop endfacet . . . endsolid 三角形のデータ
.stlファイル(ascii形式) solid name facet normal 0.0 -1.0 0.0 outer loop vertex 0.0 0.0 0.0 vertex 1.0 0.0 0.0 vertex 0.0 0.0 1.0 endloop endfacet . . . endsolid 法線ベクトル
.stlファイル(ascii形式) solid name facet normal 0.0 -1.0 0.0 outer loop vertex 0.0 0.0 0.0 vertex 1.0 0.0 0.0 vertex 0.0 0.0 1.0 endloop endfacet . . . endsolid 頂点座標
.stlファイル(binary形式) 80bytes ヘッダ 4bytes 三角形の数(UInt32) 4bytes 4bytes 4bytes 法線(Float x 3) 4bytes 4bytes 4bytes 頂点座標1(Float x 3) 4bytes 4bytes 4bytes 頂点座標2(Float x 3) 4bytes 4bytes 4bytes 頂点座標3(Float x 3) 2bytes 属性(UInt16) . . .
.stlファイル(binary形式) 80bytes ヘッダ 4bytes 三角形の数(UInt32) 4bytes 4bytes 4bytes 法線(Float x 3) 4bytes 4bytes 4bytes 頂点座標1(Float x 3) 4bytes 4bytes 4bytes 頂点座標2(Float x 3) 4bytes 4bytes 4bytes 頂点座標3(Float x 3) 2bytes 属性(UInt16) . . .
.stlファイル(binary形式) 80bytes ヘッダ 4bytes 三角形の数(UInt32) 4bytes 4bytes 4bytes 法線(Float x 3) 4bytes 4bytes 4bytes 頂点座標1(Float x 3) 4bytes 4bytes 4bytes 頂点座標2(Float x 3) 4bytes 4bytes 4bytes 頂点座標3(Float x 3) 2bytes 属性(UInt16) . . .
.stlファイル(binary形式) 80bytes ヘッダ 4bytes 三角形の枚数(UInt32) 4bytes 4bytes 4bytes 法線(Float x 3) 4bytes 4bytes 4bytes 頂点座標1(Float x 3) 4bytes 4bytes 4bytes 頂点座標2(Float x 3) 4bytes 4bytes 4bytes 頂点座標3(Float x 3) 2bytes 属性(UInt16) . . . ※属性はゼロがデファクトスタンダード
.stlファイル(binary形式) 80bytes ヘッダ 4bytes 三角形の枚数(UInt32) 4bytes 4bytes 4bytes 法線(Float x 3) 4bytes 4bytes 4bytes 頂点座標1(Float x 3) 4bytes 4bytes 4bytes 頂点座標2(Float x 3) 4bytes 4bytes 4bytes 頂点座標3(Float x 3) 2bytes 属性(UInt16) . . . ※UInt32, Float, UInt16は全てLittle-endian
.stlファイル 豆知識:.stlファイルはGitHubでは3Dビューで見られる
.plyファイル
.plyファイル ・頂点のリスト、面のリスト、エッジのリスト ・各情報の型や属性を指定できる ・ascii形式のフォーマットとbinary形式のフォーマットがある
.plyファイル ヘッダ(ascii/binary共通) ply format ascii 1.0 comment hello element vertex 8 property float x property float y property float z element face 6 property list uchar int vertex_index endheader
.plyファイル ヘッダ(ascii/binary共通) ply固定 ply format ascii 1.0 comment hello element vertex 8 property float x property float y property float z element face 6 property list uchar int vertex_index endheader
.plyファイル ヘッダ(ascii/binary共通) ply ascii形式かbinary形式か format ascii 1.0 comment hello ・ascii element vertex 8 ・binary̲big̲endian property float x ・binary̲little̲endian property float y のいずれか property float z element face 6 property list uchar int vertex_index endheader
.plyファイル ヘッダ(ascii/binary共通) ply format ascii 1.0 コメント comment hello element vertex 8 property float x property float y property float z element face 6 property list uchar int vertex_index endheader
.plyファイル ヘッダ(ascii/binary共通) fl ply format ascii 1.0 頂点の宣言 comment hello ・頂点は8つ element vertex 8 property float x ・頂点はx, y, zという情報を持つ property float y ・x, y, zは oat型 property float z element face 6 property list uchar int vertex_index endheader
.plyファイル . . . element vertex 8 property float x property float y property float z property uchar red property uchar green property uchar blue property double nx property double ny property double nz プロパティ名や数は仕様上は自由 読む側が解釈できれば良い (とはいえx, y, zは実質デファクト) "A typical PLY object definition is simply a list of (x,y,z) triples for vertices and a list of faces that are described by indices into the list of vertices. Most PLY files include this core information." https://gamma.cs.unc.edu/POWERPLANT/papers/ply.pdf
.plyファイル ヘッダ(ascii/binary共通) ply format ascii 1.0 面の宣言 comment hello ・面は6つ element vertex 8 ・リスト内の頂点の数はucharで表現 property float x ・頂点のインデックスをint列で指定 property float y property float z element face 6 property list uchar int vertex_index endheader ※vertex̲indexでなくvertex̲indicesのものもある
.plyファイル ヘッダ(ascii/binary共通) ply format ascii 1.0 comment hello element vertex 8 property float x property float y property float z element face 6 property list uchar int vertex_index endheader
.plyファイル(ascii形式) ascii形式のヘッダ以降 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 3 0 1 2 3 0 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0
.plyファイル(ascii形式) ascii形式のヘッダ以降 fl 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 3 0 1 2 3 0 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0 頂点の宣言 ・頂点は8つ ・頂点はx, y, zという情報を持つ ・x, y, zは oat型 面の宣言 ・面は6つ ・リスト内の頂点の数はucharで表現 ・頂点のインデックスをint列で指定
.plyファイル(ascii形式) ascii形式のヘッダ以降 fl 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 3 0 1 2 3 0 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0 頂点の宣言 ・頂点は8つ ・頂点はx, y, zという情報を持つ ・x, y, zは oat型 面の宣言 ・面は6つ ・リスト内の頂点の数はucharで表現 ・頂点のインデックスをint列で指定
.plyファイル(ascii形式) ascii形式のヘッダ以降 fl 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 3 0 1 2 3 0 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0 頂点の宣言 ・頂点は8つ ・頂点はx, y, zという情報を持つ ・x, y, zは oat型 面の宣言 ・面は6つ ・リスト内の頂点の数はucharで表現 ・頂点のインデックスをint列で指定
.plyファイル(ascii形式) ascii形式のヘッダ以降 fl 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 3 0 1 2 3 0 2 3 4 7 6 5 4 4 0 4 5 1 4 1 5 6 2 4 2 6 7 3 4 3 7 4 0 頂点の宣言 ・頂点は8つ ・頂点はx, y, zという情報を持つ ・x, y, zは oat型 面の宣言 ・面は6つ ・リスト内の頂点の数はucharで表現 ・頂点のインデックスをint列で指定 ※頂点のインデックスは0から
.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 6点で構成される v2 v0 v1
.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1
.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1
.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1
.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1
.plyファイル(binary形式) binary形式のヘッダ以降 x y z x y z index index index index index 頂点の宣言 ・頂点は8つ ・頂点はx, y, zという情報を持つ ・x, y, zは oat型 ... 3 ... index fl 4 index 面の宣言 ・面は6つ ・リスト内の頂点の数はucharで表現 ・頂点のインデックスをint列で指定
指定できる数値型 fl char uchar short ushort int uint oat double fl fl .plyファイル (int8) (uint8) (int16) (uint16) (int32) (uint32) ( oat32) ( oat64) 1byte整数 1byte符号なし整数 2bytes整数 2bytes符号なし整数 4bytes整数 4bytes符号なし整数 4bytes単精度浮動小数点型 8bytes倍精度浮動小数点型
.objファイル
.objファイル ・基本は頂点列とそれを使った線や面など ・asciiファイル形式 ・テクスチャや色(Phongモデル)にも対応(本日は割愛) ・もっと複雑な表現にも対応(本日は割愛)
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . .
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . コメント
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . マテリアルファイルの指定
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . 頂点
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . テクスチャ座標
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . 法線ベクトル
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . マテリアルファイル内のマテリアル指定 usemtl materialA f 1/2/1 2/1/3 3/2/2 . . .
.objファイル # comment mtllib sample.mtl v 0.0 0.0 1.0 . . . vt 0.0 0.0 . . . vn 1.0 0.0 0.0 . . . usemtl materialA f 1/2/1 2/1/3 3/2/2 . . . 面の構造指定 ※インデックスは1から ※マイナスをつけると逆順
.objファイル fの記述方法=頂点番号/テクスチャ座標番号/法線番号 を3点分 f 1/2/1 2/1/3 3/2/2 全て使う時 f 1//1 2//3 3//2 テクスチャ座標を使用しない時 f 1/2 2/1 3/2 法線を使用しない時 f 1 2 3 頂点だけ使用する時
.objファイル テクスチャ座標 . . . vt 0.2 0.2 vt 0.6 0.2 vt 0.2 0.6 . . . f 1/1 2/2 3/3 . . . 3 2 1.0 1 1.0
.objファイル テクスチャ座標 . . . vt 0.2 0.2 vt 0.6 0.2 vt 0.2 0.6 . . . f 1/1 2/2 3/3 . . . 3 2 1.0 1 1.0
.objファイル テクスチャ座標 . . . vt 0.2 0.2 vt 0.6 0.2 vt 0.2 0.6 . . . f 1/1 2/2 3/3 . . . 3 2 1.0 1 1.0
.objファイル テクスチャ座標 . . . vt 0.2 0.2 vt 0.6 0.2 vt 0.2 0.6 . . . f 1/1 2/2 3/3 . . . 3 2 1.0 1 1.0
.objファイル テクスチャ座標 . . . vt 0.2 0.2 vt 0.6 0.2 vt 0.2 0.6 . . . f 1/1 2/2 3/3 . . . 3 2 1
.objファイル 私のアイコンに使っている顔も.objファイルで保存してあります
最後に
最後に ・標準化されていないためフォーマットに曖昧さがあるので注意 ・歴史が古い→対応しているツール/ビューワが多くある ・自分で出力できると役に立つことも ・実はModel I/Oフレームワークで読み書きできる…?
怖くないよ