矩阵变换、osg的回调、动画路径和Geometry

1、矩阵变换

数学基础参照前一篇。

首先,我们在构建对象的时候都是采用的局部坐标系,

如下例创建了一个Node对象,几何图元为一个三角形,构造图元的过程中用到的坐标都在局部坐标系(或对象坐标系)

osg::ref_ptr<osg::Node> creatNode( )
	{
		

		osg::ref_ptr<osg::Geode> geode = new osg::Geode;
		osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

		osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
		osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
		osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;

		geom->setVertexArray(vertices.get());

		geom->setColorArray(colors.get());
		geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

		geom->setNormalArray(normals.get());
		geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

		normals->push_back(osg::Vec3(0.0, -1.0, 0.0));

	

		
		vertices->push_back(osg::Vec3(0, 0.0,0));
		vertices->push_back(osg::Vec3(-1, 0, -1));
		vertices->push_back(osg::Vec3(1, 0, -1));


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

                geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,0,3));
                geode->addDrawable(geom.get());
                geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
                geode->getOrCreateStateSet()->setMode(GL_RESCALE_NORMAL, osg::StateAttribute::ON);//开启混合             
                geode->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
                return geode.release();
}
要将对象放到场景中,就需要进行坐标变换,把物体加到世界中,需要对象坐标到世界坐标系的变换。

注意:这里是坐标系的变换而不是对象坐标的变换。

首先根节点是世界坐标系,它的子节点下的坐标系都是对象坐标系(或局部坐标系)。

如世界坐标系中某一点P0(1,1,1),局部坐标系中坐标为P1(0,0,0),那么坐标系的变换其实是坐标轴的变换,

局部坐标系的原点在世界坐标系的(1,1,1)点。

如果从坐标系的变化来看:是物体坐标系中的对象不变,坐标轴从(0,0,0)移动(-1,-1,-1),

所以osg::MatrixTransform mt节点坐标系如果要变换到局部坐标系,世界坐标系需进行变换坐标轴+osg::Vec3(1,1,1)-osg::Vec3(0,0,0)=+osg::Vec(1,1,1)

即mt->setMatrix(osg::Matrix::translate(osg::Vec(1,1,1)));

如果从对象的角度来看:应该是所有对象从局部坐标系到世界坐标系的坐标需要进行矩阵变换+osg::Vec(1,1,1)。

所以给定局部坐标系一点P1,求它在世界坐标系中的坐标P0(x+a,y+b,z+c,1)=P1(x,y,z,1)*M

所以如果有多个变换,M1*M2*M3,一般为P1*M1*M2*M3的顺序。

所以如果要把上面的几何体在世界坐标系中的坐标都+(a,b,c),添加到场景时应该如下表示

osg::ref_ptr<osg::MatrixTransform> waveMT = dynamic_cast<osg::MatrixTransform*>(node);
waveMT->addChild(createNode());
waveMT->setMatrix(osg::Matrix::translate(osg::Vec3(a,b,c));
osg中有两个比较重要的基本变换矩阵

一个是osg::MatrixTransform,一般用来控制物体对象的初始位置、大小比例和角度。建模

另外一个osg::PositionAttitudeTransform一般用来控制物体的位置和姿态。控制

2、几何图元

3、回调

4、动画路径

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值