ひょんなことからOpenGLに手を出し、C、C++でGLUTを試した後、C#のOpenTKを導入し、矢張りOpenGLの基本をGLUTで学び直そうとしたことご高承の通りです。(「【OpenGL】3DグラフィックとGLUT」シリーズ)

 

そしてワールド、ローカルの三次元座標、ベクトル行列による座標変換、視点と視野、平行投影と透視投影を一応舐めて、立方体、正三角錐によるソリッド、ワイアー、照光、質感までやってきました。その総括として今回は本ブログの本筋であるBCCForm and BCCSkeltonとGLUTの18の基本図形を使って、「よりC++的に、よりGLUT的にデモプログラムを作ろう」というのがGlut_BCCの開発趣旨です。

 

実際にこれを開発したのは「【OpenGL】3DグラフィックとGLUT」シリーズに先立ちますが、Cベースでコンソールウィンドウを使うGLUTのオールドファッション性は嫌だったので、ウィンドウでGLUTを制御できないかと考えました。そしてその開発のプロセスは、

 

(1)GLUTのコントロールダイアログの雛形作成

(2)BCCSkeltonのよるプロトタイプの作成

解説:この段階では単にGLUTを使って動かした、というだけで、まだ「何を、どうすればよい」のかもわからない段階でした。(「X軸 、Y軸 、Z軸」とかスライダーで作っていますが、完全に的を外していましたね。)

 

(3)GLUTのクラス化

(4)コントロールダイアログの完成

解説:段々とOpenGLのことが分かってきたので、少しまともになりました。しかしこの段階でも画像が見えなかったり、視点がプリミティブの中に入ってしまったり、と色々と不具合があったのと照光や質感が未だ分かっていませんでした。

 

(5)テストランと不具合修正のループ

 

を経て、Version 1.0が出来ました。

解説:ダイアログコントロールのデータを反映するタイミングや照光、質感のデータが私にはとんと分からないのでウェブのサンプルを参考にする等、結構疲れましたね。

 

と、いうことで、

 

開発プロセスに沿って全部書くのは大変なので、Version 1.0の最終型を使って解説してゆきます。今回はリソースです。(リソースのIDファイルであるResGlut_BCC.hは省略します。)

 

【Glut_BCC.rc】

解説:リソースファイルはダイアログとアイコンだけですが、ダイアログのコントロールの数が多いので結構大変でした。但し特殊なコントロールは無く、↑のVersion 1.0のイメージと付き合わせて見てください。

 

//-----------------------------------------
//             BCCForm Ver 2.41
//    An Easy Resource Editor for BCC
//  Copyright (c) February 2002 by ysama
//-----------------------------------------

#include    "ResGlut_BCC.h"

//----------------------------------
// ダイアログ (IDD_GLUT)
//----------------------------------

