Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
8b414e7d
Commit
8b414e7d
authored
Sep 22, 2010
by
Lionel Heng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added some functionality to 3D View --Lionel
parent
5e22d5a8
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
619 additions
and
409 deletions
+619
-409
Q3DWidget.cc
src/ui/map3D/Q3DWidget.cc
+255
-245
Q3DWidget.h
src/ui/map3D/Q3DWidget.h
+123
-120
QMap3DWidget.cc
src/ui/map3D/QMap3DWidget.cc
+218
-43
QMap3DWidget.h
src/ui/map3D/QMap3DWidget.h
+23
-1
No files found.
src/ui/map3D/Q3DWidget.cc
View file @
8b414e7d
...
@@ -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.0
f
;
cameraPose
.
pan
=
0.0
f
;
cameraPose
.
tilt
=
180.0
f
;
cameraPose
.
tilt
=
180.0
f
;
cameraPose
.
distance
=
10.0
f
;
cameraPose
.
distance
=
10.0
f
;
cameraPose
.
xOffset
=
0.0
f
;
cameraPose
.
xOffset
=
0.0
f
;
cameraPose
.
yOffset
=
0.0
f
;
cameraPose
.
yOffset
=
0.0
f
;
cameraPose
.
zOffset
=
0.0
f
;
cameraPose
.
zOffset
=
0.0
f
;
cameraPose
.
xOffset2D
=
0.0
f
;
cameraPose
.
xOffset2D
=
0.0
f
;
cameraPose
.
yOffset2D
=
0.0
f
;
cameraPose
.
yOffset2D
=
0.0
f
;
cameraPose
.
rotation2D
=
0.0
f
;
cameraPose
.
rotation2D
=
0.0
f
;
cameraPose
.
zoom
=
1.0
f
;
cameraPose
.
zoom
=
1.0
f
;
cameraPose
.
warpX
=
1.0
f
;
cameraPose
.
warpX
=
1.0
f
;
cameraPose
.
warpY
=
1.0
f
;
cameraPose
.
warpY
=
1.0
f
;
cameraParams
.
zoomSensitivity
=
0.05
f
;
cameraParams
.
zoomSensitivity
=
0.05
f
;
cameraParams
.
rotateSensitivity
=
0.5
f
;
cameraParams
.
rotateSensitivity
=
0.5
f
;
cameraParams
.
moveSensitivity
=
0.001
f
;
cameraParams
.
moveSensitivity
=
0.001
f
;
cameraParams
.
minZoomRange
=
0.5
f
;
cameraParams
.
minZoomRange
=
0.5
f
;
cameraParams
.
cameraFov
=
30.0
f
;
cameraParams
.
cameraFov
=
30.0
f
;
cameraParams
.
minClipRange
=
1.0
f
;
cameraParams
.
minClipRange
=
1.0
f
;
cameraParams
.
maxClipRange
=
400.0
f
;
cameraParams
.
maxClipRange
=
400.0
f
;
cameraParams
.
zoomSensitivity2D
=
0.02
f
;
cameraParams
.
zoomSensitivity2D
=
0.02
f
;
cameraParams
.
rotateSensitivity2D
=
0.005
f
;
cameraParams
.
rotateSensitivity2D
=
0.005
f
;
cameraParams
.
moveSensitivity2D
=
1.0
f
;
cameraParams
.
moveSensitivity2D
=
1.0
f
;
}
}
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.0
f
/
requestedFps
)),
this
);
timer
.
start
(
static_cast
<
int
>
(
floorf
(
1000.0
f
/
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.0
f
;
cameraPose
.
xOffset
=
0.0
f
;
cameraPose
.
yOffset
=
0.0
f
;
cameraPose
.
yOffset
=
0.0
f
;
cameraPose
.
zOffset
=
0.0
f
;
cameraPose
.
zOffset
=
0.0
f
;
}
}
void
void
Q3DWidget
::
recenter2D
(
void
)
Q3DWidget
::
recenter2D
(
void
)
{
{
cameraPose
.
xOffset2D
=
0.0
f
;
cameraPose
.
xOffset2D
=
0.0
f
;
cameraPose
.
yOffset2D
=
0.0
f
;
cameraPose
.
yOffset2D
=
0.0
f
;
}
}
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.0
f
;
float
cx
=
windowWidth
/
2.0
f
;
float
cy
=
windowHeight
/
2.0
f
;
float
cy
=
windowHeight
/
2.0
f
;
float
pan
=
d2r
(
-
90.0
f
-
cameraPose
.
pan
);
float
pan
=
d2r
(
-
90.0
f
-
cameraPose
.
pan
);
float
tilt
=
d2r
(
90.0
f
-
cameraPose
.
tilt
);
float
tilt
=
d2r
(
90.0
f
-
cameraPose
.
tilt
);
float
d
=
cameraPose
.
distance
;
float
d
=
cameraPose
.
distance
;
float
f
=
cy
/
tanf
(
d2r
(
cameraParams
.
cameraFov
/
2.0
f
));
float
f
=
cy
/
tanf
(
d2r
(
cameraParams
.
cameraFov
/
2.0
f
));
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_c
oords
;
std
::
pair
<
float
,
float
>
sceneC
oords
;
scene_c
oords
.
first
=
px
*
cosf
(
pan
)
+
py
*
sinf
(
pan
)
+
cameraPose
.
xOffset
;
sceneC
oords
.
first
=
px
*
cosf
(
pan
)
+
py
*
sinf
(
pan
)
+
cameraPose
.
xOffset
;
scene_c
oords
.
second
=
-
px
*
sinf
(
pan
)
+
py
*
cosf
(
pan
)
+
cameraPose
.
yOffset
;
sceneC
oords
.
second
=
-
px
*
sinf
(
pan
)
+
py
*
cosf
(
pan
)
+
cameraPose
.
yOffset
;
return
scene_c
oords
;
return
sceneC
oords
;
}
}
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.0
f
)
/
cameraPose
.
zoom
;
float
dx
=
(
mouseX
-
windowWidth
/
2.0
f
)
/
cameraPose
.
zoom
;
float
dy
=
(
windowHeight
/
2.0
f
-
mouseY
)
/
cameraPose
.
zoom
;
float
dy
=
(
windowHeight
/
2.0
f
-
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.5
f
)
if
(
cameraPose
.
tilt
<
180.5
f
)
{
{
cameraPose
.
tilt
=
180.5
f
;
cameraPose
.
tilt
=
180.5
f
;
}
}
else
if
(
cameraPose
.
tilt
>
269.5
f
)
else
if
(
cameraPose
.
tilt
>
269.5
f
)
{
{
cameraPose
.
tilt
=
269.5
f
;
cameraPose
.
tilt
=
269.5
f
;
}
}
}
}
}
}
}
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.0
f
))
cameraPose
.
xOffset
+=
dx
*
cosf
(
d2r
(
cameraPose
.
pan
-
90.0
f
))
*
cameraParams
.
moveSensitivity
*
cameraPose
.
distance
;
*
cameraParams
.
moveSensitivity
*
cameraPose
.
distance
;
cameraPose
.
yOffset
+=
dx
*
sinf
(
d2r
(
cameraPose
.
pan
-
90.0
f
))
cameraPose
.
yOffset
+=
dx
*
sinf
(
d2r
(
cameraPose
.
pan
-
90.0
f
))
*
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
>
1e7
f
)
if
(
cameraPose
.
zoom
>
1e7
f
)
{
{
cameraPose
.
zoom
=
1e7
f
;
cameraPose
.
zoom
=
1e7
f
;
}
}
if
(
cameraPose
.
zoom
<
1e-7
f
)
if
(
cameraPose
.
zoom
<
1e-7
f
)
{
{
cameraPose
.
zoom
=
1e-7
f
;
cameraPose
.
zoom
=
1e-7
f
;
}
}
}
}
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.0
f
,
-
1.0
f
,
1.0
f
);
glScalef
(
-
1.0
f
,
-
1.0
f
,
1.0
f
);
}
}
float
float
Q3DWidget
::
r2d
(
float
angle
)
Q3DWidget
::
r2d
(
float
angle
)
{
{
return
angle
*
57.295779513082320876
f
;
return
angle
*
57.295779513082320876
f
;
}
}
float
float
Q3DWidget
::
d2r
(
float
angle
)
Q3DWidget
::
d2r
(
float
angle
)
{
{
return
angle
*
0.0174532925199432957692
f
;
return
angle
*
0.0174532925199432957692
f
;
}
}
void
void
Q3DWidget
::
initializeGL
(
void
)
Q3DWidget
::
initializeGL
(
void
)
{
{
float
lightAmbient
[]
=
{
0.0
f
,
0.0
f
,
0.0
f
,
0.0
f
};
float
lightAmbient
[]
=
{
0.0
f
,
0.0
f
,
0.0
f
,
0.0
f
};
float
lightDiffuse
[]
=
{
1.0
f
,
1.0
f
,
1.0
f
,
1.0
f
};
float
lightDiffuse
[]
=
{
1.0
f
,
1.0
f
,
1.0
f
,
1.0
f
};
float
lightSpecular
[]
=
{
1.0
f
,
1.0
f
,
1.0
f
,
1.0
f
};
float
lightSpecular
[]
=
{
1.0
f
,
1.0
f
,
1.0
f
,
1.0
f
};
float
lightPosition
[]
=
{
0.0
f
,
0.0
f
,
100.0
f
,
0.0
f
};
float
lightPosition
[]
=
{
0.0
f
,
0.0
f
,
100.0
f
,
0.0
f
};
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.0
f
,
glTranslatef
(
static_cast
<
float
>
(
windowWidth
)
/
2.0
f
,
static_cast
<
float
>
(
windowHeight
)
/
2.0
f
,
static_cast
<
float
>
(
windowHeight
)
/
2.0
f
,
0.0
f
);
0.0
f
);
glScalef
(
cameraPose
.
zoom
,
cameraPose
.
zoom
,
1.0
f
);
glScalef
(
cameraPose
.
zoom
,
cameraPose
.
zoom
,
1.0
f
);
glRotatef
(
r2d
(
cameraPose
.
rotation2D
),
0.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
r2d
(
cameraPose
.
rotation2D
),
0.0
f
,
0.0
f
,
1.0
f
);
glScalef
(
cameraPose
.
warpX
,
cameraPose
.
warpY
,
1.0
f
);
glScalef
(
cameraPose
.
warpX
,
cameraPose
.
warpY
,
1.0
f
);
glTranslatef
(
-
cameraPose
.
xOffset2D
,
-
cameraPose
.
yOffset2D
,
0.0
f
);
glTranslatef
(
-
cameraPose
.
xOffset2D
,
-
cameraPose
.
yOffset2D
,
0.0
f
);
}
}
// 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.0
f
,
0.0
f
,
0.0
f
,
0.0
f
);
glClearColor
(
0.0
f
,
0.0
f
,
0.0
f
,
0.0
f
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
);
glLineWidth
(
1.0
f
);
glLineWidth
(
1.0
f
);
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
}
}
src/ui/map3D/Q3DWidget.h
View file @
8b414e7d
...
@@ -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_f
ov
,
float
minClipRange
,
float
cameraF
ov
,
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
src/ui/map3D/QMap3DWidget.cc
View file @
8b414e7d
#include "QMap3DWidget.h"
#include "QMap3DWidget.h"
#include <FTGL/ftgl.h>
#include <FTGL/ftgl.h>
#include <Q
PushButton
>
#include <Q
CheckBox
>
#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.0
f
);
initialize
(
10
,
10
,
1000
,
900
,
10.0
f
);
setCameraParams
(
0.05
f
,
0.5
f
,
0.0
0
1
f
,
0.5
f
,
30.0
f
,
0.01
f
,
400.0
f
);
setCameraParams
(
0.05
f
,
0.5
f
,
0.01
f
,
0.5
f
,
30.0
f
,
0.01
f
,
400.0
f
);
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
::
ini
t
(
void
)
QMap3DWidget
::
buildLayou
t
(
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.0
f
,
1.0
f
,
1.0
f
);
cheetahModel
->
init
(
1.0
f
,
1.0
f
,
1.0
f
);
}
}
if
(
uas
==
NULL
)
float
robotX
=
0.0
f
,
robotY
=
0.0
f
,
robotZ
=
0.0
f
;
float
robotRoll
=
0.0
f
,
robotPitch
=
0.0
f
,
robotYaw
=
0.0
f
;
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.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
uas
->
getPitch
(),
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
uas
->
getRoll
(),
1.0
f
,
0.0
f
,
0.0
f
);
glLineWidth
(
3.0
f
);
glColor3f
(
0.0
f
,
1.0
f
,
0.0
f
);
glBegin
(
GL_LINES
);
glVertex3f
(
0.0
f
,
0.0
f
,
0.0
f
);
glVertex3f
(
0.3
f
,
0.0
f
,
0.0
f
);
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.0
f
,
0.0
f
,
0.0
f
,
0.5
f
);
glColor4f
(
0.0
f
,
0.0
f
,
0.0
f
,
0.5
f
);
glBegin
(
GL_POLYGON
);
glBegin
(
GL_POLYGON
);
glVertex2f
(
0.0
f
,
0.0
f
);
glVertex2f
(
0.0
f
,
0.0
f
);
glVertex2f
(
0.0
f
,
20
.0
f
);
glVertex2f
(
0.0
f
,
45
.0
f
);
glVertex2f
(
getWindowWidth
(),
20
.0
f
);
glVertex2f
(
getWindowWidth
(),
45
.0
f
);
glVertex2f
(
getWindowWidth
(),
0.0
f
);
glVertex2f
(
getWindowWidth
(),
0.0
f
);
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.0
f
,
1.0
f
,
1.0
f
);
glColor3f
(
1.0
f
,
1.0
f
,
1.0
f
);
glPushMatrix
();
glPushMatrix
();
glTranslatef
(
0.0
f
,
5
.0
f
,
0.0
f
);
glTranslatef
(
0.0
f
,
30
.0
f
,
0.0
f
);
for
(
int32_t
i
=
0
;
i
<
6
;
++
i
)
for
(
int32_t
i
=
0
;
i
<
6
;
++
i
)
{
{
glTranslatef
(
60.0
f
,
0.0
f
,
0.0
f
);
glTranslatef
(
60.0
f
,
0.0
f
,
0.0
f
);
...
@@ -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.0
f
,
0.0
f
,
1.0
f
);
glRotatef
(
pitch
,
0.0
f
,
1.0
f
,
0.0
f
);
glRotatef
(
roll
,
1.0
f
,
0.0
f
,
0.0
f
);
glLineWidth
(
3.0
f
);
glColor3f
(
0.0
f
,
1.0
f
,
0.0
f
);
glBegin
(
GL_LINES
);
glVertex3f
(
0.0
f
,
0.0
f
,
0.0
f
);
glVertex3f
(
0.3
f
,
0.0
f
,
0.0
f
);
glEnd
();
cheetahModel
->
draw
();
glPopMatrix
();
}
void
QMap3DWidget
::
drawGrid
(
void
)
{
float
radius
=
10.0
f
;
float
resolution
=
0.25
f
;
glPushMatrix
();
// draw a 20m x 20m grid with 0.25m resolution
glColor3f
(
0.5
f
,
0.5
f
,
0.5
f
);
for
(
float
i
=
-
radius
;
i
<=
radius
;
i
+=
resolution
)
{
if
(
fabsf
(
i
-
roundf
(
i
))
<
0.01
f
)
{
glLineWidth
(
2.0
f
);
}
else
{
glLineWidth
(
0.25
f
);
}
glBegin
(
GL_LINES
);
glVertex3f
(
i
,
-
radius
,
0.0
f
);
glVertex3f
(
i
,
radius
,
0.0
f
);
glVertex3f
(
-
radius
,
i
,
0.0
f
);
glVertex3f
(
radius
,
i
,
0.0
f
);
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.01
f
||
fabsf
(
y
-
trail
[
trail
.
size
()
-
1
].
y
)
>
0.01
f
||
fabsf
(
z
-
trail
[
trail
.
size
()
-
1
].
z
)
>
0.01
f
)
{
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.0
f
,
0.0
f
,
0.0
f
);
glLineWidth
(
1.0
f
);
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
();
}
src/ui/map3D/QMap3DWidget.h
View file @
8b414e7d
...
@@ -15,7 +15,7 @@ public:
...
@@ -15,7 +15,7 @@ public:
explicit
QMap3DWidget
(
QWidget
*
parent
);
explicit
QMap3DWidget
(
QWidget
*
parent
);
~
QMap3DWidget
();
~
QMap3DWidget
();
void
ini
t
(
void
);
void
buildLayou
t
(
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
;
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment