有没有人有相当比较VTK和OpenSceneGraph的经验?我对VTK比较熟悉,但我很好奇是否有人广泛尝试过.
我有两个内置的,5.6 vtk和2.9.9 osg,可以运行示例......乍一看OSG似乎更"粗糙",但也许没关系.特别是我担心能够在VTK中摆弄低级openGL; 例如,我认为glReadPixels在OSG上会表现得更好.评论?
(或者是否有一个很好的'其他',我错过了?我知道其他人存在,但请看一下OSG和VTK的大范围......)
我在设置摄像机时遇到问题,使得它指向原点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上尽可能少依赖的解决方案,更多的是在数学方面,因为我想先自己做数学,以真正掌握它是如何工作的.所以还没有四元数或其他高级的东西,这些都没有在基础线性代数大学课程中教授.
我一直在研究开源项目中的一些代码,并注意到在不止一个场合,枚举值是通过将一个值转换为增量位数来分配的.我没有看到任何具体的理由这样做,也没有看到通过增加+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) 我是第一次使用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类真的不是很有帮助.
如何从源代码构建OpenSceneGraph?我该怎么做才能为OSG构建第三方依赖项?
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) 首先,我阅读了官方比较OpenSG和OpenSceneGraph。我目前的目标是创建一个用于学习目的的小型游戏引擎。我从纯 OpenGL 开始,但后来我发现了那些看起来很不错的场景图库。
我想知道这两个场景图之间的区别。他们的比较非常模糊。例如,OSG 表示 OpenSG 在多线程方面可能更好。
OpenSG 声明,我引用
OpenScenegraph 一开始就严重依赖于 Performer 方面...... OpenSG 更倾向于 Fahrenheit 方面......这些天,为了你的自身利益,你应该使用像 OpenSG 这样的开源系统。
我想知道 OpenSG 和 OpenSceneGraph 之间的区别。
我目前正在使用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'
知道发生了什么事吗?对智能指针有一些要求吗?
我有一个类似3D CAD的应用程序,我使用OpenGL包装器库(OpenSceneGraph).对于应用程序,我试图提出如何在3D中渲染粗细线条的最佳策略.
通过厚,光滑我的意思是:
10.f
在我的机器上)漂亮的库可以实现广泛的线条和曲线外观.它使用三角形进行渲染.
注意:我不寻求像顶点着色或类似笔刷的笔触这样的奇特效果,只是一个3D线段,它可以具有较大的厚度,并且与另一个线段连接良好,它们之间没有任何间隙.
这些2D方法的问题在于它们是2D.当我改变视点时,很明显我的线条几何形状不是线条,而是2D"条带"位于某些3D平面中.我希望它们看起来像3D线条.
在考虑问题时,我只能提出以下方法:
我不确定两种解决方案中的任何一种是否可行(我是OpenGL的初学者).我可能在场景中有数百甚至数千个折线.我也想知道是否有更好,更聪明的方法来解决这个问题?我对任何事情持开放态度,对最有效的方式感兴趣.谢谢.
编辑:正如用户@rickyviking指出的那样,我没有明确说明我正在寻找2D外观(就像任何类似CAD的应用程序一样),这意味着:线条的粗细不取决于距离的近/远相机就在他们身边.
更新:感谢@rickyviking的回答,我选择了方向移动 - 几何着色器.我仍然没有完整的解决方案,但可能会在结果发布后发布最终更新和最小代码.
我正在开发一个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位限制的方法?
openscenegraph ×10
c++ ×6
opengl ×5
3d ×1
c++11 ×1
camera ×1
enums ×1
glsl ×1
graphics ×1
memory ×1
opensg ×1
unique-ptr ×1
visual-c++ ×1
vtk ×1