companynameJ

3D画像ファイルのカメラデータとは?

glTFファイルのカメラデータを解きほぐす

 
 

はじめに

 
3D画像ファイルは、3次元コンピュータグラフィックス(以下3DCG)技術と密接に関連しており、3D物体の表面形状(ジオメトリ)を表すデータが主体ですが、画像データ(明るさや色情報)が付加される場合もあります。
 
前回の3D画像ファイルの画像とは?で、glTFファイルなどの3D画像ファイルでは画像データをどのように扱って記録しているのかを調べました。
 
3D画像ファイルのデータによって3D物体が形成されることになるので、一般的には3D画像ファイルを読み取る3Dソフトウェアが3D物体を2D画像に変換して表示しています。
 
この2D画像に変換する操作方法はそれぞれの3Dソフトウェアにより異なり、好きな位置の画像を好きな視点から観察するようにそれぞれ工夫されています。
これは被写体をカメラで撮影するのと同じ動作を3DCGの世界でも実行できるようになっていると言えるでしょう。
 
3Dソフトウェアで自在に2D画像に変換できるのは便利な機能ですが、指定した2D画像を表示させるという機能も考えられます。
被写体をカメラで撮影するのと同じ動作をさせるデータを3D画像ファイル自体に組み込んでおくことによって、指定した2D画像を表示させるという機能があります。
前回取り上げたglTFファイルにもそういうカメラデータが格納できる機能が備わっています。
 
そのカメラデータとはどういうデータであって、その役割はどういうものなのでしょうか?
 
3D画像ファイルを用いて画像を形成する仕組みについては、3DCGに関する複雑な数式を駆使した解説記事が沢山見つかりますが、理解するのは骨が折れる作業になります。
 
今回は、glTFファイルのカメラデータだけに絞って、出来るだけ数式を使わないでそのデータの概念を解きほぐしてみることにします。
 

glTF 2.0ファイルフォーマットのカメラデータ

 
glTF 2.0ファイルフォーマットの仕様については、The glTF 2.0 Specificationに書かれています。
 
カメラデータは、視点データとプロジェクション変換データがあり(筆者が適当に分類)、
視点データとして、
・translation(視点移動)
・rotation(視点回転)
プロジェクション変換データとして、
・aspectRatio(アスペクト比)
・yfov(y画角)
・znear(z近点)
・zfar(z遠点)
のデータで構成されています。
後述する平行投影の場合は、aspectRatioとyfovの代わりにxmagとymagが用いられます。
 
こういう3DCG関連の用語の日本語訳は、異なる用語が用いられている場合が多くて混乱します。ここでは筆者の独断で書いていますのでご了解ください。
 
仕様書では、視点データは仕様書ではnodeデータのcameraプロパティに格納され、プロジェクション変換データはcameraアセットに格納されています。
 
それらカメラデータの意味や役割を以下に説明していきます。
 

視点データ

 
カメラ(視点)がどの位置にあるかをtranslation(視点移動)で設定し、カメラ(視点)がどの方向を見ているかをrotation(視点回転)で設定します。
 
translation(視点移動)は、被写体(3D物体)の原点からどれくらい離れた位置に視点があるかをxyz座標値で表します。この視点位置がカメラ機能で用いられるカメラ座標系の原点になります。
 
glTFファイルフォーマットでは、右手座標系で
The camera is defined such that the local +X axis is to the right, the “lens” looks towards the local -Z
axis, and the top of the camera is aligned with the local +Y axis.
と定義されているので、カメラ座標系の-Zc(混乱するのでカメラ座標系はXcYcZcと呼ぶことにする)方向が視方向になります。
 
被写体をカメラで撮影する場合、ある場所にカメラを置いた後、ある向きになるように、被写体を回転させるかカメラを回転するかの操作をして撮影します。
この回転操作は、被写体の座標系をカメラの座標系に対してどの程度回転させるかという操作になります。
この異なる座標系の回転量をrotation(視点回転)で表します。
 
3DCGの表現では、被写体の座標系をワールド座標系と呼び、カメラ座標系に変換することをビュー変換と呼んだりしています。
ワールド座標系をtranslation(視点移動)の分だけ移動させ、rotation(視点回転)の分だけ回転させればカメラ座標系になるということです。
 
