Apollo 11.0
自动驾驶开放平台
SceneViewer类 参考

#include <scene_viewer.h>

类 SceneViewer 继承关系图:
SceneViewer 的协作图:

类

struct  TempRenderableObjGroup
 

Public 类型

enum  CameraType { TARGET , FREE }
 

Public 槽

void ChangeCameraType (int index)
 
void ResetCameraPosAttitude (void)
 
void UpdateCameraX (double x)
 
void UpdateCameraY (double Y)
 
void UpdateCameraZ (double Z)
 
void UpdateCameraYaw (double yawInDegrees)
 
void UpdateCameraPitch (double pitchInDegrees)
 
void UpdateCameraRoll (double rollInDegrees)
 
void set_sensitivity (float s)
 

信号

void CameraPosChanged (const QVector3D &pos)
 
void CameraAttitudeChanged (const QVector3D &attitude)
 

Public 成员函数

 SceneViewer (QWidget *parent=nullptr)
 
 ~SceneViewer ()
 
bool is_init (void) const
 
bool IsFreeCamera (void) const
 
bool AddTempRenderableObj (const std::string &tmpObjGroupName, RenderableObject *renderObj)
 
bool AddPermanentRenderObj (RenderableObject *obj)
 
void setTempObjGroupEnabled (const std::string &tmpObjGroupName, bool b)
 
const QVector3D & CameraPos (void) const
 
const QVector3D & CamerAttitude (void) const
 
float sensitivity (void) const
 
void AddNewShaderProg (const std::string &shaderProgName, const std::shared_ptr< QOpenGLShaderProgram > &newShaderProg)
 
std::shared_ptr< QOpenGLShaderProgram > FindShaderProg (const std::string &shaderProgName)
 

Protected 成员函数

void initializeGL () override
 
void resizeGL (int w, int h) override
 
void paintGL () override
 
void enterEvent (QEvent *event) override
 
void leaveEvent (QEvent *event) override
 
void mousePressEvent (QMouseEvent *mouseEvent) override
 
void mouseMoveEvent (QMouseEvent *mouseEvent) override
 
void mouseReleaseEvent (QMouseEvent *event) override
 
void wheelEvent (QWheelEvent *event) override
 

详细描述

在文件 scene_viewer.h 第 31 行定义.

成员枚举类型说明

◆ CameraType

枚举值
TARGET 
FREE 

在文件 scene_viewer.h 第 35 行定义.

35 {
36 TARGET,
37 FREE,
38 };

构造及析构函数说明

◆ SceneViewer()

SceneViewer::SceneViewer ( QWidget *  parent = nullptr)
explicit

在文件 scene_viewer.cc 第 47 行定义.

48 : QOpenGLWidget(parent),
49 QOpenGLFunctions(),
50 is_init_(false),
51 right_key_is_moved_(false),
52 sensitivity_(0.08f),
53 refreshTimer_(nullptr),
54 left_key_last_pos_(),
55 right_key_last_y_(0),
56 camera_dialog_(nullptr),
57 current_cameraPtr_(nullptr),
58 free_camera_(),
59 target_camera_(),
60 managed_shader_prog_(),
61 tmp_renderable_obj_list_(),
62 permanent_renderable_obj_list_() {
63 current_cameraPtr_ = &target_camera_;
64}

◆ ~SceneViewer()

SceneViewer::~SceneViewer ( )

在文件 scene_viewer.cc 第 66 行定义.

66 {
67 if (is_init_) {
68 is_init_ = false;
69
70 refreshTimer_->stop();
71 delete refreshTimer_;
72
73 makeCurrent();
74
75 auto iter = managed_shader_prog_.begin();
76 for (; iter != managed_shader_prog_.end(); ++iter) {
77 iter->second->destroyed();
78 iter->second.reset();
79 }
80
81 managed_shader_prog_.clear();
82
83 for (auto &iter : tmp_renderable_obj_list_) {
84 delete iter.second;
85 }
86
87 tmp_renderable_obj_list_.clear();
88
89 while (!permanent_renderable_obj_list_.isEmpty()) {
90 delete permanent_renderable_obj_list_.takeFirst();
91 }
92
93 doneCurrent();
94 }
95}

