osg三角带

news2025/1/21 4:45:20

案例1


#include <osg/Geode>
#include <osg/Geometry>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osg/Notify>
#include <osg/PrimitiveSet>
#include <osgViewer/Viewer>
#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.f, 0.f, 0.f));
    v->push_back(osg::Vec3(1.f, 0.f, 0.f));
    v->push_back(osg::Vec3(1.f, 0.f, 1.f));
    v->push_back(osg::Vec3(0.f, 0.f, 1.f));
    v->push_back(osg::Vec3(0.f, -1.f, 0.f));
    geom->setVertexArray(v.get());

    //创建四边形顶点索引数组,指定绘图基元为四边形,注意添加顺序
    osg::ref_ptr<osg::DrawElementsUInt> quad =
        new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
    quad->push_back(0);
    quad->push_back(1);
    quad->push_back(2);
    quad->push_back(3);

    //添加到几何体
    geom->addPrimitiveSet(quad.get());

    //创建三角形顶点索引数组,指定绘图基元为三角形
    osg::ref_ptr<osg::DrawElementsUInt> triangle =
        new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
    triangle->push_back(4);
    triangle->push_back(0);
    triangle->push_back(3);

    geom->addPrimitiveSet(triangle.get());



    //创建四个颜色的数组
    osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;

    c->push_back(osg::Vec4(1.f, 0.f, 0.f, 1.f));
    c->push_back(osg::Vec4(0.f, 1.f, 0.f, 1.f));
    c->push_back(osg::Vec4(0.f, 0.f, 1.f, 1.f));
    c->push_back(osg::Vec4(1.f, 1.f, 0.f, 1.f));
    
    //创建颜色索引数组
    osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType, 4, 4>*
        colorIndex = new osg::TemplateIndexArray
        <unsigned int, osg::Array::UIntArrayType, 4, 4>();
    colorIndex->push_back(0);
    colorIndex->push_back(1);
    colorIndex->push_back(2);
    colorIndex->push_back(3);
    colorIndex->push_back(2);

    geom->setColorArray(c.get());
    geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);



    //为唯一的法线创建一个数组
    osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
    geom->setNormalArray(n.get());
    geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
    n->push_back(osg::Vec3(0.f, -1.f, 0.f));


    //由保存的数据绘制四个顶点的多边形
    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));


    
    geode->addDrawable(geom.get());

    return geode.get();


}





int main()
{


    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

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

    root->addChild(createQuad());

    osgUtil::Optimizer opt;
    opt.optimize(root.get());

    viewer->setSceneData(root.get());
    viewer->realize();
    viewer->run();


}

案例二,绘制三角带


#include <osg/Geode>
#include <osg/Geometry>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osg/Notify>
#include <osg/PrimitiveSet>
#include <osgViewer/Viewer>
#include <osgUtil/Optimizer>
#include <osgUtil/TriStripVisitor>

#include <osgViewer/ViewerEventHandlers>
#include <osg/Group>
#include <osgUtil/DelaunayTriangulator>
#include <osgGA/StateSetManipulator>

//创建一个四边形节点
osg::ref_ptr<osg::Geometry> 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));
    return geom.get();

}


int main()
{


    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    //方便查在多边形之间的切换,查看三角网
    viewer->addEventHandler(
        new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));

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

    osg::ref_ptr<osg::Geometry> geo = createQuad();

    osgUtil::TriStripVisitor stripper;
    stripper.stripify(*(geo.get()));

    //添加到叶子节点
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    geode->addDrawable(geo.get());

    root->addChild(geode.get());

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

    viewer->setSceneData(root.get());

    viewer->realize();

    viewer->run();

    return 0;
   

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器经常被攻击的原因

很多中小型企业都是选择虚拟主机服务器&#xff0c;是把一个服务器分成很多个给很多企业一起共用&#xff0c;可能同一个 IP服务器上就有很多个不同企业的网站&#xff0c;这个时候如果跟你同一个IP服务器的网站遭到DDoS攻击&#xff0c;就很有可能会影响到你的网站也无法正常访…

谁还在一个个私发成绩啊, 教你如何实现学生自助查询成绩

今天我们聊聊成绩查询那些事儿 得先说说&#xff0c;成绩查询到底是个啥东西。成绩查询系统&#xff0c;顾名思义&#xff0c;就是一个可以输入用户名和密码&#xff0c;然后查看自己成绩的系统。对于咱们老师来说&#xff0c;可以省去一个个私发成绩的繁琐&#xff0c;对于学生…

69 内网安全-域横向CobaltStrikeSPNRDP

目录 演示案例:域横向移动RDP传递-Mimikatz域横向移动SPN服务-探针,请求,导出,破解,重写域横向移动测试流程一把梭哈-CobaltStrike初体验 涉及资源 SPN主要是扫描技术&#xff0c;在渗透过程中结合kerberos协议&#xff0c;可以做一些事情 演示案例: 域横向移动RDP传递-Mimik…

第三章 栈和队列【数据结构与算法】【精致版】

