OSG 将模型坐标移至0点,并保存
前言:好久没时间写博客了,更别说是OSG相关了,今天由于需要处理模型,发现导入的模型都自带坐标,就写个批处理。
问题
原始模型自带坐标,将模型坐标移至原点。
步骤
- 首先得到模型
Center
- 将模型加入
MatrixTransform
节点中,设置平移距离为-Center
- 将
MatrixTransform
转成Node
节点保存
示例代码
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/PositionAttitudeTransform>
#include <osg/MatrixTransform>
#include <string>
#include <iostream>
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
viewer->setUpViewInWindow(100, 100, 1080, 960);
osg::ref_ptr<osg::Group> root = new osg::Group();
std::string readPath = "ChineseChess/";
std::string writePath = "NewChineseChess/";
osg::ref_ptr<osg::Node> chess = osgDB::readNodeFile(readPath + "readModel.ive");
if (chess.valid()) {
osg::Vec3 chessCenter = chess->getBound().center();
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
mt->setMatrix(osg::Matrix::translate(-chessCenter));
mt->addChild(chess);
chess = mt->asNode();
}
osgDB::writeNodeFile(*chess, writePath + "writeModel.ive");
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0;
}