查看: 1954|回复: 7

HUD划线问题

[复制链接]

该用户从未签到

发表于 2011-3-7 20:40:32 | 显示全部楼层 |阅读模式
osg::Node* createHUD()
{
osg::ref_ptr<osg::Geode> geode=new osg::Geode;
osg::ref_ptr<osg::Geometry> geom=new osg::Geometry;
geode->addDrawable(geom.get());
    //申请定点
osg::ref_ptr<osg::Vec3Array> coords=new osg::Vec3Array;
//申请颜色
osg::ref_ptr<osg::Vec4Array> colors=new osg::Vec4Array;
//申请法向量
osg::ref_ptr<osg::Vec3Array> norms=new osg::Vec3Array;
//打开透明度
geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
//设置定点颜色
geom->setColorArray(colors.get());
geom->setColorBinding(osg::Geometry::AttributeBinding::BIND_OVERALL);
//设置线宽
osg::ref_ptr<osg:ineWidth> width1=new osg::LineWidth;
//设置法向量
geom->setNormalArray(norms.get());
geom->setNormalBinding(osg::Geometry::AttributeBinding::BIND_OVERALL);
//压入法向量
norms->push_back(osg::Vec3(0.0,-1.0,0.0));
//设置线宽
width1->setWidth(5.0);
geom->getOrCreateStateSet()->setAttributeAndModes(width1.get(),osg::StateAttribute::ON);
//设置定点
geom->setVertexArray(coords.get());
geom->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet::Mode::LINE_STRIP,0,2));//LINE_STRIP
coords->push_back(osg::Vec3(0,0,0));
coords->push_back(osg::Vec3(1000,0,1000));
//coords->push_back(osg::Vec3(1000,0,600));
//coords->push_back(osg::Vec3(0,0,-600));
colors->push_back(osg::Vec4f(1.0,1.0,1.0,0.5));
colors->push_back(osg::Vec4f(1.0,1.0,1.0,0.5));
//colors->push_back(osg::Vec4f(1.0,1.0,1.0,0.5));
//colors->push_back(osg::Vec4f(1.0,1.0,1.0,0.5));



  //设置相机
osg::Camera* camera = new osg::Camera;
    camera->setViewMatrix(osg::Matrix::identity());
    camera->setRenderOrder(osg::Camera::POST_RENDER);//渲染顺序
camera->setClearMask(GL_DEPTH_BUFFER_BIT);
camera->setAllowEventFocus(false);
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  
//设置透视矩阵
  camera->setProjectionMatrix(osg::Matrix:rtho2D(0,1360,0,768));// 1360...768      
  camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

  camera->addChild(geode);
  return camera;  
};

int main( int argc, char **argv )
{     
     osgViewer::Viewer viewer;  

     osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("ceep.ive");
     osg::ref_ptr<osg::Group> group = new osg::Group;  
  group->addChild(scene);
     //if (scene.valid())group->addChild(scene.get());  
     group->addChild(createHUD());
     viewer.setSceneData(group.get());
     viewer.realize();
     viewer.run() ;   
     return 0;  
}

该用户从未签到

 楼主| 发表于 2011-3-7 20:42:12 | 显示全部楼层
请问,我用HUD划线,为什么线老是在窗口边框底处啊,在屏幕上看不到!请高手指点,谢谢

该用户从未签到

发表于 2011-3-8 13:51:27 | 显示全部楼层
既然您的HUD相机使用了默认的单位阵作为观察矩阵,按照OpenGL最基本的坐标系定义,此时人眼位于世界原点,Z+方向朝向脑后。因此(1000, 0, 1000)肯定是看不到的,它在您的眼睛后面!我想您期望的应该是(1000, 1000, 0)

该用户从未签到

发表于 2011-3-8 15:47:39 | 显示全部楼层
array??怎么绘制GL的标准呢??osg不是z+超上么?

该用户从未签到

发表于 2011-3-9 08:13:02 | 显示全部楼层
所谓的Z轴朝上事实上是一个误解,因为OSG的场景漫游器在设置初始位置时会自动改变视角为X向右Z向上。但是当您设置HUD相机为绝对参考系并设置观察矩阵为单位阵时,它不再受到漫游器的影响,而是符合OpenGL最基本的坐标系概念

该用户从未签到

发表于 2011-3-9 09:03:33 | 显示全部楼层
所谓的Z轴朝上事实上是一个误解,因为OSG的场景漫游器在设置初始位置时会自动改变视角为X向右Z向上。但是当 ...
array 发表于 2011-3-9 08:13


这个需要mark一下。

该用户从未签到

发表于 2011-3-9 11:46:18 | 显示全部楼层
所谓的Z轴朝上事实上是一个误解,因为OSG的场景漫游器在设置初始位置时会自动改变视角为X向右Z向上。但是当 ...
array 发表于 2011-3-9 08:13



    原来这样啊,这个确实没有注意到!!

该用户从未签到

 楼主| 发表于 2011-3-9 17:22:34 | 显示全部楼层
谢谢各位高手的建议,锐哥说的对,我试了一下果然呈现出我想要的结果,非常感谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表