概述

本文在吸收了《最长的一帧》以及相关参考资料的基础之上解读OSG的基础数据结构,渲染方法。

实现

在这第一部分里,要理解的是run函数的实现,因为以下这一段证明了它的重要性和强大的能力。

int main()
{
//....
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; /**如果指向的目录没有数据OSG的屏幕上不会有数据显示*/
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("D:/OpenSceneGraph/data/cow.osg"); viewer->setSceneData(node.get()); return viewer->run();
}

按照《最长的一帧》中的说法,所有的绘制工作会在一个循环里面完成:

while( !viewer->done() )
{
viewer->frame();
}

但在第一段并没有出现相关的代码,可以确定这些实现细节必须在run函数中实现了。

首先,我希望通过自己实现的控制器显示结点数据,这个跟run函数无关,是教程里的一个小例子,至于run函数我是有了上面的这个循环替代,但是结果却出乎意料,在场景中看不到数据:

源代码:

int main()
{
//....
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; //osg::ref_ptr<osg::Group> root = new osg::Group; /**如果指向的目录没有数据OSG的屏幕上不会有数据显示*/
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("D:/OpenSceneGraph/data/cow.osg"); //........................
viewer->setSceneData(node.get()); viewer->setCameraManipulator(new RunImplement);
//仿真渲染初始化
viewer->realize(); /**最长的一帧 实践版*/
//渲染每一帧
while(!viewer->done())
{
viewer->frame();
} return 0;
}

但是如果控制器设置为TrackballManipulator的话,我也可以在场景中看到结点数据。这是很让我纳闷的一点,在实现RunImplement这个控制器的时候是缺少了什么东西才导致这样的意外的呢?目前我是按照一个视频教程上的指导实现了几个其中几个虚函数,这些函数是显示节点数据的接口。具体实现如下:

#include "run.h"

RunImplement::RunImplement()
{
m_vPosition = osg::Vec3d(10,10,2);
m_vRotation = osg::Vec3d(0,0,0);
} osg::Matrixd RunImplement::getMatrix() const
{
osg::Matrixd mat;
mat.makeTranslate(m_vPosition); return mat * osg::Matrixd::rotate(m_vRotation[0],osg::X_AXIS,m_vRotation[1],osg::Y_AXIS,m_vRotation[2],osg::Z_AXIS);
} osg::Matrixd RunImplement::getInverseMatrix() const
{
osg::Matrixd mat;
mat.makeTranslate(m_vPosition); return mat * osg::Matrixd::inverse(osg::Matrixd::rotate(m_vRotation[0],osg::X_AXIS,m_vRotation[1],osg::Y_AXIS,m_vRotation[2],osg::Z_AXIS));
} void RunImplement::setByInverseMatrix( const osg::Matrixd& matrix )
{ } void RunImplement::setByMatrix( const osg::Matrixd& matrix )
{ }

头文件:run.h

/**
*
*最长的一帧,实例演示
*/
#ifndef RUN_H__
#define RUN_H__
#include <windows.h> // gl.h 大量引用该文件中的接口
#if _DEBUG
#pragma comment( lib, "opengl32")
#pragma comment( lib, "osgd")
#pragma comment( lib, "osgViewerd")
#pragma comment( lib, "osgDBd")
#pragma comment( lib, "OpenThreadsd")
#pragma comment( lib, "osgUtild")
#pragma comment( lib, "osgGAd")
#else
#pragma comment( lib, "opengl32")
#pragma comment( lib, "osg")
#pragma comment( lib, "osgViewer")
#pragma comment( lib, "osgDB")
#pragma comment( lib, "OpenThreads")
#pragma comment( lib, "osgUtil")
#pragma comment( lib, "osgGA")
#endif #include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/PositionAttitudeTransform>
#include <osg/MatrixTransform>
#include <osg/Matrixd>
#include <osg/AnimationPath> #include <iostream> #include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/OrbitManipulator>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile> #include <osgUtil/Optimizer>
#include <osgGA/TrackballManipulator> /*! 开始一个类*/ class RunImplement: public osgGA::OrbitManipulator
{
public:
RunImplement();
public:
virtual void setByMatrix( const osg::Matrixd& matrix );
virtual void setByInverseMatrix( const osg::Matrixd& matrix );
virtual osg::Matrixd getMatrix() const;
virtual osg::Matrixd getInverseMatrix() const; private:
osg::Vec3d m_vPosition;
osg::Vec3d m_vRotation;
};
#endif /* END_OF_RUNIMPLEMENT */

解决问题

思之再三,觉得看不到节点数据的原因无非就两个:

一、数据没有被加载到场景中,
二、加载了节点数据,但是由于参数不正确,导致数据不可见。

osgEarth开发之OSG解构——失败的尝试的更多相关文章

  1. web 开发之js---理解并解决IE的内存泄漏方式

    程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...

  2. 变量的解构赋值////////////z

    变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...

  3. JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

    1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...

  4. ES 6 : 变量的解构赋值

    1. 数组的解构赋值 [ 基本用法 ] 按照一定的模式从数组或者对象中取值,对变量进行赋值的过程称为解构. 以前,为变量赋值只能直接指定值: 而ES 6 允许写成下面这样: 上面的代码表示,可以从数组 ...

  5. es6的解构赋值学习(1)

    相对es5的简单的"="赋值来说,es6增加了一种新的赋值模式--解构赋值,按照它的规则,可以从数组和对象中提取值来对变量进行赋值,个人觉得方便了很多,但是这个模式有点恶心人,相比 ...

  6. Es6 新增解构赋值

    1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 要想实现解构,就必须是容器,或者具有可遍历的接口. 以前,为 ...

  7. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  8. ECMAScript 6入门 - 变量的解构赋值

    定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...

  9. ECMAScript 6之变量的解构赋值

    1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...

随机推荐

  1. 《音乐商店》第4集:自动生成StoreManager控制器

    一.自动生成StoreManager控制器 二.查看 StoreManager 控制器的代码 现在,Store Manager 控制器中已经包含了一定数量的代码,我们从头到尾重新过一下. 1.访问数据 ...

  2. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...

  3. Step by step guide to set up master and slave machines(转)

    Note: There is no need to install Jenkins on the slave machine. On your master machine go to Manage ...

  4. java设计模式之——策略模式

    1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这 ...

  5. 异步的两种写法: async 与 BeginInvoke

    现在要实现异步只要用关键字async/await就可以轻松实现,在此之前需要用到委托/回调等一堆东西. 对一下是对比写法: class Program { delegate string SendMe ...

  6. 前端面试题整理(html)

    1.<!DOCTYPE>标签的定义与用法. <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE> ...

  7. 关于Get和Post

    get和post 简介: Get和post是表单提交数据的两种基本方式,get请求数据通过域名后缀url传送,用户可见,不安全,post请求数据通过在请求报文正文里传输,相对比较安全. get是通过u ...

  8. 根据li标签 查找class="alcw4 alcw41"对应的值

    jrhmpt01:/root/lwp/0526# cat a2.pl use LWP::UserAgent; use DBI; use POSIX; use Data::Dumper; use HTM ...

  9. <2>集腋成裘

    标量项: [root@wx03 2]# cat a1.pl unshift(@INC,"/root/big/2"); use Horse;; print $Horse::days; ...

  10. Python写入文件,但是发现文件为空,竟然未写入!

    问题描述: fw=open(r'C:\test.txt','w') s="Hello World!" fw.write(s) ========== 此时查看C盘根目录,发现test ...