成员函数说明

◆ AddNewShaderProg()

void SceneViewer::AddNewShaderProg ( const std::string &  shaderProgName,
const std::shared_ptr< QOpenGLShaderProgram > &  newShaderProg 
)

在文件 scene_viewer.cc 第 127 行定义.

129 {
130 if (newShaderProg == nullptr) {
131 return;
132 }
133
134 auto iter = managed_shader_prog_.find(shaderProgName);
135 if (iter != managed_shader_prog_.end()) {
136 iter->second.reset();
137 }
138
139 QMatrix4x4 mvp = current_cameraPtr_->projection_matrix() *
140 current_cameraPtr_->model_view_matrix();
141
142 newShaderProg->bind();
143 newShaderProg->setUniformValue("mvp", mvp);
144 newShaderProg->release();
145
146 managed_shader_prog_[shaderProgName] = newShaderProg;
147}
const QMatrix4x4 & model_view_matrix(void) const
const QMatrix4x4 & projection_matrix(void) const

◆ AddPermanentRenderObj()

bool SceneViewer::AddPermanentRenderObj ( RenderableObject *  obj)
inline

在文件 scene_viewer.h 第 48 行定义.

48 {
49 if (obj && obj->haveShaderProgram() && is_init_) {
50 permanent_renderable_obj_list_.append(obj);
51 return true;
52 } else {
53 return false;
54 }
55 }
bool haveShaderProgram(void)

◆ AddTempRenderableObj()

bool SceneViewer::AddTempRenderableObj ( const std::string &  tmpObjGroupName,
RenderableObject *  renderObj 
)

在文件 scene_viewer.cc 第 105 行定义.

106 {
107 bool ret = false;
108 if (renderObj && renderObj->haveShaderProgram() && is_init_) {
109 auto iter = tmp_renderable_obj_list_.find(tmpObjGroupName);
110 if (iter == tmp_renderable_obj_list_.cend()) {
111 TempRenderableObjGroup *objGroup = new TempRenderableObjGroup();
112 if (objGroup) {
113 objGroup->append(renderObj);
114 tmp_renderable_obj_list_.insert(
115 std::make_pair(tmpObjGroupName, objGroup));
116 ret = true;
117 }
118 } else {
119 iter->second->objGroupList_.append(renderObj);
120 ret = true;
121 }
122 }
123
124 return ret;
125}

◆ CameraAttitudeChanged

void SceneViewer::CameraAttitudeChanged ( const QVector3D &  attitude)
signal

◆ CameraPos()

const QVector3D & SceneViewer::CameraPos ( void  ) const
inline

在文件 scene_viewer.h 第 59 行定义.

59 {
60 return current_cameraPtr_->position();
61 }
const QVector3D & position(void) const

◆ CameraPosChanged

void SceneViewer::CameraPosChanged ( const QVector3D &  pos)
signal

◆ CamerAttitude()

const QVector3D & SceneViewer::CamerAttitude ( void  ) const
inline

在文件 scene_viewer.h 第 62 行定义.

62 {
63 return current_cameraPtr_->attitude();
64 }
const QVector3D & attitude(void) const

◆ ChangeCameraType

void SceneViewer::ChangeCameraType ( int  index)
slot

在文件 scene_viewer.cc 第 223 行定义.

223 {
224 if (index < TARGET || index > FREE) {
225 return;
226 }
227 if (index == FREE) {
228 current_cameraPtr_ = &free_camera_;
229 } else {
230 current_cameraPtr_ = &target_camera_;
231 }
233}
void ResetCameraPosAttitude(void)

◆ enterEvent()

void SceneViewer::enterEvent ( QEvent *  event)
overrideprotected

在文件 scene_viewer.cc 第 326 行定义.

326 {
327 setCursor(Qt::SizeAllCursor);
328 QOpenGLWidget::enterEvent(event);
329}

◆ FindShaderProg()