視点と被写体原点を結んだ線上にそのカメラ座標系のZ軸を配置すれば、カメラは被写体の原点に向かって視方向が設定されることになります。
下記具体例1では、カメラの視方向が被写体原点に向かっています。注視点が被写体原点(ワールド座標系の原点)になっていると言い換えることができます。

imgP5_1
【図1】

 
 

具体例1

今回も著名なオープンソースの3DCGソフトであるBlenderから出力された、単純な立方体モデルのglbファイル(バイナリ)を拝借します。
 
Blenderのデフォルト状態(筆者の環境でBlenderインストールした直後の状態なのでデフォルトとしておく)で、前回の具体例3と同様に、立方体の向きが分かるように、メッシュモードの頂点カラー+ノーマルあり、BaseColorを(1,1,1)にして頂点ペイントで赤色1個の頂点だけに塗った状態を、カメラ設定にチェックを入れてglTF2.0(.glb)でエクスポートしました。
 
そのglbファイルの中の視点データを示すカメラデータのみを取り出すと、
 "nodes": [
 {
  "camera": 0,
  "name": "Camera",
  "rotation": [
   -0.209972992539406,
   0.385779947042465,
   0.090628445148468,
   0.89379620552063
  ],
  "translation": [
   7.35889148712158,
   4.95830917358398,
   6.92579078674316
  ]
 }
 ],
 

となっています。
 
具体例1のBlenderのカメラ設定は【図2】、レンズ設定は【図3】、カメラ画面は【図4】のようになっています。
 

imgP5_2
【図2】
imgP5_3
【図3】
imgP5_4
【図4】

 
このglbファイルを、ビューアソフトであるglTF Viewerを使って表示させた例を【図5】に示します。
このglTF Viewerは、右上にあるcamera設定を[default]からcameraに変更すると、glTFファイルのカメラ設定が反映されて表示されるようになっています。
 

imgP5_5
【図5】

 

translation(視点移動)について

 
具体例1のglTFファイルのtranslation値(Tx、Ty、Tzとします)は、
   Tx=7.35889148712158,
   Ty=4.95830917358398,
   Tz=6.92579078674316
になっていました。
 
一方、このglTFファイルをエクスポートしたBlenderのカメラ設定は【図2】に示すように、
位置x=7.3589m
  y=-6.9258m
  z=4.9583m
となっていて値が一致しません。
同じ数値でありますが、yzの座標や符号が違っています。
 
これは、Blenderの座標系が【図6】に示すように、上方向+Z、右方向+X、奥方向+Yになっていて、glTFファイルの上方向+Y、右方向+X、奥方向-Zと異なっているせいです。

imgP5_6
【図6】

Blenderの座標系も右手座標系であり、X軸周りに-90゜回転させればglTFファイルと一致するのですが、Blenderではそのような座標回転変換はしないで、あたかも上方向+Y、右方向+X、奥方向-ZとみなしてglTFファイルをエクスポートしているようです。
 
この結果、【図5】に示したようにBlenderのカメラ画面と同じ形状の画像がglTFファイルの表示画面に現れています。頂点カラーの位置で同じであることが分かります。
 
すなわち、glTFファイルをエクスポートする際に、Y位置とZ位置を入れ替えて、入れ替えた後のZ位置の符号を反転していると思われます。
 

rotation(視点回転)について

 
具体例1のglTFファイルのrotation値はクォータニオン(四元数)で表されていて(qx、qy、qz、qwとします)、
   qx=-0.209972992539406,
   qy=0.385779947042465,
   qz=0.090628445148468,
   qw=0.89379620552063
になっていました。
 
クォータニオンは4個のqx、qy、qz、qw値だけで回転変換を表すことができます。
   qx = λx・sinθ/2
   qy = λy・sinθ/2
   qz = λz・sinθ/2
   qw = cosθ/2
であり、λx、λy、λzはそれぞれXYZ回転軸の方向ベクトル、θは回転角です。
 
glTFファイルフォーマットには、クォータニオンはqx、qy、qz、qwの順で記載するとされています。
 
一方、このglTFファイルをエクスポートしたBlenderのカメラ設定は【図2】に示すように、
回転w=0.780
  x=0.484
  y=0.209
  z=0.337
となっていて値が一致しません。
 
