当前位置: 首页 > news >正文

网站域名年费网站推广计划书范文500字

网站域名年费,网站推广计划书范文500字,国外活动策划网站,健身器材网站源码目录本节内容本节代码思路具体实现注意以下为全部代码本节内容 经常的我们想看看模型的法线对不对,如本节下图所示: 我们就想把模型的法线绘制出来。本节就介绍这个小功能。 本节代码 本节资源在如下链接/文件中的附件/按章节编号目录中:…

目录

  • 本节内容
  • 本节代码
  • 思路
  • 具体实现
  • 注意
  • 以下为全部代码

本节内容

经常的我们想看看模型的法线对不对,如本节下图所示:
在这里插入图片描述
我们就想把模型的法线绘制出来。本节就介绍这个小功能。

本节代码

本节资源在如下链接/文件中的附件/按章节编号目录中:
【击此打开网盘资源链接】

也可以在本文末获取

思路

遍历所有的Geode,然后将其里面所有的Geometry的,凡是有法线的,都给生成法线。法线的起点是该顶点,方向是法线的方向,长度可以根据包围盒的半径大小来。

具体实现

1、我们遍历模型的所有的Geode

class BuildNormal : public osg::NodeVisitor
{
public:BuildNormal() :osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}virtual void apply(osg::Geode& gnode){在这里做事情}
}

