osg绘制圆角矩形气泡

在网上找了好多好像没有看到有些圆角矩形的,只看到一个绘制圆形矩形(类似学习操场的跑道);根据那个写了一个求圆角矩形的函数

void arrayVac(double v[90][2],double x=0,double y=0)//v 顶点数组、x,y 鼠标点击位置
{
    double r=0.5;//圆角半径
    double angle0=0.f; //圆角度  右上
    double angle1=osg::PI/2; //圆角度  左上
    double angle2=osg::PI; //圆角度  左下
    double angle3=3*osg::PI/2; //圆角度  右下
    for (int i=0;i<90;i++)
    {
        //矩形部分
        switch (i)
        {

        case 2://0
            v[i][0]=0.5+x;
            v[i][1]=-0.6+y;
            break;
        case 1://1
            v[i][0]=0+x;
            v[i][1]=0+y;
            break;
        case 0://2
            v[i][0]=1.5+x;
            v[i][1]=-0.6+y;
            break;
        case 89://3
            v[i][0]=2.5+x;
            v[i][1]=-0.6+y;
            break;
        case 67://24
            v[i][0]=3+x;
            v[i][1]=-1.1+y;
            break;
        case 66://25
            v[i][0]=3+x;
            v[i][1]=-2.1+y;
            break;
        case 45://46
            v[i][0]=2.5+x;
            v[i][1]=-2.6+y;
            break;
        case 44://47
            v[i][0]=0.5+x;
            v[i][1]=-2.6+y;
            break;
        case 23://68
            v[i][0]=0+x;
            v[i][1]=-2.1+y;
            break;
        case 22://69
            v[i][0]=0+x;
            v[i][1]=-1.1+y;
            break;
        }
        //右上
        if (i>67&&i<89)
        {//(2.5,-1.1)
            v[i][0]=r*cosf(angle0)+2.5+x;                        //circle1[i][0] = radius * cosf(angle);
            v[i][1]=r*sinf(angle0)-1.1+y;                        //circle1[i][1] = radius * sinf(angle);
            angle0+=    2.0*osg::PI/80;                                //angle += 2.0*osg::PI / 35.0;
        }
        //左上
        if (i>2&&i<22)
        {//(0.5,-1.1)
            v[i][0]=r*cosf(angle1)+0.5+x;        
            v[i][1]=r*sinf(angle1)-1.1+y;        
            angle1+=    2.0*osg::PI/80;                    
        }
        //左下
        if (i>23&&i<44)
        {//(0.5,-2.1)
            v[i][0]=r*cosf(angle2)+0.5+x;            
            v[i][1]=r*sinf(angle2)-2.1+y;            
            angle2+=    2.0*osg::PI/80;                    
        }
        //右下
        if (i>45&&i<66)
        {//(2.5,-2.1)
            v[i][0]=r*cosf(angle3)+2.5+x;    
            v[i][1]=r*sinf(angle3)-2.1+y;    
            angle3+=    2.0*osg::PI/80;                    
        }        
        //std::cout<<angle*180/3.14<<std::endl;    

        //计算纹理坐标
        coord[i][0]=(vertex[i][0]-x)/(3.0);
        coord[i][1]=(vertex[i][1]-y)/(-2.6);
    }

}

其中圆角部分我都是按照四分之一的扇形绘制的,之前由于绘制没注意顺序一直绘制不出来,后来发现要逆时针绘制,并且还要计算好点号;特别是矩形部分点号与扇形区域点号

每个扇形我分成20分,一个圆就是80份,所以在求angle的时候除以80,其实没必要分成angle0、1、2、3,不过我是刚开始实验,后面加减的x、y是希望以后添加鼠标点击位置显示。

调用函数计算几何坐标以及纹理坐标:

	osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();//多边形绘制
	osg::ref_ptr<osg::Texture2D>tex=new osg::Texture2D();//纹理
	osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();//顶点
	osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array();//法线
	osg::ref_ptr<osg::Geode> geode = new osg::Geode();	//组节点
    



    //圆角矩形顶点坐标
	arrayVac(vertex);
	for (int i=0;i<90;i++)
	{
		v->push_back(osg::Vec3(vertex[i][0],vertex[i][1],0.0));
	}

    
	//设置纹理坐标
	osg::ref_ptr<osg::Vec2Array>coord1 = new osg::Vec2Array;	
	//圆角矩形纹理坐标
	for (int i=0;i<90;i++)
	{
		coord1->push_back(osg::Vec2(coord[i][0],coord[i][1]));
	}

将坐标添加到geom(Geometry)就OK啦。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 OpenSceneGraph 中,可以使用 `osg::Geometry` 类来绘制曲线。 以下是一个简单的示例代码,用于绘制一条二次贝塞尔曲线: ``` osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; vertices->push_back(osg::Vec3(0, 0, 0)); // 起点 vertices->push_back(osg::Vec3(1, 2, 0)); // 控制点 vertices->push_back(osg::Vec3(2, 0, 0)); // 终点 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; geom->setVertexArray(vertices); osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array; colors->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0)); // 曲线颜色 geom->setColorArray(colors); geom->setColorBinding(osg::Geometry::BIND_OVERALL); osg::ref_ptr<osg::DrawArrays> drawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, 100); geom->addPrimitiveSet(drawArrays); osg::ref_ptr<osg::Geode> geode = new osg::Geode; geode->addDrawable(geom); osgViewer::Viewer viewer; viewer.setSceneData(geode); viewer.realize(); viewer.run(); ``` 在这个示例中,我们首先创建了包含曲线顶点的 `osg::Vec3Array` 对象,然后将其设置为几何体的顶点数组。接着,我们创建了一个 `osg::Vec4Array` 对象来设置曲线的颜色,并将其绑定到几何体上。最后,我们创建了一个 `osg::DrawArrays` 对象来设置绘制方式,并将其添加到几何体的原语集合中。最后,我们将几何体添加到 `osg::Geode` 中,并将其设置为场景图的根节点。 你可以根据需要修改这个示例代码来绘制不同类型的曲线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值