これも、上記translationと同様に、Blenderの座標系が上方向+Z、右方向+X、奥方向+Yになっていて、glTFファイルの上方向+Y、右方向+X、奥方向-Zと異なっているせいです。
 
これを確かめるため、クォータニオンを回転行列に変換する式

imgP5_61

 
にBlenderのクォータニオン
  qw=0.780
  qx=0.484
  qy=0.209
  qz=0.337
を代入して回転行列を得て、これにY成分とZ成分を入れ替え、入れ替えた後のZ成分の符号を反転する下記行列

imgP5_62

 
を掛けると、得られる回転行列(M)は、

imgP5_63

 
になります。
 
この回転行列(M)の値を回転行列クォータニオンに戻す式(M00+M11+M22>0の場合)

imgP5_64

 
に代入すると、
  qw=0.894
  qx=-0.209
  qy=0.386
  qz=0.091
となって、上記glTFファイルのクォータニオンが得られます。
 
すなわち、rotation(視点回転)のデータも、glTFファイルをエクスポートする際に、Y位置とZ位置を入れ替えて、入れ替えた後のZ位置の符号を反転した値に変換されていることになります。
 

プロジェクション変換データ

 
プロジェクション変換データは、カメラ(視点)が3D物体のどの範囲を2D画像に変換するかを設定します。
 
glTFファイルフォーマットでは、
・Infinite perspective projection
・Finite perspective projection
・Orthographic projection
の3種類のプロジェクション変換が定められています。
 
perspective projectionは透視投影、Orthographic projectionは平行投影という日本語が用いられる場合が多いようなので、
それら3種類のプロジェクション変換は、無限透視投影、有限透視投影、平行投影とでも訳すのでしょうか?
 
これらのプロジェクション変換の式は、
・aspectRatio(アスペクト比)
・yfov(y画角)
・znear(z近点)
・zfar(z遠点)
のデータで構成されていて、
Infinite perspective projection(無限透視投影)の場合は、zfar(z遠点)を用いない仕様で、
Orthographic projection(平行投影)の場合は、aspectRatio(アスペクト比)とyfov(y画角)の代わりに"xmag"と"ymag"を用いる仕様になっています。
 
【図7】は通常のカメラの画角を示しています。
レンズが広角であれば広い画角範囲の被写体を撮影することができ、望遠であれば狭い画角範囲の被写体を撮影できます。
画角はカメラのセンサの大きさによっても変化します。

imgP5_7
【図7】

 
【図8】は典型的なプロジェクション変換を表す図です。
通常のカメラと同様に、ある画角範囲の3D物体のデータを取り込んで、2D画像を生成します。
その画角範囲は、カメラのセンサに相当する画面サイズを設定することで決定されます。
下記aspectRatio(アスペクト比)の項で説明します。
 
通常カメラと異なるのは、nearZと呼ばれる近点(glTFではznearという名になっている)からfarZと呼ばれる遠点(glTFではzfarという名になっている)までの範囲に制限されている点です。
 
またこの【図8】はglTFファイルの仕様上のFinite perspective projection(有限透視投影)を示しており、farZが無限遠になった場合にInfinite perspective projection(無限透視投影)の状態になります。

imgP5_8
【図8】

 
【図9】はOrthographic projection(平行投影)を表した図で、視点から3D物体が無限に離れた状態になっており、これは距離にかかわらず大きさが変化しないので、遠近感が不要な機械図面などで使われる投影方法です。

imgP5_9
【図9】

 
具体例1ではFinite perspective projection(有限透視投影)の形式になっていて、
そのglbファイルの中のプロジェクション変換データを示すカメラデータのみを取り出すと、
 
 "cameras": [
 {
  "name": "Camera",
  "perspective": {
   "aspectRatio":
       1.77777777777778,
   "yfov": 0.399596520463049,
   "zfar": 100,
   "znear": 0.100000001490116
  },
  "type": "perspective"
 }
 ],
となっています。
 

具体例2

具体例1の状態のままレンズデータだけを平行投影に変更して、glTF2.0(.glb)でエクスポートしました。
そのglbファイルの中のプロジェクション変換データを示すカメラデータのみを取り出すと、"nodes"の部分は具体例1と同じで、"cameras"の部分が下記のように変わっています。
 "cameras": [
 {
  "name": "Camera",
  "orthographic": {
   "xmag": 3.65714287757874,
   "ymag": 2.05714286863804,
   "zfar": 100,
   "znear": 0.100000001490116
  },
  "type": "orthographic"
 }
 ],
 
