首页 > 其他分享 >osg学习-3《绘制三维曲面》

osg学习-3《绘制三维曲面》

时间:2022-08-21 10:36:42浏览次数:58  
标签:get 三维 geom 曲面 include ref ptr osg

 演示了创建曲面节点的函数

(1)首先设置面数据的顶点坐标,设置面数据在I和J方向的网格个数,以及网格间距,随便设置z和颜色。也可以通过读取外部数据的方式获取顶点坐标和网格上的属性值,根据需要的色标计算每个网格的rgb颜色值。

(2)每个网格一个图元,设置它的坐标索引,并设置颜色数组,通过图元绑定的方式渲染进行显示。

效果如下,下面是代码。

 

// osg_hello.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <random>

#ifdef _WIN32
#include <windows.h>
#endif

#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>


/// <summary>
/// 创建曲面节点对象
/// </summary>
/// <returns></returns>
osg::ref_ptr<osg::Node> createSurface() {
    //创建一个节点对象
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    //创建一个集合对象
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();

    //面数据网格的相关参数
    int ni = 20;
    int nj = 20;
    float dx = 10.0f;
    float dy = 5.0f;
    float xMid = ni * dx / 2;
    float yMid = nj * dy / 2;

    //创建顶点数组
    osg::ref_ptr<osg::Vec3Array> vertx = new osg::Vec3Array();
    for (int j = 0; j <= nj; j++) {
        float y = j * dy;
        for (int i = 0; i <= ni; i++) {
            float x = i * dx;
            float z = -0.5 * sqrt(pow(x - xMid, 2) + pow(y - yMid, 2));         
            vertx->push_back(osg::Vec3(x,y,z));
        }
    }

    std::random_device dev;
    std::default_random_engine rnd(dev());
    std::uniform_real_distribution<float> u(0,1);

    //设置顶点数据
    geom->setVertexArray(vertx.get());
    //创建颜色数组
    osg::ref_ptr<osg::Vec4Array> vcolor = new osg::Vec4Array();

    for (int j = 0; j < nj; j++) {
        for (int i = 0; i < ni; i++) {
            int index = j * (ni+1) + i;
            //创建四边形定点数组,指定绘图基元为四边形,注意添加顺序
            osg::ref_ptr<osg::DrawElementsUInt> quad =
                new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
            quad->push_back(index);
            quad->push_back(index + 1);
            quad->push_back(index + ni + 2);
            quad->push_back(index + ni + 1);
            
            //添加到几何体
            geom->addPrimitiveSet(quad.get());           
            //vcolor->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));  //red
            vcolor->push_back(osg::Vec4(u(rnd), u(rnd), u(rnd), 1.0f));  //random color for simple
        }
    }

    //设置颜色数组
    geom->setColorArray(vcolor.get());


    //设置颜色的绑定方式为单个顶点
    //geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
    geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET);

    // 创建法线数组
    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);

    //添加到叶节点
    geode->addDrawable(geom.get());

    return geode.get();
}

int main()
{
    // 创建Viewer对象,场景浏览器创建一个节点。viewer->setSceneData(root.get())viewer->realize(viewer - un();
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    //创建场最组节点
    osg::ref_ptr<osg::Group> root = new osg::Group();

    //创建面对象
    osg::ref_ptr<osg::Node> node = createSurface();

    //添加到场景
    root->addChild(node.get());

    //优化场景数据
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());

    //设置场景数据
    viewer->setSceneData(root.get());

    //设置渲染的窗口
    //viewer->setUpViewAcrossAllScreens();  //default on all screens
    viewer->setUpViewOnSingleScreen(0);

    //开始渣染
    viewer->run();

    return 0;
}


 

标签:get,三维,geom,曲面,include,ref,ptr,osg
From: https://www.cnblogs.com/oliver2022/p/16609419.html

相关文章

  • osg学习-2《绘制基本单元》
    上一篇演示了基本四边形的绘制,这一篇是共享顶点的方法,通过索引绘制顶点和颜色。为了便于理解特意在ppt中绘制了顶点的坐标位置,5个顶点,绘制了一个四边形和三角形,其中有2个......
  • osg学习-1《绘制基本单元》
     1基于场景的图形绘制    OpenSceneGraph简称OSG是非常著名的三维可视化,在绘制复杂场景方面比VTK更有优势。在OSG中存在两棵树,即场景树和渲染树。场景树是一棵......
  • osg学习-6《显示三维矩阵》
    在三维空间显示三维矩阵,需要显示它的6个外表面。假设xyz三个方向的维数是ni,nj,nk,三个方向的顶点维数是ni+1,nj+1,nk+1。在每个面上分别绘制各自的四边形。每个四边形的颜色根......
  • 利用OSGBLab对建筑进行立面出图
    利用OSGBLab对倾斜摄影的建筑进行立面出图OSGBLab实景三维小助手【微信公众号OSGBLab】  OSGBLab除了能输出顶视的真正射DOM,还能选定范围进......
  • 智能配电 | 智慧变电站数字孪生三维可视化运营分析系统解决方案
    智慧变电站概述我国目前有4万多座变电站,变电运维作为核心业务,运变电站作为电力系统中不可缺少的重要环节,它担负着电能量转换和电能重新分配的繁重任务,对电网的安全和经济......
  • 数字孪生园区工艺流程三维可视化应用的优势
    在精准和及时的管理要求下,智慧园区领导者工作面临较大的难度和压力,究其根本原因是对现场缺乏感知能力,因此很难掌握事件处理的“度”,将数字孪生技术应用到智慧园区中,为......
  • 三维建模软件Modo 16推荐
    强大的3D建模,纹理和渲染工具Modo16更新啦,modo16系列提供了增强型模型工具和工作流程,UI中嵌入的VR视口,迭代设计工作流程和改进的动画功能。Modo是强大而灵活的3D建模软件......
  • 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算
    摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现。本文分享自华为云社区《[Python图像处理]十三.基于灰度三维图的图像顶帽运......
  • The Foundry Modo 16(专业三维建模软件)
     TheFoundryMODO是一款独一无二的高级多边形细分曲面,建模、雕刻、3D绘画、动画与渲染的融合工作流的综合性3D软件。适用于建筑可视化、方案设计、游戏开发、电影、广播......
  • Osg-Osg利用Texture2D给球面贴图(Qt5.14.2+osgE3.6.5+win10)-No28-Texture2D
    相关资料:https://blog.csdn.net/forcsdn_tang/article/details/122273695 实例代码:.pro1QT+=coreguiwidgets2QT+=opengl3TARGET=Tes......