我最近一直在使用Qt Creator开发一些Qt应用程序而没有任何问题.本周我开始使用Qt Creator处理Open Scene Graph应用程序.我有Open Scene Graph的所有源(.cpp和.h)文件,并使用它们来构建库.
然后我创建了一个新项目,并通过.pro文件将这些库链接到我的项目中.我的应用程序工作和运行,我可以调试但不会从Open Scene Graph库中进入代码.
如何设置Qt Creator来逐步浏览这些源文件,甚至在这些库的源代码中断点?
在工具 - >选项 - >调试器中,有源路径映射,这可能是我想要的,但我不确定.
谢谢.
我正在尝试在win32机器上构建OpenSceneGraph的pdf插件.该插件使用cmake的PKG_CHECK_MODULES宏来查找cairo和poppler库.我不知道如何以这样的方式安装它们,以帮助它找到它们.
我希望有人知道为什么下面的代码失败了.我试图从osg :: Node*节点对象获取PositionAttitudeTransform(Openscenegraph类)的实例.但是下面的编译器错误以粗体显示.
void CameraPosCallbackUpdate::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
// other code goes here
osg::PositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*> (node);
}
Run Code Online (Sandbox Code Playgroud)
IntelliSense:dynamic_cast中的类型必须是指向完整类类型的指针或引用,或者为void*
请帮助我以正确的方式访问我的对象,我将非常感谢帮助理解这里的问题,因为我相信演员应该是可能的.
http://www.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a00529.html
首先,我必须为我的英语道歉.
我正在开发一个应用程序,我们必须在每个时刻知道每个节点的属性(位置,旋转......),所以我想从场景图中获取每个节点的变换矩阵.
我遇到的问题是我不知道该怎么做.例如,如果我有类似的东西:
osg::ref_ptr<osg::Node> root = osgDB::readNodeFile("cessna.osg.15,20,25.trans.180,90,360.rot.2,3,4.scale");
Run Code Online (Sandbox Code Playgroud)
我想从名为root的Node对象中获取变换矩阵.我找到了类似的东西:
osg::Matrix mat = osg::computeWorldToLocal(this->getNodePath());
std::cout << "X: " << mat.getTrans().x() << std::endl;
std::cout << "Rot X: " << mat.getRotate().x() << std::endl;
std::cout << "Scale X: " << mat.getScale().x() << std::endl;
Run Code Online (Sandbox Code Playgroud)
但我想只有矩阵,是否可能?
谢谢.
PD:我正在使用nodeVisitor来做这件事.
我有一个最小的应用程序,它使用QOpenGLWidget集成了 OpenGL 包装器库 (OpenSceneGraph)。我试图弄清楚在处理像我使用的 OpenGL 内容时如何正确使用 Qt5.6 对高 DPI 屏幕的支持。
我的main()函数有以下代码:
int main(int argc, char** argv)
{
// DPI support is on
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QMainWindow window;
// QOpenGLWidget with OpenSceneGraph content
QtOSGWidget* widget = new QtOSGWidget();
window.setCentralWidget(widget);
window.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
将QtOSGWidget源自QOpenGLWidget与OpenSceneGraph的内容:我使用的osgViewer::GraphicsWindowEmbedded渲染我简单的场景。
为了将 OSG 与 Qt 合并,我重新定义了*GL()方法:paintGL(),resizeGL()和initializeGL(). 我遵循 Qt 文档,了解每种*GL()方法应包含的内容,即:
paintGL() 确保查看器已更新resizeGL() 确保正确调整图形窗口的大小(连同相机和视口);initializeGL() 确保 OpenGL 状态已初始化。 …我已经解决了这个问题(从这里开始).只要把它放在这里,以便遇到错误的任何人都会找到一个更清晰的问题和答案,而不是必须深入挖掘我从中得到它的网站.我很快就会回答这个问题.
遇到的错误是:
Error 13 error C2086: 'int APIENTRY' : redefinition C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\GL\gl.h 1153
Error 10 error C2086: 'int WINGDIAPI' : redefinition C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\GL\gl.h 1153
Error 3 error C2144: syntax error : 'void' should be preceded by ';' C:\Program Files\Microsoft Visual Studio 10\VC\include\GL\gl.h 1152
Run Code Online (Sandbox Code Playgroud) 编写一个小的openscenegraph应用程序,并需要一种方法来改变Camera高度.从本质上讲,眼睛直视空间中的球.我想要做的是能够降低相机高度,这样我才能从下面看球,并且如果需要的话还可以提高相机高度.如何使用oPengl代码或OpenScenegraph实现此目的?
int main(int argc, char* argv[])
{
osg::ref_ptr<osg::ShapeDrawable> shape2 = new osg::ShapeDrawable;
shape2->setShape( new osg::Sphere(osg::Vec3(3.0f, 0.0f, 0.0f),1.0f) );
shape2->setColor( osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) );
osg::ref_ptr<osg::Geode> root = new osg::Geode;
root->addDrawable( shape2.get() );///add first osgshapeDrawable2
osgViewer::Viewer viewer;
viewer.setSceneData( root.get() );///set the Geode as scenedata for the viewer
return viewer.run();
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 3D 场景实现导航技术(在 OpenSceneGraph 中使用 OpenGL)。除其他事项外,用户应该能够点击屏幕上的场景对象以朝它移动。
导航技术应集成到另一个项目中,该项目使用顶点着色器将全局变形应用于场景几何体。这就是问题所在:由于使用顶点着色器使几何体变形,因此将鼠标光标位置取消投影到用户实际选择的地点的世界坐标并不是直接的。但是我需要这些坐标来在我的导航技术中执行正确的相机移动。
执行这种非投影的一种方法是修改顶点着色器(用于变形),让它也将顶点的原始位置和法线存储在单独的纹理中。之后可以在鼠标位置读取这些纹理以获得所需的值。
现在,正如我所说,顶点着色器属于另一个我实际上不想触及的项目。我的导航技术的一个目标是尽可能通用,以便轻松集成到其他项目中。
那么问题来了:到目前为止,OpenSceneGraph 或 OpenGL 中是否有任何我没有考虑的功能?有什么可以让我独立于顶点着色器编码器获得片段的世界坐标的吗?
我正在使用 OpenSceneGraph 和 Qt 开发模拟软件。模拟可以涉及同一虚拟世界中的多个机器人。我对视图的要求如下:
为了完成这些任务,我制作了一个“OSGWidget”,它使用 Osg 查看器在 QGLWidget 内渲染场景。该 OSGWidget 又被放入 QDockWidget 中,该 QDockWidget 可以移动和/或堆叠,从而满足该要求。
问题是,当使用多个单一查看器在不同的小部件中渲染同一场景时,我会得到奇怪的渲染行为。也就是说,纹理无法正确显示,有时甚至根本无法显示。
我浏览过 SO 和 OSG 论坛,虽然人们也遇到了类似的问题,但我看到的唯一回应是建议切换到 Osg CompositeViewer。出于我的目的,我想避免使用它,因为它破坏了我对渲染同一场景的可移动和可堆叠小部件的期望要求。
这是一个棘手的情况,Osg 不容易处理吗?我见过几篇帖子说这不是 OSG “应该工作的方式”,但他们并没有真正提供事实来支持这一说法。有没有人做过类似的事情或有任何想法/见解?如果需要,我可以提供代码片段,但由于这可能与 Osg 的意识形态相矛盾,我将等待得到一些答复。
我正在使用OpenGL编写一个简单的3D引擎.我已经使用以下模式实现了一个简单的场景图:
ISceneNode
IMeshSceneNode
StaticMeshSceneNode
ICameraSceneNode
StaticCameraSceneNode
TrackBallCameraSceneNode
ILightSceneNode
PointLightSceneNode
Run Code Online (Sandbox Code Playgroud)
但我想知道'渲染器'(实现着色器程序的类)是否也可以是场景节点(将渲染代码从MeshSceneNode提取到RenderSceneNode).对我来说,这可能是一个正确的选择,因为如果我必须使用相同的顶点和片段着色器渲染多个网格(例如42个网格),那么绑定和取消绑定着色器程序只需一次而不是42次就非常有用!
那么您如何看待以下架构:
第一个代表我当前的概念(为了简单起见,我不代表'Light'和'Camera'场景节点).

所以,在这里,如果我想渲染我的3个网格物体(使用3个着色器程序使用相同的着色器),我将为每个帧绑定和取消绑定3次我的着色器程序(在每个网格节点的"渲染"方法中).
这是另一个概念:

如上所示,这次我将在渲染节点中为所有子节点绑定一个唯一的着色器程序.所以它可能会更快.
你怎么看待我的想法?
openscenegraph ×10
c++ ×5
opengl ×4
qt ×3
build ×1
cairo ×1
cmake ×1
dpi ×1
pdf ×1
picking ×1
qglwidget ×1
qt-creator ×1
qt5.6 ×1
scenegraph ×1