第三章 栈和队列【数据结构与算法】【精致版】 前言版权第 3 章 栈和队列3.1 应用实例应用实例一 迷宫求解问题应用实例二“马”踏棋盘问题 3.2栈3.2.1 栈的概念及运算3.2.2栈的顺序存储结构1. 顺序栈**1-顺序栈.h**2. 多栈共享邻接空间**2-共享栈.c** 3.2.3栈的链式存储结构1&…

【错误解决方案】ModuleNotFoundError: No module named ‘torchvision.models.utils‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为torchvision.models.utils的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named torchvision.models.utils 2. 解决方案 1&#xff09;这可能是因为你还没有安装…

SolidWorks2022安装教程(正版)

网盘资源附文末 一.简介 SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统&#xff0c;由于技术创新符合CAD技术的发展潮流和趋势&#xff0c;SolidWorks公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百…

学习笔记二十九:K8S配置管理中心Configmap实现微服务配置管理

Configmap概述 Configmap概述Configmap能解决哪些问题&#xff1f;Configmap应用场景局限性 Configmap创建方法命令行直接创建通过文件创建指定目录创建configmap 编写configmap资源清单YAML文件使用Configmap通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入…

关于单片机CPU如何控制相关引脚

目录 1、相关的单片机结构 2、通过LED的实例解释 1、相关的单片机结构 在寄存器中每一块都有一根导线与引脚对应&#xff0c;通过cpu改变寄存器内的数据&#xff08;0或1&#xff09;&#xff0c;通过驱动器来控制对于的引脚。 2、通过LED的实例解释 如图所示&#xff0c;芯片…

【云备份|| 日志 day3】服务端配置信息模块

云备份day3 使用文件配置加载一些程序的运行关键信息可以让程序的运行更加灵活&#xff0c;且当需要修改部分内容时&#xff0c;不需要在代码上修改&#xff0c;只需要修改配置文件&#xff0c;然后重启服务器即可。 配置信息 热点判断时间文件下载URL前缀路径压缩包后缀名称…

项目管理-采购管理过程讲解

项目采购管理是指在项目执行过程中&#xff0c;对项目所需的产品、服务或资源进行采购的过程。它涉及确定采购需求、编制采购计划、寻找供应商、进行招标或谈判、签订合同、监督供应商履约等一系列活动。 项目采购管理的目标是确保项目能够按时、按质、按预算获取所需的产品或…

fastapi-路由

FastAPI的APIRouter是一个用于将不同功能模块的端点进行划分的工具&#xff0c;类似于Flask中的蓝图&#xff08;Blueprint&#xff09;。通过APIRouter&#xff0c;你可以将应用程序的不同部分组织成独立的路由模块&#xff0c;从而提高代码的可读性和可维护性。 APIRouter允…

【Midjourney入门教程2】Midjourney的基础操作和设置

文章目录 Midjourney的常用命令和基础设置1、 /imagine2、 /blend3、 /info4、 /subscribe5、 /settings&#xff08;Midjourney的基础设置&#xff09;6、 /shorten 有部分同学说我不想要英文界面的&#xff0c;不要慌&#xff1a; 点击左下角个人信息的设置按钮&#xff0c;找…

(2023最新版)总结 TCP 三挥四握的面试题

任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 TCP 基本认识 TCP 头格式有哪些&#xff1f; 我们先来看看 TCP 头的格式&#xff0c;标注颜色的表示与本文关联比较大的字段&#xff0c;其他字段不做详细阐述。 TCP 头格式 序列号&#xff1a;在建立连接时由计算机生成的…

C/C++苹果和虫子 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C苹果和虫子 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C苹果和虫子 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 你买了一箱n个苹果&#xff0c;很不幸的是买完时箱…

小程序day03

目标 页面导航 声明式导航 1.导航到tabBar页面 2.导航到非tabbar页面 3.后退导航 编程式导航 1.导航到tabBar页面 2.导航到非tabBar页面 3.后退导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onLoad中接收导航参数 页面事件 下拉刷新 这个可以获取完数据之后再停止…

06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)

1、数据情况&#xff1a; 其一、从后端拿到的数据为&#xff1a; let arr [1,3,6,10,11,23,24] 其二、目标数据为&#xff1a; [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…

java--深刻认识面向对象

1.面向对象编程有啥好处 万物皆对象 汽车的数据&#xff0c;找汽车对象处理 手机的数据&#xff0c;找手机对象处理 学生的数据&#xff0c;找学生对象处理 符合人类思维习惯&#xff0c;编程更简单、更直观 2.程序中的对象到底是啥 对象本质上是一种特殊的数据结构(具体…

基于深度学习的目标检测算法 计算机竞赛

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

安卓应用开发环境

安卓应用开发环境 安卓应用开发环境安卓Studio下载安装安卓Gradle下载安装 安装&#xff06;构建问题Android Studio无法下载SDKSSH变体simple不支持设置端口cvc-complex-type.2.4.aFailed to find Build Tools revison 30.0.2Android Studio无法找到CMakeCMake was unable to …