2、遍历gnode中所有的Geometry

	virtual void apply(osg::Geode& gnode){//先看其里有多少个geometry,给每个geometry的每个顶点的法线生成一条实体线,再添加到gnode中//因为添加之后gnode的子结点就会增多,为了避免给法线的实体线再生成法线,因此这里先获取int geomNum = gnode.getNumDrawables();for (int i = 0; i < geomNum; i++){osg::Geometry* geom = gnode.getDrawable(i)->asGeometry();if (nullptr != geom){//在这里搞事情}}traverse(gnode);}

3、如果geom有逐顶点绑定的法线则申请几何体开始绘制:

			if (nullptr != geom){//先判断有法线而且是逐顶点绑定osg::Vec3Array* normal = dynamic_cast<osg::Vec3Array*>(geom->getNormalArray());if ((nullptr != normal) && (geom->getNormalBinding() == osg::Array::BIND_PER_VERTEX)){//给法线生成Geometryosg::Geometry* geomNormalLine = new osg::Geometry();gnode.addDrawable(geomNormalLine);//关闭光照geomNormalLine->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);//申请顶点osg::Vec3Array* nVertex = new osg::Vec3Array;geomNormalLine->setVertexArray(nVertex);//申请颜色数组osg::Vec4Array* nColor = new osg::Vec4Array;geomNormalLine->setColorArray(nColor, osg::Array::BIND_PER_VERTEX);//为每个顶点生成一条线{osg::Vec3Array* vertex = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());if (nullptr != vertex){for (int j = 0; j < vertex->size(); j++){//压入当前顶点为第一个顶点nVertex->push_back(vertex->at(j));//压入颜色osg::Vec3 colorTemp = vertex->at(j);colorTemp.normalize();nColor->push_back(osg::Vec4(colorTemp.x(), colorTemp.y(), colorTemp.z(), 1.0));//得到法线osg::Vec3 normalTemp = normal->at(j);nColor->push_back(osg::Vec4(normalTemp.x(), normalTemp.y(), normalTemp.z(), 1.0));//得到顶点,为在法线方向上延长当前包围盒的半径的0.1倍float n = gnode.getBound().radius() * 0.1;nVertex->push_back(vertex->at(j) + normalTemp * n);}}}geomNormalLine->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, nVertex->size()));}}

注意

为什么要把绘制的geometry加到与法线所在的geometry同一个gnode当中,原因是这个gnode可能经过了平移旋转等操作,如果在根结点单独申请gnode,这样的操作复制起来就很麻烦。

以下为全部代码

// c.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/NodeVisitor>//为模型生成法线,法线放在同一个几何体当中
class BuildNormal : public osg::NodeVisitor
{
public:BuildNormal() :osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}virtual void apply(osg::Geode& gnode){//先看其里有多少个geometry,给每个geometry的每个顶点的法线生成一条实体线,再添加到gnode中//因为添加之后gnode的子结点就会增多,为了避免给法线的实体线再生成法线,因此这里先获取int geomNum = gnode.getNumDrawables();for (int i = 0; i < geomNum; i++){osg::Geometry* geom = gnode.getDrawable(i)->asGeometry();if (nullptr != geom){//先判断有法线而且是逐顶点绑定osg::Vec3Array* normal = dynamic_cast<osg::Vec3Array*>(geom->getNormalArray());if ((nullptr != normal) && (geom->getNormalBinding() == osg::Array::BIND_PER_VERTEX)){//给法线生成Geometryosg::Geometry* geomNormalLine = new osg::Geometry();gnode.addDrawable(geomNormalLine);//关闭光照geomNormalLine->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);//申请顶点osg::Vec3Array* nVertex = new osg::Vec3Array;geomNormalLine->setVertexArray(nVertex);//申请颜色数组osg::Vec4Array* nColor = new osg::Vec4Array;geomNormalLine->setColorArray(nColor, osg::Array::BIND_PER_VERTEX);//为每个顶点生成一条线{osg::Vec3Array* vertex = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());if (nullptr != vertex){for (int j = 0; j < vertex->size(); j++){//压入当前顶点为第一个顶点nVertex->push_back(vertex->at(j));//压入颜色osg::Vec3 colorTemp = vertex->at(j);colorTemp.normalize();nColor->push_back(osg::Vec4(colorTemp.x(), colorTemp.y(), colorTemp.z(), 1.0));//得到法线osg::Vec3 normalTemp = normal->at(j);nColor->push_back(osg::Vec4(normalTemp.x(), normalTemp.y(), normalTemp.z(), 1.0));//得到顶点,为在法线方向上延长当前包围盒的半径的0.1倍float n = gnode.getBound().radius() * 0.1;nVertex->push_back(vertex->at(j) + normalTemp * n);}}}geomNormalLine->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, nVertex->size()));}}}traverse(gnode);}
};int main()
{osgViewer::Viewer viewer;//读一个模型osg::Node* pNode = osgDB::readNodeFile("glider.osg");//为其生成法线BuildNormal bn;pNode->accept(bn);viewer.setSceneData(pNode);viewer.run();return 0;
}
http://www.lbrq.cn/news/2616607.html

相关文章:

  • 东营市做网站的公司小程序开发公司
  • 中国建筑公司排名前20seo课培训
  • 做微博类的网站难吗长沙正规竞价优化服务
  • wordpress购物网站手机网站优化网
  • 南京网站制作平台济南seo网络优化公司
  • 网站地图在线生成器优化大师使用心得
  • 织梦网站入侵网站备案流程
  • 有哪些能做专门接做标书的网站如何找做网站的公司
  • 携程旅行的网站建设合肥网站建设
  • 昆明企业网站建设重庆可靠的关键词优化研发
  • 专业佛山网站建设seo教程下载
  • 网站后台如何开发青岛网站推广系统
  • 铜梁网站建设合肥seo推广排名
  • 信息爆炸的时代做网站seo关键词怎么选择
  • 如何购买一个网站的域名搜索引擎营销的特点包括
  • 芜湖 网站建设市场策划方案
  • wordpress内容清空南宁关键词优化公司
  • 网站开发 评价百度seo指数查询
  • 如何做网站模特seo外链平台
  • 企业名录黄页大全seo教育培训机构
  • 如何做网站充值接口免费推广的方式
  • 电商设计网站百度咨询
  • 随州市住房和城乡建设委员会网站百度教育官网
  • 公司网站维护价格表2023公众号软文推广
  • 泉州建设工程开标网站电商网站建设哪家好
  • 前程无忧招聘网站标记怎么做网络推广的工作好做吗
  • 做网站显示不同字体企业建站 平台
  • 网站建设与设计试题关键词全网搜索
  • 使用 ahrefs 进行 seo 分析自动优化句子的软件
  • 简单的房源展示网站开发辽源seo
  • Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水线
  • Vue Router 路由的创建和基本使用(超详细)
  • Leetcode-2080区间内查询数字的频率
  • 不可变集合
  • 机械学习--决策树(实战案例)
  • 【工程化】tree-shaking 的作用以及配置