具体例2のBlenderのカメラ設定は【図10】のようになっていて、カメラ画面は【図11】のようになっています。
 

imgP5_10
【図10】
imgP5_11
【図11】

このglbファイルを【図5】と同様に、ビューアソフトであるglTF Viewerを使い、camera設定を[camera]にして表示させた例を【図12】に示します。
【図5】と比べて頂点を結ぶ線が平行になっていることが分かります。
 

imgP5_12
【図12】

 
 

aspectRatio(アスペクト比)について

 
aspectRatio(アスペクト比)は視野の縦横比であり、画面のwidth/heightで表します。
 
プロジェクション変換によって、ある画角範囲の3D物体のデータを取り込んで2D画像が生成されるのですが、その画角範囲はカメラのセンサに相当する画像サイズを定めねばなりません。
 
通常カメラは、センサとレンズによって被写体を「切り取る」ことによって2D画像を生成していますが、3DCGでは3D物体をプロジェクション変換によって2D画像を生成するので、画角を自在に設定して2D画像を取得できることになります。
このセンサと画角の関係は【図13】を見ると分かり易いと思います。
 
【図13】ではセンサ(横をw、縦をhで示す)が焦点距離(fで示す)の位置に置かれています。
無限遠を撮影しているような状態です。
実際にセンサが置かれているのではなく、そのセンサが置かれていると見なして画角を定めるということです。

imgP5_13
【図13】

 
 
具体例1では、glTFファイルで
"aspectRatio": 1.77777777777778
となっていました。
 
【図4】に示すBlenderのカメラ画面では16:9のアスペクト比になっています(Blenderのセンサーフィットでも確認できる)。
16/9=1.77777777777778であるので、そのカメラ画面のアスペクト比が反映されていることが分かります。
 
 

yfov(y画角)について

 
yfov(y画角)は縦方向の画角(単位ラジアン)を表します。
具体例1では、glTFファイルで
"yfov": 0.399596520463049
となっていました。
 
【図3】や【図10】に示すBlenderのレンズ設定ではサイズ36mmで焦点距離50mmになっています。
これは横36mmのセンササイズであることを示しています。
 
上記のようにアスペクト比16:9であると、縦サイズは36×9/16=20.25mmになります。
縦サイズの1/2と焦点距離のなす角の2倍がyfovになるので、
  2・arctan(20.25/2/50)
   =22.8952゜=0.3995965rad
となり、plTFファイルのyfov値と一致します。
 

znear(z近点)とzfar(z遠点)について

 
znear(z近点)はプロジェクション変換を行う3D物体の最も近い距離、zfar(z遠点)最も遠い距離を表します。
 
具体例1では、glTFファイルで
"znear": 0.100000001490116
"zfar": 100
となっていました。
 
【図3】や【図10】に示すBlenderのレンズ設定の範囲の開始0.1m、範囲の終了100mがそのznearとzfarに対応しています。
 

xmagとymagについて

 
平行投影の際に使用されるxmagは横方向の視野サイズの1/2、ymagは縦方向の視野サイズの1/2とされています。
 
具体例2では、glTFファイルで
"xmag": 3.65714287757874
"ymag": 2.05714286863804
となっていました。
 
【図10】に示すBlenderのレンズ設定では平行投影のスケールは7.314になっています。
その7.314の1/2が
  7.314/2=3.657
となりこれが"xmag"になっています。
縦方向はアスペクト比16:9であるので、
  3.657・9/16=2.057
となりこれが"ymag"になっています。
 
Blenderの平行投影のスケールが7.314になっている理由は不明でしたが、【図4】と【図11】を比較すると、平行投影の場合の大きさが透視投影の場合の大きさにほぼ合致しているので、透視投影の際のznearなどの距離におけるサイズに合うように計算されていると思われます。
 

おわりに

 

・今回はglTFファイルフォーマットのカメラデータを調べてみました。
 3D画像ファイルのカメラデータは、3D物体をあたかもカメラで撮影したように見せる(2D画像にする)データでありました。

 