std::shared_ptr< QOpenGLShaderProgram > SceneViewer::FindShaderProg ( const std::string &  shaderProgName)
inline

在文件 scene_viewer.h 第 72 行定义.

73 {
74 if (managed_shader_prog_.find(shaderProgName) !=
75 managed_shader_prog_.end()) {
76 return managed_shader_prog_[shaderProgName];
77 } else {
78 return std::shared_ptr<QOpenGLShaderProgram>();
79 }
80 }

◆ initializeGL()

void SceneViewer::initializeGL ( )
overrideprotected

在文件 scene_viewer.cc 第 149 行定义.

149 {
150 initializeOpenGLFunctions();
151
152 glPointSize(1.0f);
153 glEnable(GL_PROGRAM_POINT_SIZE);
154 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
155
156 refreshTimer_ = new QTimer(this);
157 if (!refreshTimer_) {
158 return;
159 }
160
161 refreshTimer_->setObjectName(tr("_refreshTimer"));
162 refreshTimer_->setInterval(40);
163 refreshTimer_->start();
164 connect(refreshTimer_, SIGNAL(timeout()), this, SLOT(repaint()));
165
166 free_camera_.SetUpProjection(45.0f, GLfloat(width()), GLfloat(height()));
167 target_camera_.SetUpProjection(45.0f, GLfloat(width()), GLfloat(height()));
169
170 is_init_ = true;
171}
void SetUpProjection(float fovInDegrees, float nearPlaneWidth, float nearPlaneHeight, float near=0.1f, float far=1000.f)
uint32_t height
Height of point cloud
uint32_t width
Width of point cloud

◆ is_init()

bool SceneViewer::is_init ( void  ) const
inline

在文件 scene_viewer.h 第 43 行定义.

43{ return is_init_; }

◆ IsFreeCamera()

bool SceneViewer::IsFreeCamera ( void  ) const
inline

在文件 scene_viewer.h 第 44 行定义.

44{ return current_cameraPtr_ == &free_camera_; }

◆ leaveEvent()

void SceneViewer::leaveEvent ( QEvent *  event)
overrideprotected

在文件 scene_viewer.cc 第 331 行定义.

331 {
332 unsetCursor();
333 QOpenGLWidget::leaveEvent(event);
334}

◆ mouseMoveEvent()

void SceneViewer::mouseMoveEvent ( QMouseEvent *  mouseEvent)
overrideprotected

在文件 scene_viewer.cc 第 347 行定义.

347 {
348 if (mouseEvent->buttons() == Qt::LeftButton) {
349 QPoint tmp = QCursor::pos();
350 QPoint dd = tmp - left_key_last_pos_;
351 left_key_last_pos_ = tmp;
352
353 float x = static_cast<float>(dd.x()) * sensitivity();
354 float y = static_cast<float>(dd.y()) * sensitivity();
355
356 if (IsFreeCamera()) {
357 free_camera_.Starfe(-x);
358 free_camera_.Lift(y);
359
360 emit CameraPosChanged(free_camera_.position());
361 } else {
362 x = target_camera_.yaw() - x;
363 y = target_camera_.pitch() - y;
364
365 if (x > 360.0f) {
366 x -= 360.0f;
367 }
368 if (x < -360.0f) {
369 x += 360.0f;
370 }
371
372 if (y > 90.0f) {
373 y = 90.0f;
374 }
375 if (y < -90.0f) {
376 y = 90.0f;
377 }
378
379 target_camera_.set_yaw(x);
380 target_camera_.set_pitch(y);
381
382 emit CameraAttitudeChanged(target_camera_.attitude());
383 }
384
385 goto _label1;
386 } else if (mouseEvent->buttons() == Qt::RightButton) {
387 right_key_is_moved_ = true;
388 if (IsFreeCamera()) {
389 {
390 float tmp = static_cast<float>(QCursor::pos().y());
391 float dd = right_key_last_y_ - tmp;
392 right_key_last_y_ = tmp;
393
394 float z = dd * sensitivity();
395
396 free_camera_.Walk(z);
397
398 emit CameraPosChanged(free_camera_.position());
399 }
400
401 _label1:
402 UpdateCameraWorld();
403 update();
404 }
405 }
406 QOpenGLWidget::mousePressEvent(mouseEvent);
407}
void set_yaw(float yInDegrees)
void set_pitch(float pInDegrees)
float pitch(void) const
float yaw(void) const
void Starfe(const float dt)
Definition free_camera.h:34
void Lift(const float dt)
Definition free_camera.h:35
void Walk(const float dt)
Definition free_camera.h:33
bool IsFreeCamera(void) const
void CameraAttitudeChanged(const QVector3D &attitude)
float sensitivity(void) const
void CameraPosChanged(const QVector3D &pos)

