HUD (Head Up Display, 抬头显示器),相机的一种,好比英雄联盟的小地图。
参考链接
- OSG HUD (渲染屏幕上贴图和写字),by MissXy.
- Chapter 7: Viewing the World,by osg3.
HUD (Head Up Display, 抬头显示器),相机的一种,好比英雄联盟的小地图。
解决方案请参考解决osgearh程序运行后对象变形的问题。
作为viewer的子相机;
作为viewer下根节点的一个子节点;
使用CompositeViewer,添加一个HUDView,使得HUDCamera作为HUDView的主相机。
使用vcpkg安装各类C++库很方便,但是在使用vcpkg安装osg、osgearth后,使用如下程序测试osg和osgearth,出现了一个小问题,3D模型不显示,说是找不到插件。
刚开始以为是vcpkg安装osg、osgearth出了问题,后面发现将vcpkg中编译生成的osg的plugin放到测试程序所在目录,发现能加载3D模型了,但是渲染纹理失败。
于是自己编译osg源码,发现测试程序能加载3D模型。最终结论是vcpkg编译安装osg了问题。此外,可参考process explorer 查看句柄或者加载的dll,分析测试程序加载的osg插件。
1 | #include <osgViewer/Viewer> |
C++ 是 Google 的许多开源项目使用的主要开发语言之一。每个 C++ 程序员都知道,该语言具有许多强大的特性,但这种能力带来了复杂性,这反过来又会使代码更容易出错,更难阅读和维护。
本指南的目标是通过详细描述编写 C++ 代码的注意事项来管理这种复杂性。这些规则的存在是为了保持代码库的可管理性,同时仍然允许编码人员高效地使用 C++ 语言功能。
样式,也称为可读性,是我们所说的支配我们的 C++ 代码的约定。术语样式有点用词不当,因为这些约定不仅仅涵盖源文件格式。
Cpplint 是一个命令行工具,用于按照Google 的 C++ 样式指南检查 C/C++ 文件的样式问题。Cpplint 由 Google Inc. 在google/styleguide开发和维护
请参考:
请参考:
请参考:
请参考:
请参考:
当发生一下情况时会产生绘制事件并调用paintEvent()函数:
在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。
当重新调整窗口部件的大小时,系统也会产生一个绘制事件。
当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。
请参考:
QThread 的两种使用方法:
请参考:
请参考:
请参考
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
请参考:
在使用vuejs开发过程中,有时候出现修改对象属性后,视图并没有更新的问题。下面分析其产生原因并给出解决方法。
Vue2使用双向数据绑定,当你把一个普通的 JavaScript 对象传入 Vue2 实例作为 data 选项,Vue2 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。
这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在属性被访问和修改时通知变更。
每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据属性记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。
因此,vue2 无法检测 property 的添加或移除。由于 Vue2 会在初始化实例时对 property 执行 getter/setter转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的。对于已经创建的实例,Vue允许动态添加根级别的响应式 property。
Vue.set(object,key,value)方法一次只能添加一个属性,例如:
1 | this.$set(this.message,'b',"我手一杯 品尝你的美"); |
Object.assign或_.extend()可以往数据对象上添加多个属性,但是需要创建同时包含原属性、新属性的对象,从而有效触发watch()方法。例如:
1 | this.message = Object.assign({},this.message,{b:'我手一杯 品尝你的美',c:'留下唇印的嘴'}) |
服务器使用wamp提供web服务,因断电导致mysql无法启动。下面记录恢复mysql的方法流程。
mysql后台服务无法启动。查找mysql.log日志文件发现innodb数据库引擎报如下错误,说明mysql表空间损坏,线程在数据页中读取不到需要的 page 和数据,因此判断mysql的innodb奔溃了。
1 | [ERROR] InnoDB: Database page corruption on disk or a failed file read of page [page id: space=86, page number=4]. You may have to recover from a backup. |
首先使用mysql的Forcing InnoDB Recovery特性,启动mysql后台服务。打开my.ini配置文件,设置如下:
1 | innodb_force_recovery=1 |
再重启mysql后台服务成功。
innodb_force_recovery 可以设置为 1-6,大的值包含前面所有小于它的值的影响。
1 | 1 (SRV_FORCE_IGNORE_CORRUPT): 忽略检查到的 corrupt 页。尽管检测到了损坏的 page 仍强制服务运行。一般设置为该值即可,然后 dump 出库表进行重建。 |
注意:
1 | 为了安全,当设置参数值大于 0 后,可以对表进行 select, create, drop 操作,但 insert, update 或者 delete 这类操作是不允许的。MySQL 5.6.15 以后,当 innodb_force_recovery 的值大于等于 4 的时候,InnoDB 表处于只读模式。 |
使用如下命名自动修复数据库:
1 | mysqlcheck -u root -p --all-databases --auto-repair |
修复完成后,使用如下命令备份重要数据库的数据:
1 | # 备份全部数据库(包含存储过程、自定义函数及事件) |
注意:一定要先修复再备份,防止备份数据时因页表错误丢失数据。
完成修复备份后,注释my.ini中innodb_force_recovery,再重启mysql数据库后台服务,如果成功,则修复完成。如果未成功,则准备利用备份数据重建数据库。
当mysql遭遇严重错误,修复备份后仍然不能启动,可考虑重装wamp。具体操作如下:
1 | # 针对mysql 8.0.18,使用如下命令修改root密码 |
重装后配置遇到的问题请参考:
使用docx-preview的文档预览方案不够完善,显示不够完美,因此采用后端使用docxtemplater文档生成,再使用libreoffice-convert转换成pdf,再下载到前端使用pdfjs预览pdf的方案。
注意:在使用libreoffice-convert将docx转换成pdf之前,需要安装libre office软件,使用默认配置安装。
1 | <template> |
1 | export default { |
1 | <template> |
1 | <script> |