・glTFファイルフォーマットのカメラデータについて、

・視点データとプロジェクション変換データで構成されている。
・視点データには、
 translationとrotation
の2つがある。
・プロジェクション変換データには、
有限透視投影の場合に、
 aspectRatio、yfov、znear、zfar
の4つがあり、
無限透視投影の場合に、
 aspectRatio、yfov、znear
の3つがあり、
平行投影の場合に、
 xmag、ymag、znear、zfar
の4つがある。
・視方向は、カメラ座標系の-Zc方向に定められている。

 などを学びました。

 

・glTFファイルの検討サンプルとしてBlenderのglTFエクスポートファイルを用いて、Blenderの設定値とそのglTFエクスポートファイルのデータとの対応を調べました。

・Blenderでカメラ撮影すると、glTFエクスポートファイルにその撮影データが保存される。
・BlenderではglTFファイルをエクスポートする際に、Y位置とZ位置を入れ替えて、入れ替えた後のZ位置の符号を反転している。
このため、Blenderのカメラ設定データとエクスポートされたglTFファイルのデータとの不一致が起こる。
・Blenderではセンサを指定する機能があり、センサ設定値でプロジェクション変換データを設定している。

 などを知ることができました。

 

・3D画像ファイルのカメラデータの役割については理解できましたが、その便利さについてはまだ実感できないでいます。
今後も調べていくことにします。

 

・3D画像ファイルの画像関連データについても更に探っていこうと思っています。

 
 

sub1title

closeicon

サンシャインブルー工房創設者、管理人の 青木ガンバロ と申します。
団塊世代の一技術者としてかつては開発業務に没頭しておりました。今はたそがれ期に入り、世間では簡単なことであっても、自分にとっては知らない、経験していないことが山ほどあると気付かされます。
限りある時間に、少しでもそういう未経験のテーマに挑戦してみようと思い、本工房を立ち上げることにしました。
 
いろいろな分野の学習を続けていると、何度も躓いてしまいます。素朴な疑問が湧いてくるのですが、その解答を得るのに手こずります。
膨大な情報の中から欲しい情報を探るのが難しくなっていると感じます。
 
技術を中心としたさまざまな課題を解きほぐし、より本質的な内容を明らかにすることによって、同じように学ぼうとする方々が、素早く答にたどり着けるような情報を発信していければと考えております。
 
このホームページもその挑戦の一つとして独学で制作してきました。
Web技術の多岐にわたる学習が必要であったり、関連する規格やツールなどの仕組みも進化して更新されていくので、最善解に近づくのは容易ではありません。
当初から躓きの連続でありましたが、多くの親切な方々の的確な記事にも助けられて進めてきました。
まだ多くの疑問点が残っております。逐次改善していくつもりです。
 
これまで多くの友人、先輩方の支えがあったお陰で何とか過ごしてくることができました。
人びとの繋がりの大切さを痛感しております。
どこまで頑張れるか分かりませんが、残る力を絞って進んでまいります。
これからも、皆さまのご援助、ご協力をよろしくお願い申し上げます。

sub2title

closeicon

2019-  4-16

・サンシャインブルー工房の個人事業開業

2022-12-22

・ホームページを公開

・ブログ「立方体に写真を貼り付けるツールを作りました」を公開

・ブログ「球体に写真を貼り付けるツールを作りました」を公開

2023-  2-  3

・ブログ「3DにおけるJPEGとは?」を公開

2023-  3-  1

・ブログ「3D画像ファイルの画像とは?」を公開

2023-  4-16

・ブログ「3D画像ファイルのカメラデータとは?」を公開

2023-  5-22

・ブログ「3D画像ファイルの点群とは?」を公開

2023-  6-28

・ブログ「3D画像ファイルのGeoTIFFとは?」を公開

2023-  7-28

・「役立つーる」ページを新設し、最初のオンラインツールGeoTIFFリーダーを公開

・ブログ「GeoTIFFリーダーを作りました」を公開

2023-  8-16

・ブログ「点群におけるLASとは?」を公開

2023-  9- 1

・ブログ「Googleアースに使われるKMLとは?」を公開

2024-  1-16

・ブログ「3D画像ファイルのアニメーションとは?」を公開

2024-  2- 8

・ブログ「ボーンアニメーションのオフセット行列とは?」を公開