◆ mousePressEvent()

void SceneViewer::mousePressEvent ( QMouseEvent *  mouseEvent)
overrideprotected

在文件 scene_viewer.cc 第 336 行定义.

336 {
337 if (event->button() == Qt::LeftButton) {
338 left_key_last_pos_ = QCursor::pos();
339 } else if (event->button() == Qt::RightButton) {
340 right_key_is_moved_ = false;
341 right_key_last_y_ = static_cast<float>(QCursor::pos().y());
342 }
343
344 QOpenGLWidget::mousePressEvent(event);
345}

◆ mouseReleaseEvent()

void SceneViewer::mouseReleaseEvent ( QMouseEvent *  event)
overrideprotected

在文件 scene_viewer.cc 第 435 行定义.

435 {
436 if (!right_key_is_moved_ && event->button() == Qt::RightButton) {
437 if (camera_dialog_ == nullptr) {
438 camera_dialog_ = new SceneCameraDialog(this);
439 if (!camera_dialog_) {
440 QMessageBox::warning(this, tr("Error"),
441 tr("No Enough for creating Camera Dialog!!!"),
442 QMessageBox::Ok);
443 goto retLabel;
444 } else {
445 connect(camera_dialog_, SIGNAL(resetcamera()), this,
446 SLOT(ResetCameraPosAttitude()));
447 connect(camera_dialog_, SIGNAL(xValueChanged(double)), this,
448 SLOT(UpdateCameraX(double)));
449 connect(camera_dialog_, SIGNAL(yValueChanged(double)), this,
450 SLOT(UpdateCameraY(double)));
451 connect(camera_dialog_, SIGNAL(zValueChanged(double)), this,
452 SLOT(UpdateCameraZ(double)));
453 connect(camera_dialog_, SIGNAL(yawValueChanged(double)), this,
454 SLOT(UpdateCameraYaw(double)));
455 connect(camera_dialog_, SIGNAL(pitchValueChanged(double)), this,
456 SLOT(UpdateCameraPitch(double)));
457 connect(camera_dialog_, SIGNAL(rollValueChanged(double)), this,
458 SLOT(UpdateCameraRoll(double)));
459 connect(camera_dialog_, SIGNAL(cameraTypeChanged(int)), this,
460 SLOT(ChangeCameraType(int)));
461 connect(camera_dialog_, SIGNAL(sensitivityChanged(float)), this,
462 SLOT(set_sensitivity(float)));
463
464 connect(this, SIGNAL(CameraAttitudeChanged(QVector3D)), camera_dialog_,
465 SLOT(updateCameraAttitude(QVector3D)));
466 connect(this, SIGNAL(CameraPosChanged(QVector3D)), camera_dialog_,
467 SLOT(updateCameraPos(QVector3D)));
468 }
469 }
470 camera_dialog_->updateCameraPos(current_cameraPtr_->position());
471 camera_dialog_->updateCameraAttitude(current_cameraPtr_->attitude());
472
473 camera_dialog_->move(event->globalPos());
474 camera_dialog_->show();
475 }
476
477retLabel:
478 QOpenGLWidget::mouseReleaseEvent(event);
479}
void updateCameraPos(const QVector3D &)
void updateCameraAttitude(const QVector3D &)
void ChangeCameraType(int index)
void UpdateCameraY(double Y)
void UpdateCameraRoll(double rollInDegrees)
void UpdateCameraPitch(double pitchInDegrees)
void set_sensitivity(float s)
void UpdateCameraYaw(double yawInDegrees)
void UpdateCameraX(double x)
void UpdateCameraZ(double Z)

