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一般用来控制物体的位置和姿态。控制