标签: openscenegraph

VTK(可视化工具包)与OSG(OpenSceneGraph),其他?

有没有人有相当比较VTK和OpenSceneGraph的经验?我对VTK比较熟悉,但我很好奇是否有人广泛尝试过.

我有两个内置的,5.6 vtk和2.9.9 osg,可以运行示例......乍一看OSG似乎更"粗糙",但也许没关系.特别是我担心能够在VTK中摆弄低级openGL; 例如,我认为glReadPixels在OSG上会表现得更好.评论?

(或者是否有一个很好的'其他',我错过了?我知道其他人存在,但请看一下OSG和VTK的大范围......)

opengl graphics openscenegraph vtk

5
推荐指数
1
解决办法
6526
查看次数

将相机对准O(0,0,0),45度

我在设置摄像机时遇到问题,使得它指向原点O(0,0,0),与所有其他轴成45°,所有坐标都是正的(当然,它应该具有相同的值).你可以在图像中看到我最接近的图像

在此输入图像描述

但是,正如您所看到的,x此处的值为负,因此摄像机位于YZ飞机的错误一侧.

完整的可编译项目可以在本修订版中找到.

完成的相关矩阵乘法是

osg::Matrixd rotate_x(
        1.0, 0.0, 0.0, 0.0,
        0.0, q_cos, -q_sin, 0.0,
        0.0, q_sin, q_cos, 0.0,
        0.0, 0.0, 0.0, 1.0 
);
osg::Matrixd rotate_y(
        q_cos, 0.0, q_sin, 0.0,
        0.0, 1.0, 0.0, 0.0,
        -q_sin, 0.0, q_cos, 0.0,
        0.0, 0.0, 0.0, 1.0 
);
camera_pos = camera_pos * rotate_x;
camera_pos = camera_pos * rotate_y;
Run Code Online (Sandbox Code Playgroud)

在文件中Simple.cpp.

我试图找出它的工作原理(数学和程序).我更喜欢在openscenegraph上尽可能少依赖的解决方案,更多的是在数学方面,因为我想先自己做数学,以真正掌握它是如何工作的.所以还没有四元数或其他高级的东西,这些都没有在基础线性代数大学课程中教授.

c++ opengl 3d linear-algebra openscenegraph

5
推荐指数
1
解决办法
217
查看次数

C++使用位移分配枚举显式值

我一直在研究开源项目中的一些代码,并注意到在不止一个场合,枚举值是通过将一个值转换为增量位数来分配的.我没有看到任何具体的理由这样做,也没有看到通过增加+1来分配值的效率提高.

无论如何,没有一些代码可以证明什么让我感到困惑,这可能没什么意义.

1级

enum EventType {
        NONE                = 0,
        PUSH                = 1<<0,
        RELEASE             = 1<<1,
        DOUBLECLICK         = 1<<2,
        DRAG                = 1<<3,
        MOVE                = 1<<4,
        KEYDOWN             = 1<<5,
        KEYUP               = 1<<6,
        FRAME               = 1<<7,
        RESIZE              = 1<<8,
        SCROLL              = 1<<9,
        PEN_PRESSURE        = 1<<10,
        PEN_ORIENTATION     = 1<<11,
        PEN_PROXIMITY_ENTER = 1<<12,
        PEN_PROXIMITY_LEAVE = 1<<13,
        CLOSE_WINDOW        = 1<<14,
        QUIT_APPLICATION    = 1<<15,
        USER                = 1<<16
    };
Run Code Online (Sandbox Code Playgroud)

