zoukankan      html  css  js  c++  java
  • OSG:幼儿园篇 第二章 几何体绘制类

    一.简介

    在osg中,通常有三种生成几何体的方法:

    1.用封装的OpenGL绘图基元osg::Geometry

    2.是用OSG中预定义的基本几何体

    3.是从文件中导入场景模型

     

    二.绘制几何体流程

    1.指定向量数据

    参考:OSG:先导篇 数据类型

    2.设置绑定方式

    数据绑定主要有两项:法线绑定和颜色绑定

    3.数据解析

    指定绘制三角形的方式,从而绘制不同的图形

    #include <osgViewer/Viewer>
    
    #include <osg/Node>
    #include <osg/Geode>
    #include <osg/Group>
    
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
    
    #include <osgUtil/Optimizer>
    
    //创建一个四边形节点
    osg::ref_ptr<osg::Node> createQuad()
    {
     
      //创建一个叶节点对象
      osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    
      //创建一个几何体对象
      osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
    
      //创建顶点数组,注意顶点的添加顺序是逆时针的
      osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();
      //添加数据
      v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
      v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));
      v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));
      v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
    
      //设置顶点数据
      geom->setVertexArray(v.get());
    
      //创建纹理坐标
      osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();
    
      //添加数据
      vt->push_back(osg::Vec2(0.0f, 0.0f));
      vt->push_back(osg::Vec2(1.0f, 0.0f));
      vt->push_back(osg::Vec2(1.0f, 1.0f));
      vt->push_back(osg::Vec2(0.0f, 1.0f));
    
      //添加纹理坐标
      geom->setTexCoordArray(0, vt.get());
    
      //创建颜色数组
      osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
    
      //添加数据
      vc->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
      vc->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
      vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
      vc->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));
    
      //设置颜色数组
      geom->setColorArray(vc.get());
    
      //设置颜色的绑定方式为单个顶点
      geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
    
      //创建法线数组
      osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();
    
      //添加法线
      nc->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));  
    
      //设置法线数组
      geom->setNormalArray(nc.get());
      //设置法线的绑定方式为全部顶点
      geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
    
      //添加图元,绘图基元为四边形
      geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));
    
      //添加到叶节点
      geode->addDrawable(geom.get());
    
      return geode.get();
    }
    
    int main()
    {
      //创建Viewer对象,场景浏览器
      osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    
      osg::ref_ptr<osg::Group> root = new osg::Group();
    
      //添加到场景
      root->addChild(createQuad());
    
      //优化场景数据
      osgUtil::Optimizer optimizer;
      optimizer.optimize(root.get());
    
      viewer->setSceneData(root.get());
      viewer->realize();
    
    }
  • 相关阅读:
    Redis缓存穿透
    如何应对缓存穿透和缓存雪崩问题
    Redis缓存雪崩
    redis缓存机制
    C# LINQ学习笔记三:LINQ to OBJECT之操作字符串
    C# LINQ学习笔记二:LINQ标准查询操作概述
    C# LINQ学习笔记一:走进LINQ的世界
    C# Lambda表达式学习笔记
    C#委托与事件学习笔记
    C#泛型学习笔记
  • 原文地址:https://www.cnblogs.com/k5bg/p/11454754.html
Copyright © 2011-2022 走看看