Commit 8b414e7d authored by Lionel Heng's avatar Lionel Heng

Added some functionality to 3D View --Lionel

parent 5e22d5a8
...@@ -28,34 +28,35 @@ Q3DWidget::Q3DWidget(QWidget* parent) ...@@ -28,34 +28,35 @@ Q3DWidget::Q3DWidget(QWidget* parent)
, _forceRedraw(false) , _forceRedraw(false)
, allow2DRotation(true) , allow2DRotation(true)
, limitCamera(false) , limitCamera(false)
, lockCamera(false)
, timerFunc(NULL) , timerFunc(NULL)
, timerFuncData(NULL) , timerFuncData(NULL)
{ {
cameraPose.state = IDLE; cameraPose.state = IDLE;
cameraPose.pan = 0.0f; cameraPose.pan = 0.0f;
cameraPose.tilt = 180.0f; cameraPose.tilt = 180.0f;
cameraPose.distance = 10.0f; cameraPose.distance = 10.0f;
cameraPose.xOffset = 0.0f; cameraPose.xOffset = 0.0f;
cameraPose.yOffset = 0.0f; cameraPose.yOffset = 0.0f;
cameraPose.zOffset = 0.0f; cameraPose.zOffset = 0.0f;
cameraPose.xOffset2D = 0.0f; cameraPose.xOffset2D = 0.0f;
cameraPose.yOffset2D = 0.0f; cameraPose.yOffset2D = 0.0f;
cameraPose.rotation2D = 0.0f; cameraPose.rotation2D = 0.0f;
cameraPose.zoom = 1.0f; cameraPose.zoom = 1.0f;
cameraPose.warpX = 1.0f; cameraPose.warpX = 1.0f;
cameraPose.warpY = 1.0f; cameraPose.warpY = 1.0f;
cameraParams.zoomSensitivity = 0.05f; cameraParams.zoomSensitivity = 0.05f;
cameraParams.rotateSensitivity = 0.5f; cameraParams.rotateSensitivity = 0.5f;
cameraParams.moveSensitivity = 0.001f; cameraParams.moveSensitivity = 0.001f;
cameraParams.minZoomRange = 0.5f; cameraParams.minZoomRange = 0.5f;
cameraParams.cameraFov = 30.0f; cameraParams.cameraFov = 30.0f;
cameraParams.minClipRange = 1.0f; cameraParams.minClipRange = 1.0f;
cameraParams.maxClipRange = 400.0f; cameraParams.maxClipRange = 400.0f;
cameraParams.zoomSensitivity2D = 0.02f; cameraParams.zoomSensitivity2D = 0.02f;
cameraParams.rotateSensitivity2D = 0.005f; cameraParams.rotateSensitivity2D = 0.005f;
cameraParams.moveSensitivity2D = 1.0f; cameraParams.moveSensitivity2D = 1.0f;
} }
Q3DWidget::~Q3DWidget() Q3DWidget::~Q3DWidget()
...@@ -67,17 +68,17 @@ void ...@@ -67,17 +68,17 @@ void
Q3DWidget::initialize(int32_t windowX, int32_t windowY, Q3DWidget::initialize(int32_t windowX, int32_t windowY,
int32_t windowWidth, int32_t windowHeight, float fps) int32_t windowWidth, int32_t windowHeight, float fps)
{ {
this->windowWidth = windowWidth; this->windowWidth = windowWidth;
this->windowHeight = windowHeight; this->windowHeight = windowHeight;
requestedFps = fps; requestedFps = fps;
resize(windowWidth, windowHeight); resize(windowWidth, windowHeight);
move(windowX, windowY); move(windowX, windowY);
timer.start(static_cast<int>(floorf(1000.0f / requestedFps)), this); timer.start(static_cast<int>(floorf(1000.0f / requestedFps)), this);
_is3D = true; _is3D = true;
} }
void void
...@@ -86,22 +87,28 @@ Q3DWidget::setCameraParams(float zoomSensitivity, float rotateSensitivity, ...@@ -86,22 +87,28 @@ Q3DWidget::setCameraParams(float zoomSensitivity, float rotateSensitivity,
float cameraFov, float minClipRange, float cameraFov, float minClipRange,
float maxClipRange) float maxClipRange)
{ {
cameraParams.zoomSensitivity = zoomSensitivity; cameraParams.zoomSensitivity = zoomSensitivity;
cameraParams.rotateSensitivity = rotateSensitivity; cameraParams.rotateSensitivity = rotateSensitivity;
cameraParams.moveSensitivity = moveSensitivity; cameraParams.moveSensitivity = moveSensitivity;
cameraParams.minZoomRange = minZoomRange; cameraParams.minZoomRange = minZoomRange;
cameraParams.cameraFov = cameraFov; cameraParams.cameraFov = cameraFov;
cameraParams.minClipRange = minClipRange; cameraParams.minClipRange = minClipRange;
cameraParams.maxClipRange = maxClipRange; cameraParams.maxClipRange = maxClipRange;
limitCamera = true; limitCamera = true;
_forceRedraw = true; _forceRedraw = true;
} }
void void
Q3DWidget::setCameraLimit(bool onoff) Q3DWidget::setCameraLimit(bool onoff)
{ {
limitCamera = onoff; limitCamera = onoff;
}
void
Q3DWidget::setCameraLock(bool onoff)
{
lockCamera = onoff;
} }
void void
...@@ -109,422 +116,425 @@ Q3DWidget::set2DCameraParams(float zoomSensitivity2D, ...@@ -109,422 +116,425 @@ Q3DWidget::set2DCameraParams(float zoomSensitivity2D,
float rotateSensitivity2D, float rotateSensitivity2D,
float moveSensitivity2D) float moveSensitivity2D)
{ {
cameraParams.zoomSensitivity2D = zoomSensitivity2D; cameraParams.zoomSensitivity2D = zoomSensitivity2D;
cameraParams.rotateSensitivity2D = rotateSensitivity2D; cameraParams.rotateSensitivity2D = rotateSensitivity2D;
cameraParams.moveSensitivity2D = moveSensitivity2D; cameraParams.moveSensitivity2D = moveSensitivity2D;
} }
void void
Q3DWidget::set3D(bool onoff) Q3DWidget::set3D(bool onoff)
{ {
_is3D = onoff; _is3D = onoff;
} }
bool bool
Q3DWidget::is3D(void) const Q3DWidget::is3D(void) const
{ {
return _is3D; return _is3D;
} }
void void
Q3DWidget::setInitialCameraPos(float pan, float tilt, float range, Q3DWidget::setInitialCameraPos(float pan, float tilt, float range,
float xOffset, float yOffset, float zOffset) float xOffset, float yOffset, float zOffset)
{ {
cameraPose.pan = pan; cameraPose.pan = pan;
cameraPose.tilt = tilt; cameraPose.tilt = tilt;
cameraPose.distance = range; cameraPose.distance = range;
cameraPose.xOffset = xOffset; cameraPose.xOffset = xOffset;
cameraPose.yOffset = yOffset; cameraPose.yOffset = yOffset;
cameraPose.zOffset = zOffset; cameraPose.zOffset = zOffset;
} }
void void
Q3DWidget::setInitial2DCameraPos(float xOffset, float yOffset, Q3DWidget::setInitial2DCameraPos(float xOffset, float yOffset,
float rotation, float zoom) float rotation, float zoom)
{ {
cameraPose.xOffset2D = xOffset; cameraPose.xOffset2D = xOffset;
cameraPose.yOffset2D = yOffset; cameraPose.yOffset2D = yOffset;
cameraPose.rotation2D = rotation; cameraPose.rotation2D = rotation;
cameraPose.zoom = zoom; cameraPose.zoom = zoom;
} }
void void
Q3DWidget::setCameraPose(const CameraPose& cameraPose) Q3DWidget::setCameraPose(const CameraPose& cameraPose)
{ {
this->cameraPose = cameraPose; this->cameraPose = cameraPose;
} }
CameraPose CameraPose
Q3DWidget::getCameraPose(void) const Q3DWidget::getCameraPose(void) const
{ {
return cameraPose; return cameraPose;
} }
void void
Q3DWidget::setDisplayFunc(DisplayFunc func, void* clientData) Q3DWidget::setDisplayFunc(DisplayFunc func, void* clientData)
{ {
userDisplayFunc = func; userDisplayFunc = func;
userDisplayFuncData = clientData; userDisplayFuncData = clientData;
} }
void void
Q3DWidget::setKeyboardFunc(KeyboardFunc func, void* clientData) Q3DWidget::setKeyboardFunc(KeyboardFunc func, void* clientData)
{ {
userKeyboardFunc = func; userKeyboardFunc = func;
userKeyboardFuncData = clientData; userKeyboardFuncData = clientData;
} }
void void
Q3DWidget::setMouseFunc(MouseFunc func, void* clientData) Q3DWidget::setMouseFunc(MouseFunc func, void* clientData)
{ {
userMouseFunc = func; userMouseFunc = func;
userMouseFuncData = clientData; userMouseFuncData = clientData;
} }
void void
Q3DWidget::setMotionFunc(MotionFunc func, void* clientData) Q3DWidget::setMotionFunc(MotionFunc func, void* clientData)
{ {
userMotionFunc = func; userMotionFunc = func;
userMotionFuncData = clientData; userMotionFuncData = clientData;
} }
void void
Q3DWidget::addTimerFunc(uint32_t msecs, void(*func)(void *), Q3DWidget::addTimerFunc(uint32_t msecs, void(*func)(void *),
void* clientData) void* clientData)
{ {
timerFunc = func; timerFunc = func;
timerFuncData = clientData; timerFuncData = clientData;
QTimer::singleShot(msecs, this, SLOT(userTimer())); QTimer::singleShot(msecs, this, SLOT(userTimer()));
} }
void void
Q3DWidget::userTimer(void) Q3DWidget::userTimer(void)
{ {
if (timerFunc) if (timerFunc)
{ {
timerFunc(timerFuncData); timerFunc(timerFuncData);
} }
} }
void void
Q3DWidget::forceRedraw(void) Q3DWidget::forceRedraw(void)
{ {
_forceRedraw = true; _forceRedraw = true;
} }
void void
Q3DWidget::set2DWarping(float warpX, float warpY) Q3DWidget::set2DWarping(float warpX, float warpY)
{ {
cameraPose.warpX = warpX; cameraPose.warpX = warpX;
cameraPose.warpY = warpY; cameraPose.warpY = warpY;
} }
void void
Q3DWidget::recenter(void) Q3DWidget::recenter(void)
{ {
cameraPose.xOffset = 0.0f; cameraPose.xOffset = 0.0f;
cameraPose.yOffset = 0.0f; cameraPose.yOffset = 0.0f;
cameraPose.zOffset = 0.0f; cameraPose.zOffset = 0.0f;
} }
void void
Q3DWidget::recenter2D(void) Q3DWidget::recenter2D(void)
{ {
cameraPose.xOffset2D = 0.0f; cameraPose.xOffset2D = 0.0f;
cameraPose.yOffset2D = 0.0f; cameraPose.yOffset2D = 0.0f;
} }
void void
Q3DWidget::set2DRotation(bool onoff) Q3DWidget::set2DRotation(bool onoff)
{ {
allow2DRotation = onoff; allow2DRotation = onoff;
} }
void void
Q3DWidget::setDisplayMode2D(void) Q3DWidget::setDisplayMode2D(void)
{ {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
glOrtho(0.0, static_cast<GLfloat>(getWindowWidth()), glOrtho(0.0, static_cast<GLfloat>(getWindowWidth()),
0.0, static_cast<GLfloat>(getWindowHeight()), 0.0, static_cast<GLfloat>(getWindowHeight()),
-10.0, 10.0); -10.0, 10.0);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
} }
std::pair<float,float> std::pair<float,float>
Q3DWidget::getPositionIn3DMode(int32_t mouseX, int32_t mouseY) Q3DWidget::getPositionIn3DMode(int32_t mouseX, int32_t mouseY)
{ {
float cx = windowWidth / 2.0f; float cx = windowWidth / 2.0f;
float cy = windowHeight / 2.0f; float cy = windowHeight / 2.0f;
float pan = d2r(-90.0f - cameraPose.pan); float pan = d2r(-90.0f - cameraPose.pan);
float tilt = d2r(90.0f - cameraPose.tilt); float tilt = d2r(90.0f - cameraPose.tilt);
float d = cameraPose.distance; float d = cameraPose.distance;
float f = cy / tanf(d2r(cameraParams.cameraFov / 2.0f)); float f = cy / tanf(d2r(cameraParams.cameraFov / 2.0f));
float px = (mouseX - cx) * cosf(tilt) * d / (cosf(tilt) * f + sinf(tilt) float px = (mouseX - cx) * cosf(tilt) * d / (cosf(tilt) * f + sinf(tilt)
* mouseY - sinf(tilt) * cy); * mouseY - sinf(tilt) * cy);
float py = -(mouseY - cy) * d / (cosf(tilt) * f + sinf(tilt) * mouseY float py = -(mouseY - cy) * d / (cosf(tilt) * f + sinf(tilt) * mouseY
- sinf(tilt) * cy); - sinf(tilt) * cy);
std::pair<float,float> scene_coords; std::pair<float,float> sceneCoords;
scene_coords.first = px * cosf(pan) + py * sinf(pan) + cameraPose.xOffset; sceneCoords.first = px * cosf(pan) + py * sinf(pan) + cameraPose.xOffset;
scene_coords.second = -px * sinf(pan) + py * cosf(pan) + cameraPose.yOffset; sceneCoords.second = -px * sinf(pan) + py * cosf(pan) + cameraPose.yOffset;
return scene_coords; return sceneCoords;
} }
std::pair<float,float> std::pair<float,float>
Q3DWidget::getPositionIn2DMode(int32_t mouseX, int32_t mouseY) Q3DWidget::getPositionIn2DMode(int32_t mouseX, int32_t mouseY)
{ {
float dx = (mouseX - windowWidth / 2.0f) / cameraPose.zoom; float dx = (mouseX - windowWidth / 2.0f) / cameraPose.zoom;
float dy = (windowHeight / 2.0f - mouseY) / cameraPose.zoom; float dy = (windowHeight / 2.0f - mouseY) / cameraPose.zoom;
float ctheta = cosf(-cameraPose.rotation2D); float ctheta = cosf(-cameraPose.rotation2D);
float stheta = sinf(-cameraPose.rotation2D); float stheta = sinf(-cameraPose.rotation2D);
std::pair<float,float> coords; std::pair<float,float> coords;
coords.first = cameraPose.xOffset2D + ctheta * dx - stheta * dy; coords.first = cameraPose.xOffset2D + ctheta * dx - stheta * dy;
coords.second = cameraPose.yOffset2D + stheta * dx + ctheta * dy; coords.second = cameraPose.yOffset2D + stheta * dx + ctheta * dy;
return coords; return coords;
} }
int int
Q3DWidget::getWindowWidth(void) Q3DWidget::getWindowWidth(void)
{ {
return windowWidth; return windowWidth;
} }
int int
Q3DWidget::getWindowHeight(void) Q3DWidget::getWindowHeight(void)
{ {
return windowHeight; return windowHeight;
} }
int int
Q3DWidget::getLastMouseX(void) Q3DWidget::getLastMouseX(void)
{ {
return lastMouseX; return lastMouseX;
} }
int int
Q3DWidget::getLastMouseY(void) Q3DWidget::getLastMouseY(void)
{ {
return lastMouseY; return lastMouseY;
} }
int int
Q3DWidget::getMouseX(void) Q3DWidget::getMouseX(void)
{ {
return mapFromGlobal(cursor().pos()).x(); return mapFromGlobal(cursor().pos()).x();
} }
int int
Q3DWidget::getMouseY(void) Q3DWidget::getMouseY(void)
{ {
return mapFromGlobal(cursor().pos()).y(); return mapFromGlobal(cursor().pos()).y();
} }
void void
Q3DWidget::rotateCamera(float dx, float dy) Q3DWidget::rotateCamera(float dx, float dy)
{ {
if (!lockCamera)
{
cameraPose.pan += dx * cameraParams.rotateSensitivity; cameraPose.pan += dx * cameraParams.rotateSensitivity;
cameraPose.tilt += dy * cameraParams.rotateSensitivity; cameraPose.tilt += dy * cameraParams.rotateSensitivity;
if (limitCamera) if (limitCamera)
{ {
if (cameraPose.tilt < 180.5f) if (cameraPose.tilt < 180.5f)
{ {
cameraPose.tilt = 180.5f; cameraPose.tilt = 180.5f;
} }
else if (cameraPose.tilt > 269.5f) else if (cameraPose.tilt > 269.5f)
{ {
cameraPose.tilt = 269.5f; cameraPose.tilt = 269.5f;
} }
} }
}
} }
void void
Q3DWidget::zoomCamera(float dy) Q3DWidget::zoomCamera(float dy)
{ {
cameraPose.distance -= cameraPose.distance -=
dy * cameraParams.zoomSensitivity * cameraPose.distance; dy * cameraParams.zoomSensitivity * cameraPose.distance;
if (cameraPose.distance < cameraParams.minZoomRange) if (cameraPose.distance < cameraParams.minZoomRange)
{ {
cameraPose.distance = cameraParams.minZoomRange; cameraPose.distance = cameraParams.minZoomRange;
} }
} }
void void
Q3DWidget::moveCamera(float dx, float dy) Q3DWidget::moveCamera(float dx, float dy)
{ {
cameraPose.xOffset += cameraPose.xOffset +=
-dy * cosf(d2r(cameraPose.pan)) * cameraParams.moveSensitivity -dy * cosf(d2r(cameraPose.pan)) * cameraParams.moveSensitivity
* cameraPose.distance; * cameraPose.distance;
cameraPose.yOffset += cameraPose.yOffset +=
-dy * sinf(d2r(cameraPose.pan)) * cameraParams.moveSensitivity -dy * sinf(d2r(cameraPose.pan)) * cameraParams.moveSensitivity
* cameraPose.distance; * cameraPose.distance;
cameraPose.xOffset += dx * cosf(d2r(cameraPose.pan - 90.0f)) cameraPose.xOffset += dx * cosf(d2r(cameraPose.pan - 90.0f))
* cameraParams.moveSensitivity * cameraPose.distance; * cameraParams.moveSensitivity * cameraPose.distance;
cameraPose.yOffset += dx * sinf(d2r(cameraPose.pan - 90.0f)) cameraPose.yOffset += dx * sinf(d2r(cameraPose.pan - 90.0f))
* cameraParams.moveSensitivity * cameraPose.distance; * cameraParams.moveSensitivity * cameraPose.distance;
} }
void void
Q3DWidget::rotateCamera2D(float dx) Q3DWidget::rotateCamera2D(float dx)
{ {
if (allow2DRotation) if (allow2DRotation)
{ {
cameraPose.rotation2D += dx * cameraParams.rotateSensitivity2D; cameraPose.rotation2D += dx * cameraParams.rotateSensitivity2D;
} }
} }
void void
Q3DWidget::zoomCamera2D(float dx) Q3DWidget::zoomCamera2D(float dx)
{ {
cameraPose.zoom += dx * cameraParams.zoomSensitivity2D * cameraPose.zoom; cameraPose.zoom += dx * cameraParams.zoomSensitivity2D * cameraPose.zoom;
if (cameraPose.zoom > 1e7f) if (cameraPose.zoom > 1e7f)
{ {
cameraPose.zoom = 1e7f; cameraPose.zoom = 1e7f;
} }
if (cameraPose.zoom < 1e-7f) if (cameraPose.zoom < 1e-7f)
{ {
cameraPose.zoom = 1e-7f; cameraPose.zoom = 1e-7f;
} }
} }
void void
Q3DWidget::moveCamera2D(float dx, float dy) Q3DWidget::moveCamera2D(float dx, float dy)
{ {
float scaledX = dx / cameraPose.zoom; float scaledX = dx / cameraPose.zoom;
float scaledY = dy / cameraPose.zoom; float scaledY = dy / cameraPose.zoom;
cameraPose.xOffset2D -= (scaledX * cosf(-cameraPose.rotation2D) cameraPose.xOffset2D -= (scaledX * cosf(-cameraPose.rotation2D)
+ scaledY * sinf(-cameraPose.rotation2D)) / cameraPose.warpX + scaledY * sinf(-cameraPose.rotation2D)) / cameraPose.warpX
* cameraParams.moveSensitivity2D; * cameraParams.moveSensitivity2D;
cameraPose.yOffset2D -= (scaledX * sinf(-cameraPose.rotation2D) cameraPose.yOffset2D -= (scaledX * sinf(-cameraPose.rotation2D)
- scaledY * cosf(-cameraPose.rotation2D)) / cameraPose.warpY - scaledY * cosf(-cameraPose.rotation2D)) / cameraPose.warpY
* cameraParams.moveSensitivity2D; * cameraParams.moveSensitivity2D;
} }
void Q3DWidget::switchTo3DMode(void) void Q3DWidget::switchTo3DMode(void)
{ {
// setup camera view // setup camera view
float cpan = d2r(cameraPose.pan); float cpan = d2r(cameraPose.pan);
float ctilt = d2r(cameraPose.tilt); float ctilt = d2r(cameraPose.tilt);
float cameraX = cameraPose.distance * cosf(cpan) * cosf(ctilt); float cameraX = cameraPose.distance * cosf(cpan) * cosf(ctilt);
float cameraY = cameraPose.distance * sinf(cpan) * cosf(ctilt); float cameraY = cameraPose.distance * sinf(cpan) * cosf(ctilt);
float cameraZ = cameraPose.distance * sinf(ctilt); float cameraZ = cameraPose.distance * sinf(ctilt);
setDisplayMode3D(); setDisplayMode3D();
glViewport(0, 0, static_cast<GLsizei>(windowWidth), glViewport(0, 0, static_cast<GLsizei>(windowWidth),
static_cast<GLsizei>(windowHeight)); static_cast<GLsizei>(windowHeight));
gluLookAt(cameraX + cameraPose.xOffset, cameraY + cameraPose.yOffset, gluLookAt(cameraX + cameraPose.xOffset, cameraY + cameraPose.yOffset,
cameraZ + cameraPose.zOffset, cameraPose.xOffset, cameraZ + cameraPose.zOffset, cameraPose.xOffset,
cameraPose.yOffset, cameraPose.zOffset, 0.0, 0.0, 1.0); cameraPose.yOffset, cameraPose.zOffset, 0.0, 0.0, 1.0);
} }
void void
Q3DWidget::setDisplayMode3D() Q3DWidget::setDisplayMode3D()
{ {
float aspect = static_cast<float>(getWindowWidth()) / float aspect = static_cast<float>(getWindowWidth()) /
static_cast<float>(getWindowHeight()); static_cast<float>(getWindowHeight());
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
gluPerspective(cameraParams.cameraFov, aspect, gluPerspective(cameraParams.cameraFov, aspect,
cameraParams.minClipRange, cameraParams.maxClipRange); cameraParams.minClipRange, cameraParams.maxClipRange);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
glScalef(-1.0f, -1.0f, 1.0f); glScalef(-1.0f, -1.0f, 1.0f);
} }
float float
Q3DWidget::r2d(float angle) Q3DWidget::r2d(float angle)
{ {
return angle * 57.295779513082320876f; return angle * 57.295779513082320876f;
} }
float float
Q3DWidget::d2r(float angle) Q3DWidget::d2r(float angle)
{ {
return angle * 0.0174532925199432957692f; return angle * 0.0174532925199432957692f;
} }
void void
Q3DWidget::initializeGL(void) Q3DWidget::initializeGL(void)
{ {
float lightAmbient[] = {0.0f, 0.0f, 0.0f, 0.0f}; float lightAmbient[] = {0.0f, 0.0f, 0.0f, 0.0f};
float lightDiffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; float lightDiffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
float lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f}; float lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f};
float lightPosition[] = {0.0f, 0.0f, 100.0f, 0.0f}; float lightPosition[] = {0.0f, 0.0f, 100.0f, 0.0f};
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
glEnable(GL_LIGHT0); glEnable(GL_LIGHT0);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glEnable(GL_NORMALIZE); glEnable(GL_NORMALIZE);
} }
void void
Q3DWidget::paintGL(void) Q3DWidget::paintGL(void)
{ {
if (_is3D) if (_is3D)
{ {
// setup camera view // setup camera view
switchTo3DMode(); switchTo3DMode();
} }
else else
{ {
setDisplayMode2D(); setDisplayMode2D();
// do camera control // do camera control
glTranslatef(static_cast<float>(windowWidth) / 2.0f, glTranslatef(static_cast<float>(windowWidth) / 2.0f,
static_cast<float>(windowHeight) / 2.0f, static_cast<float>(windowHeight) / 2.0f,
0.0f); 0.0f);
glScalef(cameraPose.zoom, cameraPose.zoom, 1.0f); glScalef(cameraPose.zoom, cameraPose.zoom, 1.0f);
glRotatef(r2d(cameraPose.rotation2D), 0.0f, 0.0f, 1.0f); glRotatef(r2d(cameraPose.rotation2D), 0.0f, 0.0f, 1.0f);
glScalef(cameraPose.warpX, cameraPose.warpY, 1.0f); glScalef(cameraPose.warpX, cameraPose.warpY, 1.0f);
glTranslatef(-cameraPose.xOffset2D, -cameraPose.yOffset2D, 0.0f); glTranslatef(-cameraPose.xOffset2D, -cameraPose.yOffset2D, 0.0f);
} }
// turn on smooth lines // turn on smooth lines
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLineWidth(1.0f); glLineWidth(1.0f);
if (userDisplayFunc) if (userDisplayFunc)
{ {
userDisplayFunc(userDisplayFuncData); userDisplayFunc(userDisplayFuncData);
} }
glFlush(); glFlush();
} }
void void
Q3DWidget::resizeGL(int32_t width, int32_t height) Q3DWidget::resizeGL(int32_t width, int32_t height)
{ {
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
windowWidth = width; windowWidth = width;
windowHeight = height; windowHeight = height;
if (_is3D) if (_is3D)
{ {
setDisplayMode3D(); setDisplayMode3D();
} }
else else
{ {
setDisplayMode2D(); setDisplayMode2D();
} }
} }
void void
...@@ -832,5 +842,5 @@ Q3DWidget::timerEvent(QTimerEvent* event) ...@@ -832,5 +842,5 @@ Q3DWidget::timerEvent(QTimerEvent* event)
void void
Q3DWidget::closeEvent(QCloseEvent *) Q3DWidget::closeEvent(QCloseEvent *)
{ {
// exit application // exit application
} }
...@@ -9,40 +9,40 @@ ...@@ -9,40 +9,40 @@
enum CameraState enum CameraState
{ {
IDLE = 0, IDLE = 0,
ROTATING = 1, ROTATING = 1,
MOVING = 2, MOVING = 2,
ZOOMING = 3 ZOOMING = 3
}; };
struct CameraPose struct CameraPose
{ {
CameraState state; CameraState state;
float pan, tilt, distance; float pan, tilt, distance;
float xOffset, yOffset, zOffset; float xOffset, yOffset, zOffset;
float xOffset2D, yOffset2D, rotation2D, zoom, warpX, warpY; float xOffset2D, yOffset2D, rotation2D, zoom, warpX, warpY;
}; };
struct CameraParams struct CameraParams
{ {
float zoomSensitivity; float zoomSensitivity;
float rotateSensitivity; float rotateSensitivity;
float moveSensitivity; float moveSensitivity;
float minZoomRange; float minZoomRange;
float cameraFov; float cameraFov;
float minClipRange; float minClipRange;
float maxClipRange; float maxClipRange;
float zoomSensitivity2D; float zoomSensitivity2D;
float rotateSensitivity2D; float rotateSensitivity2D;
float moveSensitivity2D; float moveSensitivity2D;
}; };
enum MouseState enum MouseState
{ {
MOUSE_STATE_UP = 0, MOUSE_STATE_UP = 0,
MOUSE_STATE_DOWN = 1 MOUSE_STATE_DOWN = 1
}; };
typedef void (*DisplayFunc)(void *); typedef void (*DisplayFunc)(void *);
...@@ -52,125 +52,128 @@ typedef void (*MotionFunc)(int32_t, int32_t, void *); ...@@ -52,125 +52,128 @@ typedef void (*MotionFunc)(int32_t, int32_t, void *);
class Q3DWidget: public QGLWidget class Q3DWidget: public QGLWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Q3DWidget(QWidget* parent); explicit Q3DWidget(QWidget* parent);
~Q3DWidget(); ~Q3DWidget();
void initialize(int32_t windowX, int32_t windowY, void initialize(int32_t windowX, int32_t windowY,
int32_t windowWidth, int32_t windowHeight, float fps); int32_t windowWidth, int32_t windowHeight, float fps);
void setCameraParams(float zoomSensitivity, float rotateSensitivity, void setCameraParams(float zoomSensitivity, float rotateSensitivity,
float moveSensitivity, float minZoomRange, float moveSensitivity, float minZoomRange,
float camera_fov, float minClipRange, float cameraFov, float minClipRange,
float maxClipRange); float maxClipRange);
void setCameraLimit(bool onoff); void setCameraLimit(bool onoff);
void setCameraLock(bool onoff);
void set2DCameraParams(float zoomSensitivity, void set2DCameraParams(float zoomSensitivity,
float rotateSensitivity, float rotateSensitivity,
float moveSensitivity); float moveSensitivity);
void set3D(bool onoff); void set3D(bool onoff);
bool is3D(void) const; bool is3D(void) const;
void setInitialCameraPos(float pan, float tilt, float range, void setInitialCameraPos(float pan, float tilt, float range,
float xOffset, float yOffset, float zOffset); float xOffset, float yOffset, float zOffset);
void setInitial2DCameraPos(float xOffset, float yOffset, void setInitial2DCameraPos(float xOffset, float yOffset,
float rotation, float zoom); float rotation, float zoom);
void setCameraPose(const CameraPose& cameraPose); void setCameraPose(const CameraPose& cameraPose);
CameraPose getCameraPose(void) const; CameraPose getCameraPose(void) const;
void setDisplayFunc(DisplayFunc func, void* clientData); void setDisplayFunc(DisplayFunc func, void* clientData);
void setKeyboardFunc(KeyboardFunc func, void* clientData); void setKeyboardFunc(KeyboardFunc func, void* clientData);
void setMouseFunc(MouseFunc func, void* clientData); void setMouseFunc(MouseFunc func, void* clientData);
void setMotionFunc(MotionFunc func, void* clientData); void setMotionFunc(MotionFunc func, void* clientData);
void addTimerFunc(uint32_t msecs, void(*func)(void *), void addTimerFunc(uint32_t msecs, void(*func)(void *),
void* clientData); void* clientData);
void forceRedraw(void); void forceRedraw(void);
void set2DWarping(float warpX, float warpY); void set2DWarping(float warpX, float warpY);
void recenter(void); void recenter(void);
void recenter2D(void); void recenter2D(void);
void set2DRotation(bool onoff); void set2DRotation(bool onoff);
void setDisplayMode2D(void); void setDisplayMode2D(void);
std::pair<float,float> getPositionIn3DMode(int32_t mouseX, std::pair<float,float> getPositionIn3DMode(int32_t mouseX,
int32_t mouseY); int32_t mouseY);
std::pair<float,float> getPositionIn2DMode(int32_t mouseX, std::pair<float,float> getPositionIn2DMode(int32_t mouseX,
int32_t mouseY); int32_t mouseY);
int32_t getWindowWidth(void); int32_t getWindowWidth(void);
int32_t getWindowHeight(void); int32_t getWindowHeight(void);
int32_t getLastMouseX(void); int32_t getLastMouseX(void);
int32_t getLastMouseY(void); int32_t getLastMouseY(void);
int32_t getMouseX(void); int32_t getMouseX(void);
int32_t getMouseY(void); int32_t getMouseY(void);
private Q_SLOTS: private Q_SLOTS:
void userTimer(void); void userTimer(void);
protected:
void rotateCamera(float dx, float dy);
void zoomCamera(float dy);
void moveCamera(float dx, float dy);
void rotateCamera2D(float dx);
void zoomCamera2D(float dx);
void moveCamera2D(float dx, float dy);
void switchTo3DMode(void);
void setDisplayMode3D(void);
float r2d(float angle);
float d2r(float angle);
private: private:
void rotateCamera(float dx, float dy); // QGLWidget events
void zoomCamera(float dy); void initializeGL(void);
void moveCamera(float dx, float dy); void paintGL(void);
void rotateCamera2D(float dx); void resizeGL(int32_t width, int32_t height);
void zoomCamera2D(float dx);
void moveCamera2D(float dx, float dy); // Qt events
void keyPressEvent(QKeyEvent* event);
void switchTo3DMode(void); void mousePressEvent(QMouseEvent* event);
void setDisplayMode3D(void); void mouseReleaseEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
float r2d(float angle); void wheelEvent(QWheelEvent *wheel);
float d2r(float angle); void timerEvent(QTimerEvent* event);
void closeEvent(QCloseEvent* event);
// QGLWidget events
void initializeGL(void); DisplayFunc userDisplayFunc;
void paintGL(void); KeyboardFunc userKeyboardFunc;
void resizeGL(int32_t width, int32_t height); MouseFunc userMouseFunc;
MotionFunc userMotionFunc;
// Qt events
void keyPressEvent(QKeyEvent* event); void* userDisplayFuncData;
void mousePressEvent(QMouseEvent* event); void* userKeyboardFuncData;
void mouseReleaseEvent(QMouseEvent* event); void* userMouseFuncData;
void mouseMoveEvent(QMouseEvent* event); void* userMotionFuncData;
void wheelEvent(QWheelEvent *wheel);
void timerEvent(QTimerEvent* event); int32_t windowWidth, windowHeight;
void closeEvent(QCloseEvent* event); float requestedFps;
CameraPose cameraPose;
DisplayFunc userDisplayFunc; int32_t lastMouseX, lastMouseY;
KeyboardFunc userKeyboardFunc;
MouseFunc userMouseFunc; bool _is3D;
MotionFunc userMotionFunc;
bool _forceRedraw;
void* userDisplayFuncData; bool allow2DRotation;
void* userKeyboardFuncData; bool limitCamera;
void* userMouseFuncData; bool lockCamera;
void* userMotionFuncData;
CameraParams cameraParams;
int32_t windowWidth, windowHeight;
float requestedFps; QBasicTimer timer;
CameraPose cameraPose;
int32_t lastMouseX, lastMouseY; void (*timerFunc)(void *);
void* timerFuncData;
bool _is3D;
bool _forceRedraw;
bool allow2DRotation;
bool limitCamera;
CameraParams cameraParams;
QBasicTimer timer;
void (*timerFunc)(void *);
void* timerFuncData;
}; };
#endif #endif
#include "QMap3DWidget.h" #include "QMap3DWidget.h"
#include <FTGL/ftgl.h> #include <FTGL/ftgl.h>
#include <QPushButton> #include <QCheckBox>
#include <sys/time.h> #include <sys/time.h>
#include "CheetahModel.h" #include "CheetahModel.h"
...@@ -12,30 +12,19 @@ QMap3DWidget::QMap3DWidget(QWidget* parent) ...@@ -12,30 +12,19 @@ QMap3DWidget::QMap3DWidget(QWidget* parent)
: Q3DWidget(parent) : Q3DWidget(parent)
, uas(NULL) , uas(NULL)
, lastRedrawTime(0.0) , lastRedrawTime(0.0)
, displayGrid(false)
, displayTrail(false)
, lockCamera(false)
{ {
setFocusPolicy(Qt::StrongFocus); setFocusPolicy(Qt::StrongFocus);
initialize(10, 10, 1000, 900, 10.0f); initialize(10, 10, 1000, 900, 10.0f);
setCameraParams(0.05f, 0.5f, 0.001f, 0.5f, 30.0f, 0.01f, 400.0f); setCameraParams(0.05f, 0.5f, 0.01f, 0.5f, 30.0f, 0.01f, 400.0f);
setDisplayFunc(display, this); setDisplayFunc(display, this);
addTimerFunc(100, timer, this); addTimerFunc(100, timer, this);
QPushButton* mapButton = new QPushButton(this); buildLayout();
mapButton->setText("Grid");
// display the MapControl in the application
QGridLayout* layout = new QGridLayout(this);
layout->setMargin(0);
layout->setSpacing(2);
//layout->addWidget(mc, 0, 0, 1, 2);
layout->addWidget(mapButton, 1, 0);
layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 1, 1);
layout->setRowStretch(0, 100);
layout->setRowStretch(1, 1);
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 50);
setLayout(layout);
font.reset(new FTTextureFont("images/Vera.ttf")); font.reset(new FTTextureFont("images/Vera.ttf"));
...@@ -49,9 +38,44 @@ QMap3DWidget::~QMap3DWidget() ...@@ -49,9 +38,44 @@ QMap3DWidget::~QMap3DWidget()
} }
void void
QMap3DWidget::init(void) QMap3DWidget::buildLayout(void)
{ {
QCheckBox* gridCheckBox = new QCheckBox(this);
gridCheckBox->setText("Grid");
gridCheckBox->setChecked(displayGrid);
QCheckBox* trailCheckBox = new QCheckBox(this);
trailCheckBox->setText("Trail");
trailCheckBox->setChecked(displayTrail);
QPushButton* recenterButton = new QPushButton(this);
recenterButton->setText("Recenter Camera");
QCheckBox* lockCameraCheckBox = new QCheckBox(this);
lockCameraCheckBox->setText("Lock Camera");
lockCameraCheckBox->setChecked(lockCamera);
QGridLayout* layout = new QGridLayout(this);
layout->setMargin(0);
layout->setSpacing(2);
//layout->addWidget(mc, 0, 0, 1, 2);
layout->addWidget(gridCheckBox, 1, 0);
layout->addWidget(trailCheckBox, 1, 1);
layout->addWidget(recenterButton, 1, 2);
layout->addWidget(lockCameraCheckBox, 1, 3);
layout->setRowStretch(0, 100);
layout->setRowStretch(1, 1);
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 50);
setLayout(layout);
connect(gridCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showGrid(int)));
connect(trailCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showTrail(int)));
connect(recenterButton, SIGNAL(clicked()), this, SLOT(recenterCamera()));
connect(lockCameraCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(toggleLockCamera(int)));
} }
void void
...@@ -70,11 +94,20 @@ QMap3DWidget::displayHandler(void) ...@@ -70,11 +94,20 @@ QMap3DWidget::displayHandler(void)
cheetahModel->init(1.0f, 1.0f, 1.0f); cheetahModel->init(1.0f, 1.0f, 1.0f);
} }
if (uas == NULL) float robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f;
float robotRoll = 0.0f, robotPitch = 0.0f, robotYaw = 0.0f;
if (uas != NULL)
{ {
return; robotX = uas->getLocalX();
robotY = uas->getLocalY();
robotZ = uas->getLocalZ();
robotRoll = uas->getRoll();
robotPitch = uas->getPitch();
robotYaw = uas->getYaw();
} }
setCameraLock(lockCamera);
// turn on smooth lines // turn on smooth lines
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
...@@ -86,48 +119,44 @@ QMap3DWidget::displayHandler(void) ...@@ -86,48 +119,44 @@ QMap3DWidget::displayHandler(void)
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
// draw Cheetah model // draw Cheetah model
glPushMatrix(); drawPlatform(robotRoll, robotPitch, robotYaw);
glRotatef(uas->getYaw(), 0.0f, 0.0f, 1.0f);
glRotatef(uas->getPitch(), 0.0f, 1.0f, 0.0f);
glRotatef(uas->getRoll(), 1.0f, 0.0f, 0.0f);
glLineWidth(3.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.3f, 0.0f, 0.0f);
glEnd();
cheetahModel->draw(); if (displayGrid)
{
drawGrid();
}
glPopMatrix(); if (displayTrail)
{
drawTrail(robotX, robotY, robotZ);
}
// switch to 2D
setDisplayMode2D(); setDisplayMode2D();
// display pose information // display pose information
glColor4f(0.0f, 0.0f, 0.0f, 0.5f); glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
glBegin(GL_POLYGON); glBegin(GL_POLYGON);
glVertex2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glVertex2f(0.0f, 20.0f); glVertex2f(0.0f, 45.0f);
glVertex2f(getWindowWidth(), 20.0f); glVertex2f(getWindowWidth(), 45.0f);
glVertex2f(getWindowWidth(), 0.0f); glVertex2f(getWindowWidth(), 0.0f);
glEnd(); glEnd();
char buffer[6][255]; char buffer[6][255];
sprintf(buffer[0], "x = %.2f", uas->getLocalX()); sprintf(buffer[0], "x = %.2f", robotX);
sprintf(buffer[1], "y = %.2f", uas->getLocalY()); sprintf(buffer[1], "y = %.2f", robotY);
sprintf(buffer[2], "z = %.2f", uas->getLocalZ()); sprintf(buffer[2], "z = %.2f", robotZ);
sprintf(buffer[3], "r = %.2f", uas->getRoll()); sprintf(buffer[3], "r = %.2f", robotRoll);
sprintf(buffer[4], "p = %.2f", uas->getPitch()); sprintf(buffer[4], "p = %.2f", robotPitch);
sprintf(buffer[5], "y = %.2f", uas->getYaw()); sprintf(buffer[5], "y = %.2f", robotYaw);
font->FaceSize(10); font->FaceSize(10);
glColor3f(1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f);
glPushMatrix(); glPushMatrix();
glTranslatef(0.0f, 5.0f, 0.0f); glTranslatef(0.0f, 30.0f, 0.0f);
for (int32_t i = 0; i < 6; ++i) for (int32_t i = 0; i < 6; ++i)
{ {
glTranslatef(60.0f, 0.0f, 0.0f); glTranslatef(60.0f, 0.0f, 0.0f);
...@@ -180,3 +209,149 @@ QMap3DWidget::getTime(void) const ...@@ -180,3 +209,149 @@ QMap3DWidget::getTime(void) const
return static_cast<double>(tv.tv_sec) + return static_cast<double>(tv.tv_sec) +
static_cast<double>(tv.tv_usec) / 1000000.0; static_cast<double>(tv.tv_usec) / 1000000.0;
} }
void
QMap3DWidget::showGrid(int32_t state)
{
if (state == Qt::Checked)
{
displayGrid = true;
}
else
{
displayGrid = false;
}
}
void
QMap3DWidget::showTrail(int32_t state)
{
if (state == Qt::Checked)
{
if (!displayTrail)
{
trail.clear();
}
displayTrail = true;
}
else
{
displayTrail = false;
}
}
void
QMap3DWidget::recenterCamera(void)
{
recenter();
}
void
QMap3DWidget::toggleLockCamera(int32_t state)
{
if (state == Qt::Checked)
{
lockCamera = true;
}
else
{
lockCamera = false;
}
}
void
QMap3DWidget::drawPlatform(float roll, float pitch, float yaw)
{
glPushMatrix();
glRotatef(yaw, 0.0f, 0.0f, 1.0f);
glRotatef(pitch, 0.0f, 1.0f, 0.0f);
glRotatef(roll, 1.0f, 0.0f, 0.0f);
glLineWidth(3.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.3f, 0.0f, 0.0f);
glEnd();
cheetahModel->draw();
glPopMatrix();
}
void
QMap3DWidget::drawGrid(void)
{
float radius = 10.0f;
float resolution = 0.25f;
glPushMatrix();
// draw a 20m x 20m grid with 0.25m resolution
glColor3f(0.5f, 0.5f, 0.5f);
for (float i = -radius; i <= radius; i += resolution)
{
if (fabsf(i - roundf(i)) < 0.01f)
{
glLineWidth(2.0f);
}
else
{
glLineWidth(0.25f);
}
glBegin(GL_LINES);
glVertex3f(i, -radius, 0.0f);
glVertex3f(i, radius, 0.0f);
glVertex3f(-radius, i, 0.0f);
glVertex3f(radius, i, 0.0f);
glEnd();
}
glPopMatrix();
}
void
QMap3DWidget::drawTrail(float x, float y, float z)
{
bool addToTrail = false;
if (trail.size() > 0)
{
if (fabsf(x - trail[trail.size() - 1].x) > 0.01f ||
fabsf(y - trail[trail.size() - 1].y) > 0.01f ||
fabsf(z - trail[trail.size() - 1].z) > 0.01f)
{
addToTrail = true;
}
}
else
{
addToTrail = true;
}
if (addToTrail)
{
Pose3D p = {x, y, z};
if (trail.size() == trail.capacity())
{
memcpy(trail.data(), trail.data() + 1,
(trail.size() - 1) * sizeof(Pose3D));
trail[trail.size() - 1] = p;
}
else
{
trail.append(p);
}
}
glColor3f(1.0f, 0.0f, 0.0f);
glLineWidth(1.0f);
glBegin(GL_LINE_STRIP);
for (int32_t i = 0; i < trail.size(); ++i)
{
glVertex3f(trail[i].x - x, trail[i].y - y, trail[i].z - z);
}
glEnd();
}
...@@ -15,7 +15,7 @@ public: ...@@ -15,7 +15,7 @@ public:
explicit QMap3DWidget(QWidget* parent); explicit QMap3DWidget(QWidget* parent);
~QMap3DWidget(); ~QMap3DWidget();
void init(void); void buildLayout(void);
static void display(void* clientData); static void display(void* clientData);
void displayHandler(void); void displayHandler(void);
...@@ -28,12 +28,34 @@ public: ...@@ -28,12 +28,34 @@ public:
public slots: public slots:
void setActiveUAS(UASInterface* uas); void setActiveUAS(UASInterface* uas);
private slots:
void showGrid(int state);
void showTrail(int state);
void recenterCamera(void);
void toggleLockCamera(int state);
protected: protected:
UASInterface* uas; UASInterface* uas;
private: private:
void drawPlatform(float roll, float pitch, float yaw);
void drawGrid(void);
void drawTrail(float x, float y, float z);
double lastRedrawTime; double lastRedrawTime;
bool displayGrid;
bool displayTrail;
bool lockCamera;
typedef struct
{
float x;
float y;
float z;
} Pose3D;
QVarLengthArray<Pose3D, 10000> trail;
QScopedPointer<CheetahModel> cheetahModel; QScopedPointer<CheetahModel> cheetahModel;
QScopedPointer<FTTextureFont> font; QScopedPointer<FTTextureFont> font;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment