端的に言えば、fpsスタイルのカメラ用に、マウスの座標を読み取り、それらを回転に変換してから、いくつかの座標に変換するdllを開発しています。
問題は、マウスリーダーが非常に鈍感であるということです。マウスをゆっくり動かすと何も記録されませんが、非常に速く動かすと変更が記録されます。
今コード:
main.cpp
#define DLL_EXPORT
#define BOOST_THREAD_USE_DLL
#include "DLL\Viewport.h"
#include "MouseReader.h"
#include <boost\thread\thread.hpp>
#include <assert.h>
using namespace std;
#define PHI 3.141592653589
MouseListenerObject MouseListener;
double clax, clay, claz;
double Altitude, Azimuth;
bool IsActive;
static void CalcCLA_XYZ();
void FPSThread();
boost::thread *fpsstylethread;
void ViewportManagerObject::StartFPSStyle()
{
IsActive = true;
fpsstylethread = new boost::thread(&FPSThread);
assert(fpsstylethread->joinable());
}
void ViewportManagerObject::StopFPSStyle()
{
IsActive = false;
fpsstylethread->detach();
}
void FPSThread()
{
while(IsActive == true)
{
CalcCLA_XYZ();
}
}
vector<double> ViewportManagerObject::ReturnCLA_XYZ()
{
vector<double> returnval;
returnval.insert(returnval.begin(), clax);
returnval.insert(returnval.begin()+1, clay);
returnval.insert(returnval.begin()+2, claz);
return returnval;
}
void CalcCLA_XYZ()
{
MouseListener.ReadMouse();
vector<int> MouseCoordChange = MouseListener.Change;
bool hasoperated = false;
if (Azimuth + (MouseCoordChange[0] / 20) > 360)
{
Azimuth = (Azimuth + (MouseCoordChange[0] / 20)) - 360;
hasoperated = true;
}
if (Azimuth + (MouseCoordChange[0] / 20) < 0)
{
Azimuth = (Azimuth + (MouseCoordChange[0] / 20)) + 360;
hasoperated = true;
}
if (hasoperated == false)
{
Azimuth += (MouseCoordChange[0] / 20);
}
if (!((Altitude - (MouseCoordChange[1] / 20)) > 160) && !((Altitude - (MouseCoordChange[1] / 20)) < 5))
{
Altitude -= (MouseCoordChange[1] / 20);
}
clax = 1 * cos((Altitude/360)*(2*PHI)) * cos((Azimuth/360)*(2*PHI));
clay = 1 * sin((Altitude/360)*(2*PHI));
claz = 1 * cos((Altitude/360)*(2*PHI)) * sin((Azimuth/360)*(2*PHI));
}
MouseReader.h
#ifndef MR_H
#define MR_H
#include <Windows.h>
#include <vector>
using namespace std;
class MouseListenerObject
{
int newposx;
int newposy;
int oldposx;
int oldposy;
bool first;
public: vector<int> Change;
public: MouseListenerObject()
{
first = true;
}
public: void ReadMouse()
{
POINT MousePoint;
GetCursorPos(&MousePoint);
if (first != false)
{
oldposx = MousePoint.x;
oldposy = MousePoint.y;
first = false;
vector<int> nullvector;
nullvector.insert(nullvector.begin(), 0);
nullvector.insert(nullvector.begin() + 1, 0);
Change = nullvector;
return;
}
oldposx = newposx; // Lets make the previous values old...
oldposy = newposy;
newposx = MousePoint.x; // Update the new ones.
newposy = MousePoint.y;
int changex, changey; // Calc. the change and put it in a vector.
changex = newposx - oldposx;
changey = newposy - oldposy;
vector<int> returnval;
returnval.insert(returnval.begin(), changex);
returnval.insert(returnval.begin() + 1, changey);
Change = returnval;
}
};
#endif
Viewport.h
#ifndef CVP_H
#define CVP_H
#include <vector>
using namespace std;
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
class ViewportManagerObject
{
public:DECLDIR void StartFPSStyle();
public:DECLDIR void StopFPSStyle();
public:DECLDIR vector<double> ReturnCLA_XYZ();
};
#endif
投稿があまり有益ではないことをお詫び申し上げますが、私は時間に余裕がありませんでした。
何かあったら聞いてください。
ありがとうございました。