2级

    enum EventType {
        EVENT_MOUSE_DOUBLE_CLICK = osgGA::GUIEventAdapter::DOUBLECLICK,
        EVENT_MOUSE_DRAG         = osgGA::GUIEventAdapter::DRAG,
        EVENT_KEY_DOWN           = osgGA::GUIEventAdapter::KEYDOWN,
        EVENT_SCROLL             = osgGA::GUIEventAdapter::SCROLL,
        EVENT_MOUSE_CLICK        = osgGA::GUIEventAdapter::USER …
Run Code Online (Sandbox Code Playgroud)

c++ enums openscenegraph

4
推荐指数
1
解决办法
4273
查看次数

OpenSceneGraph将相机设置在初始位置

我是第一次使用OpenSceneGraph而且我有点迷失因为文档真的不那么清楚......

所以,我有这个代码加载带有房子的obj文件,我已经淹没了一个小盒子,我想要"人".所以现在,我不想在那里放置那个盒子,我想把相机放在那里,看着前面,后来我会去固定相机周围移动地形,这样看起来就像相机在移动但是地形在移动.

所以,这是我的代码:

int main()
{
    osgViewer::Viewer viewer;

    viewer.setUpViewInWindow(0,0,800,800);

    osg::ref_ptr<osg::Group> root (new osg::Group);

    osg::Node* terrain = osgDB::readNodeFile(".terrain.obj");
    if(terrain == NULL) {
        return -1;
    }

    Geode* gbox = new Geode();
    gbox->addDrawable(new ShapeDrawable(new Box()));

    PositionAttitudeTransform* terrainT = new PositionAttitudeTransform();

    PositionAttitudeTransform* boxT = new PositionAttitudeTransform();
    boxT->setScale(Vec3d(50,50,50));
    boxT->setPosition(Vec3d(1000,1000,0)); 

    root->addChild(terrainT);
    root->addChild(boxT);
    terrainT->addChild(terrain);
    boxT->addChild(gbox);

    viewer.setSceneData( root.get() ); 
    viewer.addEventHandler(new osgViewer::WindowSizeHandler);
    viewer.setCameraManipulator(new osgGA::TrackballManipulator());

    viewer.realize();
    while(!viewer.done()) {
        viewer.frame(); 
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以这段代码工作正常,它正确地加载了fiel,把盒子放在我想要的地方,我可以用鼠标导航.

现在,我真的找不到任何东西将相机放在盒子里.我不能.

任何人都可以给我一些如何做的提示吗?它应该不是很难,但我找不到任何好的教程和文档Viewer和Camera类真的不是很有帮助.

c++ opengl camera openscenegraph

4
推荐指数
1
解决办法
7542
查看次数

如何从源和第三方依赖项构建OpenSceneGraph?

如何从源代码构建OpenSceneGraph?我该怎么做才能为OSG构建第三方依赖项?

openscenegraph visual-studio-2010 visual-c++

3
推荐指数
1
解决办法
5208
查看次数

内存位置的C++ bad_alloc异常

OSGP.exe中0x758cd36f处的未处理异常:Microsoft C++异常:内存位置为0x0028ef70的std :: bad_alloc ..

我试图在Visual Studio中执行下面的代码.但是,我一直遇到上面的例外.我添加了一个try catch来帮助我捕获错误,但似乎无济于事.我相信问题与输出窗口中的以下内容有关

First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0019f2f4..
First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0019ec84..
First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
The thread 'Win32 Thread' (0x16dc) has exited with code 0 (0x0).
The program '[448] OSGP.exe: Native' has exited with code 0 (0x0).**
Run Code Online (Sandbox Code Playgroud)

这是代码:

#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <new>

#include …
Run Code Online (Sandbox Code Playgroud)

c++ opengl openscenegraph visual-studio-2010

3
推荐指数
1
解决办法
4万
查看次数

OpenSG 和 OpenSceneGraph 的区别

首先,我阅读了官方比较OpenSGOpenSceneGraph。我目前的目标是创建一个用于学习目的的小型游戏引擎。我从纯 OpenGL 开始,但后来我发现了那些看起来很不错的场景图库。

我想知道这两个场景图之间的区别。他们的比较非常模糊。例如,OSG 表示 OpenSG 在多线程方面可能更好。

OpenSG 声明,我引用

OpenScenegraph 一开始就严重依赖于 Performer 方面...... OpenSG 更倾向于 Fahrenheit 方面......这些天,为了你的自身利益,你应该使用像 OpenSG 这样的开源系统。

我想知道 OpenSG 和 OpenSceneGraph 之间的区别。

openscenegraph opensg

3
推荐指数
1
解决办法
2363
查看次数

使用std c ++ 11智能指针转换为非标量类型

我目前正在使用openscenegraph,它使用自己的智能指针.但我想使用std c ++ 11智能指针.

现在这是工作示例代码

osg::ref_ptr<osg::Uniform> SineUniform   =  new osg::Uniform( "Sine", 0.0f );
Run Code Online (Sandbox Code Playgroud)

但是当我做这样的事情

std::unique_ptr<osg::Uniform> SineUniform   =  new osg::Uniform( "Sine", 0.0f );
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误消息

错误:从'osg :: Uniform*'转换为请求的非标量类型'std :: unique_ptr'

知道发生了什么事吗?对智能指针有一些要求吗?

c++ openscenegraph unique-ptr c++11

3
推荐指数
1
解决办法
1983
查看次数

OpenGL:3D中厚而光滑/不折断的线条*

我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.

通过厚,光滑我的意思是:

  • 线条粗细可以超过OpenGL最大线宽值(它似乎10.f在我的机器上)
  • 在组成折线时,我想避免看到"折线"(见下面的示例图片)

OpenGL <code>GL_LINE_STRIP_ADJACENCY</code>.</p>

<p>我发现有很多不同的资源可以在2D中渲染漂亮的线条和曲线.最简单的方法是不需要太多思考就是将该行渲染为一组四边形(<code>GL_QUAD_STRIP</code>).这个解决方案的好处是它同时解决了我的两个问题.</p>

<p>作为一个例子,我还发现这个<a rel=漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.

注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.

这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.

在考虑问题时,我只能提出以下方法:

  1. 将线渲染为一组2D四边形(三角形),然后使它们始终面向相机
  2. 使用像圆柱体这样的3D形状来表示线段

我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.

编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.

更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.

opengl glsl openscenegraph

2
推荐指数
2
解决办法
2354
查看次数

分配大于32位的堆内存允许

我正在开发一个32位的OSGEarth项目,我必须将选择的图像拼接成一个大图像.切换到64位不是一种选择.

图像作为256x256图块的集合存储在存储器中.当用户尝试从许多磁贴创建单个映像时,问题就出现了,OSGEarth内部尝试分配的内存比32位系统允许的内存多.

我试图通过分配几个数据块来解决这个限制,每个数据块大小为1025字节.然后,第1025个字节将"指向"下一个块的开头,最后一个字节为nullptr.

这就是我目前正在做的事情(我计划将来分配更多):

unsigned char* start = new unsigned char[1025];
unsigned char** head = &start;
unsigned char** tail = head + 1025;

for (unsigned int i = 0; i < 3; ++i)
{
    auto c = new unsigned char[1025];
    *tail = &c[0];
    tail = &c + 1025;
}

memset(head, 'C', 1025 * 4);
Run Code Online (Sandbox Code Playgroud)

但是,如果我期待发生的事实上正在发生,我有一些保留意见.内存是否真正分配在一个连续的块中?如果没有,那么我的memset正在写未分配的数据,这可能是坏的.

有没有解决32位限制的方法?

c++ memory memory-management openscenegraph

2
推荐指数
1
解决办法
116
查看次数