◆ paintGL()

void SceneViewer::paintGL ( )
overrideprotected

在文件 scene_viewer.cc 第 192 行定义.

192 {
193 if (is_init_) {
194 for (RenderableObject *item : permanent_renderable_obj_list_) {
195 if (item->Init()) {
196 item->Render();
197 }
198 }
199
200 for (auto &iter : tmp_renderable_obj_list_) {
201 if (!iter.second->isEmpty()) {
202 RenderableObject *lastItem = nullptr;
203
204 if (iter.second->isEnabled()) {
205 lastItem = iter.second->takeLast();
206 if (lastItem->Init()) {
207 lastItem->Render();
208 }
209 }
210
211 while (!iter.second->isEmpty()) {
212 delete iter.second->takeFirst();
213 }
214
215 if (lastItem) {
216 iter.second->append(lastItem);
217 }
218 }
219 }
220 }
221}
bool Init(std::shared_ptr< QOpenGLShaderProgram > &shaderProgram=NullRenderableObj)
void Render(const QMatrix4x4 *mvp=nullptr)

◆ ResetCameraPosAttitude

void SceneViewer::ResetCameraPosAttitude ( void  )
slot

在文件 scene_viewer.cc 第 235 行定义.

235 {
236 free_camera_.set_position(0.0f, 48.0f, -48.0f);
237 free_camera_.SetAttitude(0.0f, 45.0f, 0.0f);
238
239 target_camera_.set_position(-21.0f, 21.0f, 0.0f);
240 target_camera_.Rotate(-45.0f, -90.0f, 0.0f);
241 target_camera_.set_target_pos(0.0f, 0.0f, 0.0f);
242
243 emit CameraPosChanged(current_cameraPtr_->position());
244 emit CameraAttitudeChanged(current_cameraPtr_->attitude());
245
246 UpdateCameraWorld();
247}
void set_position(const QVector3D &pos)
void SetAttitude(float yawInDegrees, float pitchInDegrees, float rollInDegrees)
void Rotate(float xRotateDegrees, float yRotateDegrees, float zRotateDegrees)
void set_target_pos(float x, float y, float z)

◆ resizeGL()

void SceneViewer::resizeGL ( int  w,
int  h 
)
overrideprotected

在文件 scene_viewer.cc 第 173 行定义.

173 {
174 glViewport(0, 0, (GLsizei)width, (GLsizei)height);
175
176 if (is_init_) {
177 free_camera_.set_near_plane_width(GLfloat(width));
178 free_camera_.set_near_plane_height(GLfloat(height));
179 free_camera_.UpdateProjection();
180
181 target_camera_.set_near_plane_width(GLfloat(width));
182 target_camera_.set_near_plane_height(GLfloat(height));
183 target_camera_.UpdateProjection();
184
185 QMatrix4x4 mvp = current_cameraPtr_->projection_matrix() *
186 current_cameraPtr_->model_view_matrix();
187
188 UpdateAllShaderProgMVP(mvp);
189 }
190}
void set_near_plane_width(const float npWidth)
void UpdateProjection(void)
void set_near_plane_height(const float npHeight)

◆ sensitivity()

float SceneViewer::sensitivity ( void  ) const
inline

在文件 scene_viewer.h 第 66 行定义.

66{ return sensitivity_; }

◆ set_sensitivity

void SceneViewer::set_sensitivity ( float  s)
inlineslot

在文件 scene_viewer.h 第 100 行定义.

100{ sensitivity_ = s; }

◆ setTempObjGroupEnabled()

void SceneViewer::setTempObjGroupEnabled ( const std::string &  tmpObjGroupName,
bool  b 
)

在文件 scene_viewer.cc 第 97 行定义.