IDD_GLUT DIALOG DISCARDABLE 0, 0, 294, 370
EXSTYLE WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_CENTER
CAPTION "Glut-BCC"
FONT 8, "MS 明朝"
{
 CONTROL "", IDC_SELOBJ, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | WS_VSCROLL, 12, 11, 170, 105
 CONTROL "色", IDC_COLOR, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 186, 11, 14, 14
 CONTROL "GL Window作成", IDC_CREATE, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, 214, 9, 74, 18
 CONTROL "eyeX", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 45, 21, 12
 CONTROL "0.0", IDC_EYEX, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 36, 41, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "eyeY", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 78, 45, 21, 12
 CONTROL "0.0", IDC_EYEY, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 102, 41, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "eyeZ", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 144, 45, 21, 12
 CONTROL "2.0", IDC_EYEZ, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 168, 41, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "面X", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 63, 21, 12
 CONTROL "0.0", IDC_PLANEX, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 36, 59, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "面Y", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 78, 63, 21, 12
 CONTROL "0.0", IDC_PLANEY, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 102, 59, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "面Z", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 144, 63, 21, 12
 CONTROL "0.0", IDC_PLANEZ, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 168, 59, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "upvX", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 82, 21, 12
 CONTROL "0.0", IDC_UPVX, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 36, 78, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "upvY", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 78, 82, 21, 12
 CONTROL "1.0", IDC_UPVY, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 102, 78, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "upvZ", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 144, 82, 21, 12
 CONTROL "0.0", IDC_UPVZ, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 168, 78, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "視点視野設定", IDC_SETLA, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | BS_PUSHBUTTON, 214, 55, 74, 18
 CONTROL "視点視野", 0, "BUTTON", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 3, 28, 205, 70
 CONTROL "", IDC_SELPROJ, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | CBS_DROPDOWNLIST | WS_VSCROLL, 12, 112, 170, 54
 CONTROL "視野角", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 134, 32, 12
 CONTROL "90.0", IDC_FOV, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 46, 130, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "縦横比", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 96, 134, 32, 12
 CONTROL "1.3", IDC_ASPECT, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 130, 130, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "前方距離", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 152, 32, 12
 CONTROL "1.0", IDC_NEAR, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 46, 148, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "後方距離", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 96, 152, 32, 12
 CONTROL "20.0", IDC_FAR, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 130, 148, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面左", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 174, 32, 12
 CONTROL "-1.0", IDC_LEFT, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 46, 170, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面右", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 96, 174, 32, 12
 CONTROL "1.0", IDC_RIGHT, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 130, 170, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面下", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 192, 32, 12
 CONTROL "-1.0", IDC_BOTTOM, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 46, 188, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面上", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 96, 192, 32, 12
 CONTROL "1.0", IDC_TOP, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 130, 188, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面奥", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 214, 32, 12
 CONTROL "-1.0", IDC_BACK, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 46, 210, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影面前", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 96, 214, 32, 12
 CONTROL "1.0", IDC_FRONT, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 130 210, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "投影設定", IDC_SETPROJ, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | BS_PUSHBUTTON, 214, 154, 74, 18
 CONTROL "投影", 0, "BUTTON", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 3, 102, 205, 130
 CONTROL "常時回転", IDC_ROTATE, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | BS_CHECKBOX | BS_RIGHTBUTTON, 226 244, 48, 12
 CONTROL "軸端X", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 250, 21, 12
 CONTROL "0.0", IDC_ENDX, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 36, 246, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "軸端Y", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 78, 250, 21, 12
 CONTROL "1.0", IDC_ENDY, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 102, 246, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "軸端Z", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 144, 250, 21, 12
 CONTROL "0.0", IDC_ENDZ, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 168, 246, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "", IDC_ANGLE, "MSCTLS_TRACKBAR32", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | TBS_AUTOTICKS | TBS_HORZ, 12, 274, 183, 18
 CONTROL "回転角", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_CENTER, 12, 266, 183, 9
 CONTROL "回転", 0, "BUTTON", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 3, 234, 205, 64

 CONTROL "照光効果", IDC_LIGHT, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | BS_CHECKBOX | BS_RIGHTBUTTON, 226 310, 48, 12
 CONTROL "光源X", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 316, 21, 12
 CONTROL "50.0", IDC_LIGHTX, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 36, 312, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "光源Y", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 78, 316, 21, 12
 CONTROL "50.0", IDC_LIGHTY, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 102, 312, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "光源Z", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 144, 316, 21, 12
 CONTROL "50.0", IDC_LIGHTZ, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | ES_AUTOHSCROLL | ES_RIGHT, 168, 312, 30, 14, WS_EX_CLIENTEDGE
 CONTROL "光反射属性", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 334, 42, 12
CONTROL "", IDC_SELLIGHT, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED | CBS_DROPDOWNLIST | WS_VSCROLL, 56, 330, 144, 54
 CONTROL "光源と照光", 0, "BUTTON", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 3, 300, 205, 64

 CONTROL "終了", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, 214, 345, 74, 18
}

//--------------------------
// イメージ(IDI_ICON)
//--------------------------

IDI_ICON    ICON    DISCARDABLE    "Icon.ico"

 

解説:アイコンはいつものことながら絵心がないので、こんなものしか作れませんでした。

 

次回はGlut_BCCを作る為に必要なGLUTの機能をクラス化した"CGLUT"クラス(CGLUT.h)を解説します。