添加斜面描述变量

为了指定斜面的倾斜角度,需要添加一些描述角度的变量,此处为了简化,只添加了俯仰角(及绕物体x轴旋转的角度)。代码如下:

double pitch = osg::PI * 30 / 180;  //  仰角30度.

添加结点回调函数类MyRotateCallback

添加结点回调函数类MyRotateCallback,代码如下:

class MyRotateCallback: public osg::NodeCallback
{
public:MyRotateCallback() {m_rotate = 0;    //  旋转角度(弧度)}~MyRotateCallback() {}virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {ModelNode* mn = dynamic_cast<ModelNode*>(node);if (mn) {osg::Quat q1(pitch, osg::X_AXIS,0, osg::Y_AXIS,0, osg::Z_AXIS);osg::Matrix m;q1.get(m);osg::Vec3d axis = m.preMult(osg::Vec3d(0, 0, 1));osg::Quat q2(m_rotate, -axis);mn->setLocalRotation(q1*q2);m_rotate += 0.01;   //  每次增加0.01弧度if (m_rotate >= 2 * osg::PI)m_rotate -= 2 * osg::PI;}}protected:double m_rotate;    //  旋转角度(弧度)
};

重写圆括号运算符。两个四元数相乘,表示物体绕过原点的轴连续转动。axis是物体自身Z轴在空间坐标系中的投影。需要理解四元数的相关概念和性质。

添加参照倾斜面

为了显示效果,画一个倾斜的圆作为参照面,代码如下:

{   //  添加一个圆,用作倾斜的参照平面Style circleStyle;circleStyle.getOrCreate<PolygonSymbol>()->fill()->color() = Color(Color::Cyan, 0.5);circleStyle.getOrCreate<AltitudeSymbol>()->clamping() = AltitudeSymbol::CLAMP_ABSOLUTE;circleStyle.getOrCreate<AltitudeSymbol>()->technique() = AltitudeSymbol::TECHNIQUE_DRAPE;CircleNode* circle = new CircleNode();circle->set(GeoPoint(geoSRS, 116.333, 39.9, 100000., ALTMODE_RELATIVE),Distance(300, Units::KILOMETERS),circleStyle,Angle(0.0, Units::DEGREES),Angle(0.0, Units::DEGREES),true);circle->setLocalRotation(osg::Quat(pitch, osg::X_AXIS,0, osg::Y_AXIS,0, osg::Z_AXIS));annoGroup->addChild(circle);editGroup->addChild(new CircleNodeEditor(circle));
}

创建圆锥体

创建圆锥的代码如下:

{//  添加圆锥体double angle = 30;      //  圆锥体顶角(度)double length = 100;    //  圆锥体高度osg::Vec4 color(0.0, 1.0, 0.0, 0.5);  //  颜色double angleD = osg::DegreesToRadians(angle);       //  圆锥体顶角转为弧度double radius = std::tan(angleD * 0.5) * length;    //  底面半径int splitCount = 40;    //  底面圆分割个数double angleStep = osg::PI * 2.0 / splitCount;  //  角度变化步长osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;osg::ref_ptr<osg::Vec3Array> vertex = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array;osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt = new osg::DrawElementsUInt(GL_TRIANGLE_FAN);osg::ref_ptr<osg::DrawElementsUInt> drawElemUInt2 = new osg::DrawElementsUInt(GL_TRIANGLE_FAN);geom->setVertexArray(vertex);geom->setNormalArray(normal);vertex->push_back(osg::Vec3(0, 0, 0));drawElemUInt->push_back(0);normal->push_back(osg::Vec3(0, -1, 0));//侧面for (int i = 0; i <= splitCount; i++) {double tempAngle = i * angleStep;osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);vertex->push_back(osg::Vec3(pos));pos.normalize();normal->push_back(pos);drawElemUInt->push_back(i + 1);}//底面int indexBegin = vertex->size();vertex->push_back(osg::Vec3(0, length, 0));drawElemUInt2->push_back(indexBegin);normal->push_back(osg::Vec3(0, 1, 0));for (int i = 0; i <= splitCount; i++) {double tempAngle = i * angleStep;osg::Vec3 pos(radius * cos(tempAngle), length, radius * sin(tempAngle) + 3);vertex->push_back(osg::Vec3(pos));normal->push_back(osg::Vec3(0, 1, 0));drawElemUInt2->push_back(indexBegin + i + 1);}geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);geom->addPrimitiveSet(drawElemUInt);geom->addPrimitiveSet(drawElemUInt2);//创建材质对象osg::ref_ptr<osg::Material> mat = new osg::Material;//设置正面散射颜色mat->setDiffuse(osg::Material::FRONT_AND_BACK, color);//1.0, 0.0, 0.0, 0.3//设置正面镜面颜色mat->setSpecular(osg::Material::FRONT_AND_BACK, color);//1.0, 0.0, 0.0, 0.3//mat->setColorMode(osg::Material::ColorMode::AMBIENT_AND_DIFFUSE);geom->getOrCreateStateSet()->setAttribute(mat.get());geom->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);//设置透明效果geom->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);geom->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);//  创建ModelNode对象Style modelStyle;modelStyle.getOrCreateSymbol<ModelSymbol>()->setModel(geom);osg::ref_ptr<ModelNode> modelNode = new ModelNode(mapNode, modelStyle);//  放大以便于观察modelNode->setScale(osg::Vec3f(10000.0, 10000.0, 10000.0));//  指定经纬高modelNode->setPosition(osgEarth::GeoPoint(geoSRS, 116.333, 39.9, 100000));modelNode->addUpdateCallback(new MyRotateCallback());annoGroup->addChild(modelNode);}

创建圆锥体的代码参考了“OsgEarth添加圆锥体”( OsgEarth添加圆锥体_wb175208的专栏-CSDN博客 )WaveBeamCone::createWaveBeamCone的相关代码。

运行效果展示

使用免费软件GifCam( Download GifCam - free - latest version  )录屏制作的gif文件如下:

上一篇:  osgEarth显示绕端点旋转的线段

osgEarth在斜面内绕自身Z轴旋转的锥体相关推荐

  1. 18.外部相机校准——旋转(Rotation),R是什么样子的,绕Z轴旋转的例子,齐次坐标旋转_2

    目录 旋转(rotation) R是什么样子的 绕Z轴旋转的例子 齐次坐标旋转 旋转(rotation) 现在生活变得更加丑陋,旋转(rotation).我这里有一个图,或者我想这也是来自四边复合幻灯 ...

  2. three.js orbitcontrol更改绕x轴与z轴旋转

    我们在threejs模型中可以引入orbitcontrol来控制模型交互动作,但orbitcontrol默认是以y轴为正向上轴,即旋转的时候绕x轴和y轴旋转 但我现在想让绕x轴和z轴旋转,方法是 ca ...

  3. 车削加工编程一般包含X和Z坐标运动及绕Z轴旋转的转角坐标

    车削加工编程一般包含X和Z坐标运动及绕Z轴旋转的转角坐标C .­ (1)快速定位(G00或G0) 刀具以点位控制方式从当前所在位置快速移动到指令给出的目标位置.­ 指令格式:G00 X(U) Z(W) ...

  4. 直线绕z轴旋转所成曲面的方程

    直线:(x-x0)/L=(y-y0)/M=(z-z0)/N绕z轴旋转所成曲面的方程为: x2+y2=α+β(z-z0)+γ(z-z0)2 其中 α=x02+y02 β=(2/N)(Lx0+My0) γ ...

  5. matlab中如何转动三维图_MATLAB小技巧之:绕任意空间轴旋转三维图形

    x=1:0.1:10; y=sin(x); c=cosd(15); s=sind(15); X=x*c-y*s; Y=x*s+y*c; plot(x,y) hold on plot(X,Y) 这就是新 ...

  6. Unity控制物体沿x、y、z轴旋转

    普通旋转 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Rota ...

  7. CABasicAnimation x y z 轴旋转动画

    x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...

  8. matlab线旋转成面,用matlab怎么绘制一条曲线绕z轴旋转生成的曲面?

    用matlab怎么绘制一条曲线绕z轴旋转生成的曲面? 已知数据如下: x z y -398.10815554637100 391.8559758318630 690.066133543041 -381 ...

  9. unity 里让一个物体围绕x,y,z轴旋转起来。

    如何 在unity 里让一个物体围绕x,y,z轴旋转起来? 先看下效果:  如何 在unity 里让一个物体围绕x轴旋转起来?答案揭晓: 实现代码: using System.Collections; ...

最新文章

  1. JS如何设置打开页面后将光标定位在指定的输入框?
  2. 生成器generator
  3. 设备和驱动在第一次加载,会遍历总线
  4. Java 调用接口工具类并设置请求和传输超时时间
  5. FATE HDU - 2159(二维完全背包)
  6. Docker挂了,数据如何找回
  7. coco2d-js 多屏适配相关API
  8. Real-time 节点
  9. APP推广运营经验总结
  10. 【博客管理】博客新建栏目的添加—HTML格式书写规范
  11. Ubuntu 12.04下Proftpd FTP服务器配置
  12. 输入一个年份,并判断是否为闰年
  13. ARCore 之路:如何创建一个 ARCore 程序?
  14. 「镁客·请讲」移康智能朱鹏程:做产品就要直击痛点,多余的功能只会是噱头...
  15. 安卓的SoundPool(音效池)播放声音(及具体参数解析)
  16. 陈艾盐:《春燕》百集访谈节目第三十九集
  17. 计算机系统仿真缩写,仿真语言
  18. 是时候该学会 MMDetection 进阶之非典型操作技能(一)
  19. 极简汉字史 第一章 文象列而结绳移 鸟迹明而书契作
  20. 征途研发元老披露成功内幕

热门文章

  1. 大家人寿大幅减持,金地集团良好融资局面还能延续多久?
  2. ArcGIS JS API 4.x(二) 加载 3.x所说的动态地图服务图层
  3. 举个例子丨什么是量子计算机?比常规计算机强在哪里?
  4. 对接转账到支付宝账户API接口流程步骤
  5. 目前软搭建测试的行业现状和前景
  6. App Inventor 2能编译出苹果iOS版App吗?
  7. endcap和welltap_ICC布局规划
  8. acill排序 java_java – 如何根据ascii值对ArrayList的元素进行排序?
  9. 风影墙纸,一天看N回。
  10. FPGA串口收发(四):接收数据并转发,间隔时间发送