多くのツールでは3D空間を上下左右にグリグリ回転させることができます。
今回はそのやり方です。
・マウスキャプチャ
マウスキャプチャとは、マウスの動きを感知する機構です。
マウスキャプチャをしないと、ウインドウの外にマウスが出てしまうと、
そのウインドウではマウスの動きかわからなくなってしまいます。
すると、ウインドウ内にある場合はWM_MOUSEMOVEイベント等の処理を実行できますが
ウインドウの外に出たとたんにイベントを感知できなくなります。
ウインドウの外に出てもマウスイベント処理をできるようにマウスキャプチャをするわけです。
マウスキャプチャは、
「SetCapture(ウインドウハンドル)」
という関数で開始し、
「ReleaseCapture()」
で終了します。
SetCapture()の引数にはウインドウハンドルを指定し、ReleaseCapture()の引数には何も指定しません。
・マウス移動量から角度を算出する
マウスをウインドウの端から端まで移動させたとき、OpenGL空間が1回転するものとし、
マウスの移動量を使ってOpenGL空間を回転させる角度を算出します。
計算式は以下です。
//X軸周りの回転角度
degX = 360.0 * (mouseMovePoint2.y - mouseMovePoint.y) / GLWINDOW_HEIGHT;
//Y軸周りの回転角度
degY = 360.0 * (mouseMovePoint.x - mouseMovePoint2.x) / GLWINDOW_WIDTH;
上記の通り、X軸周りの回転角度はy成分の移動量、Y軸周りの回転角度はx成分の移動量から算出します。
なお、OpenGLでは上方向にy成分が増加するので注意してください。
[ ソース ]
//マウス右が押された時
case WM_RBUTTONDOWN:
if(MOUSE_R_DOWN == FALSE && MOUSE_L_DOWN == FALSE)
{
WinDC = GetDC(hwnd);
wglMakeCurrent(WinDC, hRC); //OpenGLとの接続
MOUSE_R_DOWN = TRUE; //マウス左が押されたらTRUE
SetCapture(hwnd); //マウスキャプチャの開始
mouseMovePoint2.x = LOWORD(lParam);
mouseMovePoint2.y = HIWORD(lParam);
wglMakeCurrent(NULL, NULL);
ReleaseDC(hwnd, WinDC);
}
//マウスの移動に関する処理
case WM_MOUSEMOVE:
if(MOUSE_R_DOWN == TRUE) //マウス右が押されている時
{
mouseMovePoint.x = LOWORD(lParam);
mouseMovePoint.y = HIWORD(lParam);
//## 空間を回転させる処理 (OpenGLは上方向にyが増えるので注意)##
//ウインドウ上で、端から端までマウスが動いたら1回転と決め、
//回転角度を算出する
degX = 360.0 * (mouseMovePoint2.y - mouseMovePoint.y) / GLWINDOW_HEIGHT;
degY = 360.0 * (mouseMovePoint.x - mouseMovePoint2.x) / GLWINDOW_WIDTH;
//回転角度の更新
angleX -= degX;
angleY += degY;
//次のマウスムーブで、今回の座標を計算に使う
mouseMovePoint2 = mouseMovePoint;
InvalidateRect(hwnd, NULL, FALSE);
}
//マウス右を離した時
case WM_RBUTTONUP:
if(MOUSE_R_DOWN == TRUE)
{
MOUSE_R_DOWN = FALSE; //マウス左が離されたらFALSEに
ReleaseCapture(); //マウスキャプチャの終了
}
|