osg 在场景中绘制坐标轴(xyz)

//x y z font_size
osg::Geode* makeCoordinate(float a_x,float a_y,float a_z,float font_size)
{
    osg::ref_ptr<osg::Sphere> pSphereShape = new osg::Sphere(osg::Vec3(0, 0, 0), 1.0f);
    osg::ref_ptr<osg::ShapeDrawable> pShapeDrawable = new osg::ShapeDrawable(pSphereShape.get());
    pShapeDrawable->setColor(osg::Vec4(0.0, 0.0, 0.0, 1.0));

    //创建保存几何信息的对象
    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(a_x, 0.0f, 0.0f));

    v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
    v->push_back(osg::Vec3(0.0f, a_y, 0.0f));
    v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));

    v->push_back(osg::Vec3(0.0f, 0.0f, a_z));
    geom->setVertexArray(v.get());

    osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array();
    c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
    c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); 

    c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
    c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
    c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); 

    c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));
    geom->setColorArray(c.get());
    geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

    //xyz
    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2));
    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 2, 2));
    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 4, 2));

    osg::ref_ptr<osgText::Text> pTextXAuxis1 = new osgText::Text;
    pTextXAuxis1->setText(L"X");
    pTextXAuxis1->setFont("Fonts/simhei.ttf");

    pTextXAuxis1->setAxisAlignment(osgText::Text::SCREEN);
    pTextXAuxis1->setCharacterSize(font_size);
    pTextXAuxis1->setPosition(osg::Vec3(a_x, 0.0f, 0.0f));

    osg::ref_ptr<osgText::Text> pTextYAuxis1 = new osgText::Text;
    pTextYAuxis1->setText(L"Y");
    pTextYAuxis1->setFont("Fonts/simhei.ttf");

    pTextYAuxis1->setAxisAlignment(osgText::Text::SCREEN);
    pTextYAuxis1->setCharacterSize(font_size);
    pTextYAuxis1->setPosition(osg::Vec3(0.0f, a_y, 0.0f));

    osg::ref_ptr<osgText::Text> pTextZAuxis1 = new osgText::Text;
    pTextZAuxis1->setText(L"Z");
    pTextZAuxis1->setFont("Fonts/simhei.ttf");

    pTextZAuxis1->setAxisAlignment(osgText::Text::SCREEN);
    pTextZAuxis1->setCharacterSize(font_size);
    pTextZAuxis1->setPosition(osg::Vec3(0.0f, 0.0f, a_z));

    osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    geode->getOrCreateStateSet()->setAttribute(new osg::LineWidth(3.0), osg::StateAttribute::ON);

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

    geode->addDrawable(pTextYAuxis1.get());
    geode->addDrawable(pTextZAuxis1.get());

    return geode.release();
}

效果图片:

参考:https://blog.csdn.net/sun222555888/article/details/52083413

原文地址:https://www.cnblogs.com/herd/p/11150548.html

时间: 2024-08-30 01:44:01

osg 在场景中绘制坐标轴(xyz)的相关文章

OSG项目经验2&lt;在场景中添加文字面版&gt;

添加文字版需要用到osg的三个名字空间: osgText::Text,这个类用来添加文字和设置文字的一些属性: osg::Geometry,这个类用来画常见的图形: osg/ShapeDrawable,通过这个类也可以画一些常见的图形,并且可以吧Geometry加进osg::Geode节点中: 下面先简要介绍一下这三个命名空间: 1.osgText::Text:见http://www.cnblogs.com/xiaocainiao2hao/p/4544273.html 2.OSG::Gemote

CSharpGL(6)在OpenGL中绘制UI元素

CSharpGL(6)在OpenGL中绘制UI元素 主要内容 学习使用IUILayout接口及其机制,以实现在OpenGL中绘制UI元素. 以SimpleUIAxis为例演示如何使用IUILayout. 下载 您可以在(https://github.com/bitzhuwei/CSharpGL)找到最新的源码.欢迎感兴趣的同学fork之. 什么是OpenGL中的UI元素 您可以在源码中找到SimpleUIAxis这一示例. 如上图所示,有5个坐标轴,中间那个是一个普通的三维模型(元素),作为对照

OSG实现场景漫游(转载)

OSG实现场景漫游 下面的代码将可以实现场景模型的导入,然后在里面任意行走,于此同时还实现了碰撞检测. 源代码下载地址: 1 /* 2 * File : Travel.cpp 3 * Description : 4 * Author : GuoShaoHao 5 * E-mail : [email protected] 6 * Date : 2011/01/08 7 * 8 * CopyRight @ South China Institute of Software Engineering,.

OSG 自定义场景漫游示例

一下代码可以简单实现osg中视角的简单自由漫游.并且可以进行简单的碰撞检测 mian.cpp 1 #include <osgViewer/Viewer> 2 3 #include <osg/Node> 4 #include <osg/Geode> 5 #include <osg/Group> 6 7 #include <osgDB/ReadFile> 8 #include <osgDB/WriteFile> 9 10 #include

Opengl场景中加光照包含几个步骤

http://zuoye.baidu.com/question/44e2a82d7ad5c0e1d33ddb9a40e0bf86.html  Opengl场景中加光照包含几个步骤,各个步骤实现用的函数是什么?这两个问题回答清楚就行了,不用说别的.粘贴的一律无视. 小白小菜0026 2014-10-10 优质解答下载作业帮App,拍照秒答 主要分三步:设置光源参数 .开启光照.设置法线信息. 1.设置光源参数.通过多次调用带有不同参数的glLightfv()函数来实现.一般会设置环境光(Ambie

[5.1] D3.js中整合坐标轴 - 图表 - 文字标签

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 前面几节讲解了图标.坐标轴.比例等等,这一节整合这些内容做一个实用的图表.结果图如下: 代码如下所示: <html> <head> <meta charset="utf-8"> <title>Chart</title> </head> <style> .axis pat

在3D空间中绘制四边形

在3D空间中绘制四边形 四边形 GL_QUADS OpenGL的GL_QUADS图元用于绘制四边形,它根据每四个顶点绘制一个四边形. 注意,在使用四边形时,必需记住一个重要规则:一个四边形的四个角必须位于同一个平面中(不存在弯曲的四边形).如图所示 四边形带 GL_QUAD_STRIP 该图元指定一个连接的四边形带.它们都保持相同方向的环绕.如图所示 通用多边形 GL_POLYGON 我们可以用它绘制任意数量的多边形.与四边形一样,多边形的所有顶点也必须位于同一平面中.如果想越过这个规则,可以采

Threejs场景中的基本组件

总序 相机:决定哪些东西将要在屏幕上渲染 光源:决定对材质会如何显示和生成阴影的使用 物体: 相机中被渲染的对象 Scene场景的几个方法 Scene.add(object);//往场景中添加物体 Scene.remove(object);//场景中去除物体 Scene.children;//Scene的子对象列表:数组吧,包括相机和光源 Scene.getChildByName()//通过物体的name属性访问该物体 在var cude=-时候可以设定cude.name为"方块1"

NVisionXR_iOS教程七 —— 场景中物体运动

本章节教大家如何让立方体按照自己想要的轨迹运动. 添加头文件#import''NVAnimationEffect.h'',在onCreate方法中实例该动画类,代码如下图: 1.立方体移动  代码:    /**       * 构建一个NVAnimationEffect对象       * name 可以随便取,但是要唯一       * context 传入场景即可       * widget 作用的NVWidget对象,本例传入的是立方体       * duration 运动的总时长