2024-  7- 13

・ブログ「3D画像モデルの回転表示とは?」を公開

sub3title

closeicon






    皆さまからの、ご要望、ご依頼、ご質問、ご意見、ご提案などをお待ちしております。
    当方の事情や、お問い合わせの内容によりましては、返信を差し上げることができない場合もあります。あらかじめご了承ください。

    姓 例)日本

    名 例)太郎

    せい 例)にほん

    めい 例)たろう

    例)xxx@abcde.co,jp

    例)いろはに会社


     

    お問い合わせをいただき、ありがとうございます。

    messageOKこのお問い合わせの送信が完了しました。

    お問い合わせがエラーになりました。再度お試しください。

    messageNGこのお問い合わせの送信が失敗しました。

    sub4title

    closeicon
    1.著作権について
    当サイトは、お客さまご自身の画像が貼り付けられてダウンロードされた画像の情報を除き、当サイトに掲載されている、文章・画像・動画等の著作物の情報を無断転載することを禁止致します。
    当サイトは、ブラウザがFirefoxである場合に動画ファイルの生成のためにLPGLv3ライセンスのFFmpegライブラリを使用しています。
    2.リンクについて
    以下の場合を除き、当サイトを他のWebサイトに自由にリンクすることができます。
    (リンクをお断りするWebサイト)
    違法または反社会的な情報を提供するWebサイト
    当サイトの関係者や提供する情報に対して誹謗、中傷する内容を有するWebサイト
    当サイトであることが不明確であるWebサイト
    sub5title

    closeicon
    1.個人情報保護方針
    当サイトは、お客様からお預かりする個人情報の重要性個人情報の重要性を認識し、個人情報の保護に関する法律、その他の関係法令を遵守し、個人情報を安全かつ適切に取り扱います。
    2.個人情報の取得と利用目的
    個人情報を取得させていただくにあたっては、取得情報と利用目的を以下に定め、必要な個人情報のみを、適法かつ公正な手段により取得させていただきます。
     2.1.お問い合わせやご注文時の情報
    (取得情報)
    お客様ご自身によるお問い合わせやご依頼のための入力情報
    (利用目的)
    お客様へのご依頼に対応するため。
     2.2.ご利用履歴情報
    (取得情報)
    アクセス解析ツールGoogle Analyticsを用いた個人を特定しないトラフィックデータ
    (利用目的)
    ご利用状況の分析により当サイトの一層の改善や拡充を図るため
    このGoogle Analyticsの規約に関する詳細は、ここをクリックしてください。
     2.3.広告管理情報
    (取得情報)
    広告表示ツールGoogle AdSenseを用いた個人を特定しない広告管理データ
    (利用目的)
    お客様の興味に応じた商品やサービスの広告配信のため
    このGoogle AdSenseの規約に関する詳細は、ここをクリックしてください。
    3.個人情報の第三者への開示
    当サイトは、お客様からお預かりした個人情報を、個人情報保護法その他の法令に基づき開示が認められる場合、または、お客様からの同意を得た場合を除き、第三者に提供することはありません。
    4.クッキー(Cookie)について
    クッキー(Cookie)とは、当サイトにアクセスした際にお客様のブラウザに送信され、お客様のコンピューターに保存される情報のことです。
    当サイトでは、利用履歴の収集および広告の管理のためにそのクッキーを使用しています。
    当サイトが使用するクッキーのデータは、個人情報を含むものではありませんが、お客様がブラウザを操作することにより、クッキーの使用を制限(オプトアウト)することや、保存されたクッキーの情報を削除することも可能です。ただし、そのブラウザの設定によっては、当サイト一部の機能が使用できなくなる恐れがありますのでご注意ください。
    5.個人情報保護方針の変更
    当サイトは、法令の制定、改正等により、本個人情報保護方針を適宜見直し、予告なく変更する場合があります。本個人情報保護方針の変更は、変更後の内容が閲覧可能となった時点で有効になります。
    6.免責事項
    当サイトは、正確な情報を掲載するよう努めておりますが、誤情報の混入、情報の陳腐化が起こることがあります。当サイトに掲載された内容や、他のサイトに移動された場合の移動先サイトで提供される情報によって生じた損害等の一切の責任を負いかねますのでご了承ください。