OsgQt环境搭建注意事项

OsgQt的CMakeLists.txt文件需要修改的部分

修改部分:

其中3.6.5是笔者的OSG版本,按照自己的修改就行

1
2
3
4
5
6
7
8
9
10

FIND_PACKAGE(OpenSceneGraph 3.6.5 REQUIRED osgDB osgGA osgUtil osgText osgViewer osgWidget)
SET(OPENSCENEGRAPH_SOVERSION 158)

# 把下面这部分注释掉
# 3rd Party Dependency Stuff
# IF(WIN32)
# INCLUDE(Find3rdPartyDependencies)
# ENDIF()

VS2019工程开发中的问题总结

  1. C++常规中设置附加包含目录中的文件,#pragma region 后面不能跟中文,会报由于编码引起的错误,猜测是由于工程开发中由于不同文件编码不同引起的。
  2. 不同编码文件之间传值会乱码,(场景是文件路径),改为窗口选择文件,自动存入vector中然后传值,乱码解决。

Qt开发中的问题总结

  1. 一开始用Qt开发的界面等,最后改为MSVC项目之后,文件的编码由UTF-8改为GB2312之后,界面中的部分显示成了乱码。
    1
    2
    3
    4
    // 乱码
    QString::fromLocal8Bit("打开文件");
    // 正常
    QStringLiteral("打开文件");

c++读取json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vector<PTLoction> getJson(const string& path)
{
string info = "", temp_s;
vector<PTLoction> ptls;
JSONCPP_STRING errs;
Json::Value root, geo, geo_item, mail;
Json::CharReaderBuilder readerBuilder;
ifstream fin(path);

while (fin >> temp_s) info += temp_s;
fin.close();
if (info.empty()) return {};
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
if (!jsonReader->parse(info.c_str(), info.c_str() + info.length(), &root, &errs) || !errs.empty()) return {};
geo = root["lie"];
for (int i = 0; i < geo.size(); ++i) {
FILETOOL::PTLoction temp_ptl = { root["name"].asString(),geo[i][0].asFloat(),geo[i][1].asFloat(),geo[i][2].asFloat() };
ptls.push_back(temp_ptl);
}

return ptls;
}

Qt + MSVC使用SARibbon控件,踩坑记录

以下是笔者的碎碎念,正文向下滑…..

emm…….背景是这样子的,前两天老师查看需求实现情况的时候,表示我没有界面操作。。。。啊这。。。我遂即恶补了Qt的知识,熬完了传智的视频和练习,老师表示不要原生要Office风格的系统。。。(似乎老师们对Office的风格都有一种执念…..)好吧,继续研究ing,找到了开源项目SARibbon,刚上手超级生涩(笔者以前是做前端的,最近开始C++的桌面端),过程中遇到了很多的Bug….作为一名多年码农,有Bug和吃饭一样见怪不怪了,But……就有那么一两个Bug,能让你一杯茶,一首歌,一行代码改一天….果断记录下来……(头秃的过程中我开始了碎碎念….)

Node派生类的遍历等

需求背景

需求是这样的,需要用一个几何体,在一个体元素中提取一部分的插值结果。自然是没有现成的算法。实现的过程中,就需要对Geode、Geometry进行遍历。
由于我之前编译帮助文档失败了,虽然OSG版本是3.6.5的,但是帮助文档的版本却是2.9.11的。一些方法还是有出入的。所以记录一下

遍历Geode内的Geometry

1
2
3
4
cout << "Geode2的数量" << this->temp_gde->getNumChildren() << endl;
for (unsigned int i = 0; i < this->temp_gde->getNumDrawables(); i++) {
osg::ref_ptr<osg::Geometry> pgeo = this->temp_gde->getDrawable(i)->asGeometry();
}

getNumChildren()getNumDrawables()的值是一样的。不知道是不是巧合

矩阵 平移旋转

简单操作

步骤:

  1. 先实例化一个node,平移到x正轴的5
1
2
3
4
5
6
7
osg::ref_ptr<osg::Group> group = new osg::Group;
osg::ref_ptr<osg::MatrixTransform> max = new osg::MatrixTransform;
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("glider.osg");

max->addChild(node.get());
max->setMatrix(osg::Matrix::translate(5.0, 0.0, 0.0));
group->addChild(osgDB::readNodeFile("glider.osg"));
  1. max一个旋转状态,让小飞机绕着Z轴在(0.0, 0.0, 0.0)点旋转,角速度为1。

    1
    max->setUpdateCallback(new osg::AnimationPathCallback(osg::Vec3(0.0, 0.0, 0.0), osg::Z_AXIS, 1.0));

    理想状态下,应该是有一个小飞机在(5.0, 0.0, 0.0)这个位置上原地旋转:

OSG学习中的一些小问题

今天尝试叠加几何体,却出现了重叠,缝隙的问题。

思考一番后发现忽略了一些问题,圆柱体的中心点在xyz的半值。不在底部或者顶部。