ホーム > プログラミング > モデルビューワを作る > 03.ピックOpenGLレンダラクラスを作る

03.ピックOpenGLレンダラクラスを作る



ピッキング(要素選択)に関する処理を担うピックOpenGLレンダラクラスを、トラックOpenGLレンダラクラスの派生クラスとして作成します。

プロジェクトを開く

02.で作成したモデルビューワプロジェクトを開きます。

トラックOpenGLレンダラクラスの作成

「メニュー/プロジェクト/クラスの追加」でクラス名「COpenGLRendererPick」のクラスを作成します。


テンプレート:C++ クラス
で追加ボタンを押します。


クラス名:COpenGLRendererPick
基本クラス:COpenGLRendererTrack
で完了ボタンを押します。

ビルドし、エラー、警告がないことを確認します。

メンバ変数、メンバ関数の宣言の追加

OpenGLRendererPick.h のピックOpenGLレンダラクラス定義の前に
名前列の大きさの定義
列挙型ERENDERMODEの定義
を追加します。
OpenGLRendererPick.h のピックOpenGLレンダラクラス定義にメンバ変数、メンバ関数の宣言を追加します。



ビルドし、エラー、警告がないことを確認します。

メンバ変数の初期化

OpenGLRendererPick.cpp のピックOpenGLレンダラクラスのコンストラクタにメンバ変数の初期化を追加します。



ビルドし、エラー、警告がないことを確認します。

RenderScene関数のオーバーライド

ベースOpenGLレンダラクラスの描画処理は要素ピックを考慮していません。
ピックOpenGLレンダラクラスに要素ピックを考慮した描画処理 RenderScene関数 をオーバーライドします。

OpenGLRendererPick.cpp の末尾にRenderScene関数の定義を追加します。さらにRenderScene関数で呼び出されるメンバ関数RenderObjects関数の定義を追加します。



OpenGLRendererBase.h のベースOpenGLレンダラクラスのメンバ関数
RenderScene
をprotected関数、さらにvirtual関数とします。



ビルドし、エラー、警告がないことを確認します。

DoPicking関数の追加、編集

OpenGLRendererPick.cpp の末尾に要素選択操作に関するメンバ関数の定義を追加します。



OpenGLRendererTrack.h のトラックOpenGLレンダラクラスのメンバ関数
SetupViewingFrustum
をprotected関数とします。



ビルドし、エラー、警告がないことを確認します。

レンダラオブジェクトのクラスの変更

ModelViewer.cpp の
#include "OpenGLRendererTrack.h"

#include "OpenGLRendererPick.h"
に、
COpenGLRendererTrack glrenderer;

COpenGLRendererPick glrenderer;
に変更します。



ビルドし、エラー、警告がないことを確認します。

マウス操作イベントハンドラの追加、編集

ModelViewer.cpp の WndProc関数に、以下のマウス操作ウィンドウメッセージ処理を追加します。

ウィンドウメッセージ名
WM_RBUTTONUP

ウィンドウズメッセージにレンダラメンバ関数の呼び出しを追加します。



ビルドし、エラー、警告がないことを確認します。

実行

右クリックにより要素をピックできること
点をピックすると、ピックした点の色がピンク色になり点の大きさが少し大きくなること
線をピックすると、ピックした線の色が水色になり線の太さが少し太くなること
面をピックすると、ピックした面の色が黄色になること
を確認します。

実行結果

ダウンロード

実行形式ファイルダウンロード (ModelViewerOpenGLWinAPI2008_03_exe.lzh)

ソースファイルダウンロード (ModelViewerOpenGLWinAPI2008_03_src.lzh)


ご意見、ご感想、ご質問、ご要望等は、「コメントを投稿する」もしくは「ホーム > コンタクト」よりお願いいたします。
内容の誤り、誤字脱字、リンクミスなどの問題点を発見された場合には「コメントを投稿する」もしくは「ホーム > コンタクト」より連絡していただけると幸いです。


Copyright (c) 2005-2016 Nobuki HIRAMINE All rights reserved.