OSG ProxyNode 代理节点

ProxyNode

类似一棵树的一个目录,将一棵树下的所有节点重新记录在Proxynode中。
通过ProxyNode可以重新实现节点的排列,可以 通过ProxyNode实现对原树进行一个“封装",可以通过调用ProxyNode实现对节点的调用。

理解

ProxyNode中只包含节点名(路径),可以实现与原树不同的节点排列结构,与原树的效果可以相同。

语法

  • 将节点加入ProxyNode

第一个参数是位置,第二个参数是地址
osg不带纹理,osgb带纹理

m_pProxyNode->setFileName(0,“node.osgb”);

  • 将代理节点写入地址

第一个参数是代理节点名,第二个参数是写入的地址,第三个参数是选项(可不写)

osgDB::writeNodeFile(*m_pProxyNode, “proxy.osg”,opt);

option

是对读取出来的节点进行处理的对象
userOriginalExternalReferences使用原依赖noWriteExternalReferenceFiles改为新依赖(引用路径)
OutputTextureFiles保存时导出纹理

代码


	osg::ref_ptr<osgDB::Options> opt = new osgDB::Options;
	opt->setOptionString("noWriteExternalReferenceFiles");
	//把代理节点写入此地址
	osgDB::writeNodeFile(*m_pProxyNode, "proxy.osg",opt);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要让子节点绕其中心旋转,您可以使用 `osg::MatrixTransform` 类来对子节点进行变换。下面是一个示例代码片段,展示了如何使用 OSG 让子节点绕其中心旋转: ```cpp #include <osg/MatrixTransform> #include <osgDB/ReadFile> #include <osgViewer/Viewer> int main() { // 加载场景文件 osg::ref_ptr<osg::Node> scene = osgDB::readNodeFile("path/to/your/scene.osg"); // 创建 MatrixTransform 节点作为根节点 osg::ref_ptr<osg::MatrixTransform> root = new osg::MatrixTransform; root->addChild(scene); // 创建 MatrixTransform 节点作为子节点 osg::ref_ptr<osg::MatrixTransform> child = new osg::MatrixTransform; // 设置子节点的变换矩阵,将其平移到世界坐标系的某个位置 osg::Matrix translateMatrix; translateMatrix.makeTranslate(osg::Vec3(1.0, 0.0, 0.0)); // 平移 1.0 个单位到 X 轴正方向 child->setMatrix(translateMatrix); // 创建旋转节点,将其作为子节点的子节点 osg::ref_ptr<osg::MatrixTransform> rotate = new osg::MatrixTransform; // 设置旋转节点的中心点 rotate->setReferenceFrame(osg::Transform::ABSOLUTE_RF); rotate->setMatrix(osg::Matrix::translate(-1.0, 0.0, 0.0)); // 将中心点平移到 X 轴负方向 // 添加子节点到旋转节点 rotate->addChild(child); // 将旋转节点添加到根节点 root->addChild(rotate); // 创建查看器并设置根节点 osgViewer::Viewer viewer; viewer.setSceneData(root); // 设置旋转动画 float angle = 0.0; while (!viewer.done()) { angle += 0.01; // 每次迭代增加旋转角度 // 创建旋转矩阵 osg::Matrix rotationMatrix; rotationMatrix.makeRotate(angle, osg::Vec3(0.0, 0.0, 1.0)); // 绕 Z 轴旋转角度 // 设置子节点的变换矩阵,实现旋转 child->setMatrix(rotationMatrix); // 更新视图 viewer.frame(); } return 0; } ``` 在上面的示例中,我们加载了一个场景文件,并创建了一个 `osg::MatrixTransform` 节点作为根节点。然后,我们创建了一个子节点,并使用变换矩阵将其平移到世界坐标系的某个位置。接下来,我们创建了一个旋转节点,并将子节点添加为其子节点。我们还设置了旋转节点的中心点,并将其添加到根节点中。 然后,我们创建了一个 `osgViewer::Viewer` 对象,并将根节点设置为场景数据。在一个循环中,我们更新旋转角度,并根据旋转角度创建旋转矩阵。然后,我们将旋转矩阵设置为子节点的变换矩阵,以实现子节点绕其中心旋转的效果。 请注意,上述代码中的路径 `"path/to/your/scene.osg"` 需要替换为您实际的场景文件路径。此外,您可以根据需要调整旋转角度的增量和动画速度。 希望对您有所帮助!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值