jjzjj

c++ - OpenSceneGraph 将相机设置在初始位置

coder 2024-02-17 原文

我是第一次使用 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;
}

所以这段代码有效,它正确加载了字段,将框放在我想要的位置,我可以用鼠标导航。

现在,我真的找不到任何东西可以将相机放在盒子所在的位置。我就是做不到。

谁能告诉我怎么做?这应该不是很难,但我找不到任何好的教程,而且 Viewer 和 Camera 类的文档真的不是很有帮助。

最佳答案

一些注意事项:

  • 尝试给出一个OSG自带的模型例子
  • 加入构建代码所需的所有 header ,这将使试图帮助您的人更快 :)
  • 您的代码整洁干净,这是一件好事!

现在,与 OSG 相关:

  • OSG 使用它自己的智能指针实现,即osg::ref_ptr。每次创建一个继承自 osg::Referenced 的新 OSG 对象时都必须使用它,它几乎包括所有内容。您在创建 root 节点时使用了一次,这很好,但是由于您创建的所有其他 OSG 对象的析构函数都是私有(private)的,因此它们会造成内存泄漏。当然,对于这个小程序来说,这没什么大不了的,但立即养成应该是一个好习惯。 (我认为 Paul Martz 在某处免费提供了 pdf 格式的快速入门指南,它可能会对您有所帮助。)
  • osgViewer::Viewer 带有“默认”摄像头,您可以使用 .getCamera() 获取它。对于您当前需要的,您必须将 View 矩阵设置为查看 (.setViewMatrixAsLookAt())。它需要三个 vector :eye、center 和 up,用于定位和定向相机。
  • 在 OSG 中,我从未听说过将相机保持在固定位置并移动世界的做法。你会想要移动相机并将世界保持在固定位置以避免任何大脑损伤。
  • 我不熟悉它(我没有亲自使用过它),但我认为有一个名为 osgGA::CameraManipulator 的基类可以用于常见的相机操作。
  • 很高兴知道:osg::Camera 是一个 osg::Transform,它是一个 osg::Group,这意味着您将能够在场景图中放置一个相机,并且只显示下面的内容。好吧,这有点高级,但仍然如此。

这是您的代码的拷贝,注释掉了框,更改了模型并添加了 osg::ref_ptr。由于您手动定位相机,因此不再需要轨迹球操纵器。

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/PositionAttitudeTransform>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>

using namespace osg;

int main()
{
    osgViewer::Viewer viewer;

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

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

    osg::Node* terrain = osgDB::readNodeFile("C:\\DevTools\\OpenSceneGraph\\examples\\OpenSceneGraph-Data\\cessna.osg");
    if(terrain == nullptr) {
        return -1;
    }

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

    osg::ref_ptr<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() ); 
    osg::ref_ptr<osgViewer::WindowSizeHandler> handler = new osgViewer::WindowSizeHandler();
    viewer.addEventHandler( handler );
//    viewer.setCameraManipulator(new osgGA::TrackballManipulator());
    Vec3d eye( 1000.0, 1000.0, 0.0 );
    Vec3d center( 0.0, 0.0, 0.0 );
    Vec3d up( 0.0, 0.0, 1.0 );

    viewer.getCamera()->setViewMatrixAsLookAt( eye, center, up );

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


    return 0;
}

玩得开心!

关于c++ - OpenSceneGraph 将相机设置在初始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180092/

有关c++ - OpenSceneGraph 将相机设置在初始位置的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  6. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

  7. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  8. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  9. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  10. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

随机推荐