このプログラムは、OpenGL における「テクスチャマッピング (Texture Mapping)」の基礎を学ぶための、学生向けのサンプルプログラムです。本プログラムは、以下のブログ記事の解説に沿って学習を進めるための雛形として提供されています。
今回はテクスチャマッピングにおいて、自動生成したテクスチャ座標を座標変換する仕組みについて学びます。
テクスチャ座標を自動生成する場合は、テクスチャ座標の座標値を明示的に保持しませんが、これに対しても変換行列を乗じて、座標変換を行うことができます。
プログラムを実行すると、表面にタイヤのパターン画像(tire.raw)が貼り付けられた2つの箱が表示され、そのテクスチャが自動で回転します。マウスのドラッグでテクスチャの投影方向を変更することができます。
このプログラムは CMake を用いてビルドを構成しています。各プラットフォームごとの手順は以下の通りです。なお、プログラムをビルドするためのバイナリディレクトリは、バージョン管理ファイル(.gitignore)の設定に合わせて build という名前にします。
-
コマンドプロンプトまたは PowerShell を開き、このプロジェクトのディレクトリに移動します。
-
以下のコマンドを実行してビルドディレクトリを作成し、CMake で構成を行います。
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"-
生成された build フォルダ内の texture4.sln を Visual Studio で開きます。
-
ソリューションエクスプローラーで texture4 プロジェクトを右クリックし、「スタートアップ プロジェクトに設定」を選択します。
-
「ローカル Windows デバッガー」をクリックするか、F5 キーを押してビルドおよび実行します。
-
ターミナルを開き、このプロジェクトのディレクトリに移動します。
-
以下のコマンドを実行してビルドディレクトリを作成し、Xcode 用のプロジェクトを生成します。
mkdir build
cd build
cmake .. -G Xcode-
生成された build/texture4.xcodeproj を Xcode で開きます。
-
左上のスキーム選択(再生ボタンの横)が texture4 になっていることを確認します。
-
「Run」ボタン(再生ボタン)をクリックするか、Command + R を押してビルドおよび実行します。
-
ターミナルを開き、このプロジェクトのディレクトリに移動します。
-
必要なパッケージ(freeglut3-dev や pkg-config など)がインストールされていることを確認し、以下のコマンドでビルドします。
mkdir build
cd build
cmake ..
make各OSとも、ビルド後に生成されるバイナリディレクトリ (build) やそのサブフォルダから起動します。(※ CMake の設定により、Windows や Xcode では Debug などのフォルダ下に実行ファイルが置かれることがあります)
- Windows
Visual Studio 上で「ローカル Windows デバッガー」をクリックして実行するか、またはコマンドプロンプトから以下のコマンドで起動します。
cd build\Debug
texture4.exe- macOS
Xcode 上で左上の「Run(再生ボタン)」をクリックするのが楽です。これにより texture4.app アプリケーションバンドルとして自動的に実行されます。アプリケーションバンドルを直接起動するなら、Finder から build/Debug/texture4.app をダブルクリックするか、ターミナルから open build/Debug/texture4.app を実行します (この場合はエラーメッセージ等が表示されません)。
- Ubuntu Linux
ターミナルから以下のコマンドで実行ファイル(バイナリ)を直接起動します。
cd build
./texture4-
マウスの左ボタンでドラッグ: オブジェクト自体ではなく、テクスチャの投影方向を3次元的に回転させることができます。
-
キーボードの q, Q または ESC キー: プログラムを終了します。
このプログラムは、視野空間(Eye Space)の座標系を利用してテクスチャ座標を自動生成し、さらにテクスチャ行列をマウス操作で変更することで、テクスチャの投影方向をインタラクティブに操作します。
glTexGeni(,GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR)前回のGL_OBJECT_LINEAR(オブジェクト空間=ローカル座標系)とは異なり、GL_EYE_LINEAR(視野空間=カメラから見た座標系)を指定しています。これにより、視点からスライドプロジェクターのようにテクスチャを投影する効果が得られます。
glTexGendv(,GL_S,GL_EYE_PLANE,genfunc[0])等の設定GL_EYE_LINEARを用いる場合、glTexGendv()を呼び出した時点での モデルビュー行列の逆行列 がgenfuncのパラメータに乗算され、平面の方程式が視野空間に変換されて保持されます。 このため、display()関数内で視点の移動(glTranslated(0.0, 0.0, -5.0))を行った後の状態で、scene()関数内でglTexGendv()を呼び出すことで、視点座標系に固定されたプロジェクターを構築しています。
- プロジェクターのシミュレーション (
gluPerspective(),gluLookAt()) テクスチャ行列に対してgluPerspective()とgluLookAt()を乗算することで、スライドプロジェクターの投影のような効果(パースペクティブな投影と投影位置・向きの指定)をテクスチャに与えています。 - マウス操作(トラックボール)の適用先の変更
以前はモデルビュー行列に対して適用していた
trackballRotation()を、テクスチャ行列 (GL_TEXTURE) の操作に適用するように変更しています。モデルビュー側のトラックボール処理はコメントアウトにより無効化されています。 - これにより、マウスでドラッグすると物体そのものではなく、テクスチャ(投影される映像)の向きが回転します。
- 左右に2つの箱 (
box()) を配置して描画しています。 - テクスチャがオブジェクトのローカル座標ではなく視野空間の座標に基づいて投影されるため、2つの箱をまたがるように1つのテクスチャ画像が投影されていることが確認できます。
