void MenuScreen::input() { int ClickX, ClickY, Button; if (GetMouseInputLog(&Button, &ClickX, &ClickY, TRUE) == 0) { if ((Button & MOUSE_INPUT_LEFT) != 0) { if (botan[2]->isTouched(ClickX, ClickY)) { *screenMode = 1; *mode = 2; } } } }
void CameraWorkManager::Update_RotateCamOnGazePoint( double timeslice ) { static const double DrugMoveScale=0.005; // ドラッグ量に対する視点の移動量のパラメータ static Vector2D ScreenDrugStartPoint; // マウスでドラッグを開始したスクリーン上の座標を格納 static Vector2D SavedCamDist; // マウスでドラッグを開始したときの、m_dTilt、m_dHead を保持 static bool nowDruging=false; // 今ドラッグ中か? // キー入力から、m_dTilt と m_dHead を更新 //getKeyInput(); // スクロール操作から、カメラと注視点の距離を更新 getMouseWheelInput(timeslice); // マウスによるドラッグ操作により、m_dTilt と m_dHead を更新 if( nowDruging ) { // 今ドラッグ中 // ドラッグ終了したかを判定 if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) == 0 ) { // ドラッグ終了 nowDruging = false; } else { // 今のマウス位置を取得 Point2D pos; GetMousePoint( &(pos.x) , &(pos.y) ); Vector2D CurMousePos( (double)pos.x, (double)pos.y); // m_dTilt と m_dHead を更新 Vector2D NewCamDist = -DrugMoveScale*(CurMousePos-ScreenDrugStartPoint)+SavedCamDist; m_dTilt = NewCamDist.y; m_dHead = NewCamDist.x; } } else { // ドラッグ中でない // ドラッグ開始したかを判定 int button; Point2D pos; if( GetMouseInputLog( &button, &pos.x, &pos.y, TRUE )==0 && ( button & MOUSE_INPUT_LEFT ) != 0 ) { // ドラッグが開始された // ドラッグ開始時の マウス座標を ScreenDrugStartPoint に保持 ScreenDrugStartPoint = pos.toRealVector(); // ドラッグ開始時の m_dTilt、m_dHead の値を SavedCamDist に保持 SavedCamDist.y = m_dTilt; SavedCamDist.x = m_dHead; // ドラッグフラグを立てる nowDruging = true; } } // m_dHead と m_dTilt から、(GazingPointを原点とした)カメラの位置を計算する Vector3D Hedding3D( 1.0, 0, 0 ); Hedding3D = VTransform( Hedding3D.toVECTOR(), MGetRotZ( (float)m_dTilt ) ); // もしかしたら、マイナスにしないと駄目かも Hedding3D = VTransform( Hedding3D.toVECTOR(), MGetRotY( -1*(float)m_dHead ) ); Vector3D toCamPos3D = m_dCamDistFrmFP * Hedding3D ; // ### ビュー行列を生成を確認 // カメラの座標変換行列のz軸向き(=カメラの向き) Vector3D vViewBaseZ = -1 * Hedding3D; // カメラの座標変換行列のy軸向きを仮置き Vector3D vViewBaseY( 0.0, 1.0, 0.0 ); // カメラの座標変換行列のx軸向き(= y × z ) Vector3D vViewBaseX = VCross( vViewBaseY.toVECTOR(), vViewBaseZ.toVECTOR() ); vViewBaseX = vViewBaseX.normalize(); // カメラの座標変換行列のy軸向きを再調整 vViewBaseY = VCross( vViewBaseZ.toVECTOR(), vViewBaseX.toVECTOR() ); // 基底を組み合わせてカメラ座標変換行列(Entityローカル座標)を生成 MATRIX MCamTransMatLocal = MGetAxis1( //MakeMatrixFromBaseVec( vViewBaseX.toVECTOR(), vViewBaseY.toVECTOR(), vViewBaseZ.toVECTOR(), toCamPos3D.toVECTOR() ); MCamTransMatLocal.m[3][1] += m_TrgtHight; // Entity位置だけシフトしたものがワールド座標でのカメラ座標変換行列 MATRIX MCamTransMatWorld = MCamTransMatLocal; MCamTransMatWorld.m[3][0] += m_TargetPos.x; //MCamTransMatWorld.m[3][1] += m_TrgtHight; <- MCamTransMatLocal の段階でシフト MCamTransMatWorld.m[3][2] += m_TargetPos.z; // 逆行列がビュー行列 m_MViewLocal = MInverse( MCamTransMatLocal ); m_MViewWorld = MInverse( MCamTransMatWorld ); // 背景パノラマ球の描画に使用しているため m_vFinalCamPos を参照している m_vFinalCamPos = VTransform( Vector3D( 0,0,0 ).toVECTOR(), MCamTransMatWorld ); };