Skip to content

tokoik/texture4

Repository files navigation

texture8 - テクスチャ:第8回 テクスチャの投影方向の変更 サンプルプログラム

1. 概要

このプログラムは、OpenGL における「テクスチャマッピング (Texture Mapping)」の基礎を学ぶための、学生向けのサンプルプログラムです。本プログラムは、以下のブログ記事の解説に沿って学習を進めるための雛形として提供されています。

今回はテクスチャマッピングにおいて、自動生成したテクスチャ座標を座標変換する仕組みについて学びます。

テクスチャ座標を自動生成する場合は、テクスチャ座標の座標値を明示的に保持しませんが、これに対しても変換行列を乗じて、座標変換を行うことができます。

プログラムを実行すると、表面にタイヤのパターン画像(tire.raw)が貼り付けられた2つの箱が表示され、そのテクスチャが自動で回転します。マウスのドラッグでテクスチャの投影方向を変更することができます。

テクスチャの投影方向の変更

2. ビルド方法

このプログラムは CMake を用いてビルドを構成しています。各プラットフォームごとの手順は以下の通りです。なお、プログラムをビルドするためのバイナリディレクトリは、バージョン管理ファイル(.gitignore)の設定に合わせて build という名前にします。

2.1 Windows (Visual Studio 2022 の場合)

  1. コマンドプロンプトまたは PowerShell を開き、このプロジェクトのディレクトリに移動します。

  2. 以下のコマンドを実行してビルドディレクトリを作成し、CMake で構成を行います。

mkdir build
cd build
cmake .. -G "Visual Studio 17 2022"
  1. 生成された build フォルダ内の texture4.sln を Visual Studio で開きます。

  2. ソリューションエクスプローラーで texture4 プロジェクトを右クリックし、「スタートアップ プロジェクトに設定」を選択します。

  3. 「ローカル Windows デバッガー」をクリックするか、F5 キーを押してビルドおよび実行します。

2.2 macOS (Xcode の場合)

  1. ターミナルを開き、このプロジェクトのディレクトリに移動します。

  2. 以下のコマンドを実行してビルドディレクトリを作成し、Xcode 用のプロジェクトを生成します。

mkdir build
cd build
cmake .. -G Xcode
  1. 生成された build/texture4.xcodeproj を Xcode で開きます。

  2. 左上のスキーム選択(再生ボタンの横)が texture4 になっていることを確認します。

  3. 「Run」ボタン(再生ボタン)をクリックするか、Command + R を押してビルドおよび実行します。

2.3 Ubuntu Linux

  1. ターミナルを開き、このプロジェクトのディレクトリに移動します。

  2. 必要なパッケージ(freeglut3-dev や pkg-config など)がインストールされていることを確認し、以下のコマンドでビルドします。

mkdir build
cd build
cmake ..
make

3. 使い方

3.1 プログラムの起動方法

各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.2 操作方法

  • マウスの左ボタンでドラッグ: オブジェクト自体ではなく、テクスチャの投影方向を3次元的に回転させることができます。

  • キーボードの q, Q または ESC キー: プログラムを終了します。

4. 解説

このプログラムは、視野空間(Eye Space)の座標系を利用してテクスチャ座標を自動生成し、さらにテクスチャ行列をマウス操作で変更することで、テクスチャの投影方向をインタラクティブに操作します。

4.1 視野空間におけるテクスチャ座標の自動生成 (init() 関数)

  • glTexGeni(, GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR) 前回の GL_OBJECT_LINEAR(オブジェクト空間=ローカル座標系)とは異なり、GL_EYE_LINEAR(視野空間=カメラから見た座標系)を指定しています。これにより、視点からスライドプロジェクターのようにテクスチャを投影する効果が得られます。

4.2 テクスチャ座標生成関数の設定タイミング (scene() 関数)

  • glTexGendv(, GL_S, GL_EYE_PLANE, genfunc[0]) 等の設定 GL_EYE_LINEAR を用いる場合、glTexGendv() を呼び出した時点での モデルビュー行列の逆行列genfunc のパラメータに乗算され、平面の方程式が視野空間に変換されて保持されます。 このため、display() 関数内で視点の移動(glTranslated( 0.0, 0.0, -5.0 ))を行った後の状態で、scene() 関数内で glTexGendv() を呼び出すことで、視点座標系に固定されたプロジェクターを構築しています。

4.3 テクスチャ行列による投影方向の操作 (display() 関数)

  • プロジェクターのシミュレーション (gluPerspective(), gluLookAt()) テクスチャ行列に対して gluPerspective()gluLookAt() を乗算することで、スライドプロジェクターの投影のような効果(パースペクティブな投影と投影位置・向きの指定)をテクスチャに与えています。
  • マウス操作(トラックボール)の適用先の変更 以前はモデルビュー行列に対して適用していた trackballRotation() を、テクスチャ行列 (GL_TEXTURE) の操作に適用するように変更しています。モデルビュー側のトラックボール処理はコメントアウトにより無効化されています。
  • これにより、マウスでドラッグすると物体そのものではなく、テクスチャ(投影される映像)の向きが回転します。

4.4 複数のオブジェクトに対する一括投影 (scene() 関数)

  • 左右に2つの箱 (box()) を配置して描画しています。
  • テクスチャがオブジェクトのローカル座標ではなく視野空間の座標に基づいて投影されるため、2つの箱をまたがるように1つのテクスチャ画像が投影されていることが確認できます。

About

テクスチャの投影方向の変更 サンプル プログラム

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors