怖くない3Dファイルフォーマット

-- Views

December 06, 25

スライド概要

2025/12/06に開催されたvisionOS TCでのLT資料です

profile-image

岐阜の山中でヒキコモリ系プログラマー WindowsとiOSの間で生きる何か C/C++/Java/C#/Obj-C/Swift/F#/Haskell/Rustで生きている

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

怖くない 3Dファイルフォーマット visionOS TC 2025

2.

自己紹介 岐阜県出身 岐阜県在住 フリーランスエンジニア 元CAD/CAM系プログラマ エンジニアと人生コミュニティに生息 @ta̲ka̲tsu

3.

趣味で砂鉄から鉄をつくっています

4.

3Dファイルフォーマット →難しそう →怖い

5.

難しくないものも あるよ!

6.

.stlファイル

7.

.stlファイル ・ただの三角形のリスト ・ascii形式のフォーマットとbinary形式のフォーマットがある

8.

.stlファイル 一つの三角形の情報 (nx, ny, nz) ・頂点座標1 ・頂点座標2 ・頂点座標3 (x3, y3, z3) (x1, y1, z1) ・法線ベクトル(向いている方が表) なお3つの頂点が反時計回りに見えるのが表 (x2, y2, z2)

9.

.stlファイル 一つの三角形の情報 (nx, ny, nz) ・頂点座標1 ・頂点座標2 ・頂点座標3 (x3, y3, z3) (x1, y1, z1) ・法線ベクトル(向いている方が表) なお3つの頂点が反時計回りに見えるのが表 →表がどちらか食い違っているデータもある (x2, y2, z2)

10.

.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

11.

.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 データの終了

12.

.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 三角形のデータ

13.

.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 法線ベクトル

14.

.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 頂点座標

15.

.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) . . .

16.

.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) . . .

17.

.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) . . .

18.

.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) . . . ※属性はゼロがデファクトスタンダード

19.

.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

20.

.stlファイル 豆知識:.stlファイルはGitHubでは3Dビューで見られる

21.

.plyファイル

22.

.plyファイル ・頂点のリスト、面のリスト、エッジのリスト ・各情報の型や属性を指定できる ・ascii形式のフォーマットとbinary形式のフォーマットがある

23.

.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

24.

.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

25.

.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

26.

.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

27.

.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

28.

.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

29.

.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のものもある

30.

.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

31.

.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

32.

.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列で指定

33.

.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列で指定

34.

.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列で指定

35.

.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から

36.

.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 6点で構成される v2 v0 v1

37.

.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1

38.

.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1

39.

.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1

40.

.plyファイル 4つ以上の頂点を持つface→Triangle Fan形式 v4 v5 v3 6 0 1 2 3 4 5 v2 v0 v1

41.

.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列で指定

42.

指定できる数値型 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倍精度浮動小数点型

43.

.objファイル

44.

.objファイル ・基本は頂点列とそれを使った線や面など ・asciiファイル形式 ・テクスチャや色(Phongモデル)にも対応(本日は割愛) ・もっと複雑な表現にも対応(本日は割愛)

45.

.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 . . .

46.

.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 . . . コメント

47.

.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 . . . マテリアルファイルの指定

48.

.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 . . . 頂点

49.

.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 . . . テクスチャ座標

50.

.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 . . . 法線ベクトル

51.

.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 . . .

52.

.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から ※マイナスをつけると逆順

53.

.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 頂点だけ使用する時

54.

.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

55.

.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

56.

.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

57.

.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

58.

.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

59.

.objファイル 私のアイコンに使っている顔も.objファイルで保存してあります

60.

最後に

61.

最後に ・標準化されていないためフォーマットに曖昧さがあるので注意 ・歴史が古い→対応しているツール/ビューワが多くある ・自分で出力できると役に立つことも ・実はModel I/Oフレームワークで読み書きできる…?

62.

怖くないよ