98 {
99 auto iter = tmp_renderable_obj_list_.find(tmpObjGroupName);
100 if (iter != tmp_renderable_obj_list_.cend()) {
101 iter->second->isEnabled_ = b;
102 }
103}

◆ UpdateCameraPitch

void SceneViewer::UpdateCameraPitch ( double  pitchInDegrees)
slot

在文件 scene_viewer.cc 第 280 行定义.

280 {
281 if (pitchInDegrees > 90.0) {
282 pitchInDegrees = 90.0;
283 }
284 if (pitchInDegrees < -90.0) {
285 pitchInDegrees = -90.0;
286 }
287
288 free_camera_.set_pitch(static_cast<float>(pitchInDegrees));
289 target_camera_.set_pitch(static_cast<float>(pitchInDegrees));
290 UpdateCameraWorld();
291}

◆ UpdateCameraRoll

void SceneViewer::UpdateCameraRoll ( double  rollInDegrees)
slot

在文件 scene_viewer.cc 第 292 行定义.

292 {
293 if (rollInDegrees > 360.0) {
294 rollInDegrees -= 360.0;
295 }
296 if (rollInDegrees < -360.0) {
297 rollInDegrees += 360.0;
298 }
299
300 free_camera_.set_roll(static_cast<float>(rollInDegrees));
301 free_camera_.set_roll(static_cast<float>(rollInDegrees));
302 UpdateCameraWorld();
303}
void set_roll(float rInDegrees)

◆ UpdateCameraX

void SceneViewer::UpdateCameraX ( double  x)
slot

在文件 scene_viewer.cc 第 249 行定义.

249 {
250 free_camera_.set_x(static_cast<float>(x));
251 target_camera_.set_x(static_cast<float>(x));
252 UpdateCameraWorld();
253}
void set_x(float x)

◆ UpdateCameraY

void SceneViewer::UpdateCameraY ( double  Y)
slot

在文件 scene_viewer.cc 第 255 行定义.

255 {
256 free_camera_.set_y(static_cast<float>(y));
257 target_camera_.set_y(static_cast<float>(y));
258 UpdateCameraWorld();
259}
void set_y(float y)

◆ UpdateCameraYaw

void SceneViewer::UpdateCameraYaw ( double  yawInDegrees)
slot

在文件 scene_viewer.cc 第 267 行定义.

267 {
268 if (yawInDegrees > 360.0) {
269 yawInDegrees -= 360.0;
270 }
271 if (yawInDegrees < -360.0) {
272 yawInDegrees += 360.0;
273 }
274
275 free_camera_.set_yaw(static_cast<float>(yawInDegrees));
276 target_camera_.set_yaw(static_cast<float>(yawInDegrees));
277 UpdateCameraWorld();
278}

◆ UpdateCameraZ

void SceneViewer::UpdateCameraZ ( double  Z)
slot

在文件 scene_viewer.cc 第 261 行定义.

261 {
262 free_camera_.set_z(static_cast<float>(z));
263 target_camera_.set_y(static_cast<float>(z));
264 UpdateCameraWorld();
265}
void set_z(float z)

◆ wheelEvent()

void SceneViewer::wheelEvent ( QWheelEvent *  event)
overrideprotected

在文件 scene_viewer.cc 第 409 行定义.

409 {
410 float delta = static_cast<float>(event->angleDelta().y());
411 delta *= sensitivity();
412
413 target_camera_.set_distance(target_camera_.distance() + delta);
414
415 delta += free_camera_.pitch();
416 if (delta > 90.0f) {
417 delta = 90.0f;
418 }
419 if (delta < -90.0f) {
420 delta = -90.0f;
421 }
422 free_camera_.set_pitch(delta);
423
424 if (IsFreeCamera()) {
425 emit CameraAttitudeChanged(free_camera_.attitude());
426 } else {
427 emit CameraPosChanged(target_camera_.position());
428 }
429 UpdateCameraWorld();
430 update();
431
432 QOpenGLWidget::wheelEvent(event);
433}
float distance(void) const
void set_distance(float distance)

该类的文档由以下文件生成: