# 3Dビューワー

## 概要

AR機能によって得られたマーカーとカメラの相対姿勢に基づき 入力画像の上に三次元モデル表示を行う部分です．

## 関連するソースファイル

- GtkView.{h,cpp}: 三次元ビューワー
- GLObject.{h,cpp}: 三次元オブジェクト管理
- HomogeneousTransformation.{h,cpp}: 同次座標変換管理

## 機能詳細

### 三次元ビューワー

### 三次元オブジェクト管理

#### GLObject

mARici-tenが管理する三次元オブジェクトは全てGLObjectクラスを継承します．

GLObjectクラスにはtranslate,rotate,glDraw関数が定義されています． translate,rotateは世界座標からのオブジェクトの相対姿勢を指定することで オブジェクト座標を決定することができます．

GLObject::glDraw()が表示の根幹となる関数です． GLObjectを継承した各クラスはglDrawに描画命令を記述します．

#### GLPolygon

GLPolygonクラスは三次元ポリゴンを取り扱うためのクラスです．

頂点情報と面情報の取り扱いについては， 頂点数n，面数m，マテリアルの切り替え数sとしたとき， 頂点は3xnのfloat配列， 面は3x(m+s)のint配列となっています 頂点には三次元点がそのまま格納されます． 面の情報は点のインデックスの組み合わせによりあらわされ， また三角形に限定されます． 同時に，後述するマテリアル情報の切り替えも格納されます． 具体的には，(-1,-1,t)という並びの面情報が来た場合， 以降はt番目のマテリアルを使用することになります．

法線については， 面法線と点法線を扱うことができます． モデルファイルにより与えられない場合，法線を計算させることができます．

    calcNormals(); // 面の情報から面法線を計算する
    calcVertexNormals(); // caclNormals()等で面法線を与えた後に点法線を計算する

#### GLMaterial

GLMaterialクラスはマテリアル情報（現在は色とテクスチャ）を取り扱うためのクラスです．

### 同次座標変換管理

同次座標変換による順運動学を記述するために必要な関数群です． mARici-tenの内部形式では右手座標系，列ベクトルによる表現となるため， DirectXの左手座標系，OpenGLの行ベクトル表現との間では変換をする必要があります．

目次へ