前段时间有个需求在unity中读取公司自创的模型格式, 由于公司开发中心使用的是OSG引擎,查看代码 发现他们实现在OSG引擎渲染本公司自创模型, 中间一步是将 自创的模型格式转化为osg格式.
虽然ive 提供了源码插件,但是转成C#实现毕竟太麻烦, 我于是 写了个插件由 osg读取ive模型顶点和索引等数据再传递给unity.
通过 p/invoke 传递简单结构体,可以很同意实现,但 顶点和索引等都是不确定的. 于是用熟悉的protobuf 实现了思路.
由于是项目,所以不便发全部代码
从osg传递数据给unity部分代码
1 2 3 4 5 6 7 8 9 10 11 12 |
UnityExport void ReadIVEFile(const char* path, unsigned char** data, int* size) { std::string str = path; shared_ptr<IveReader> ir = std::make_shared<IveReader>(str); const size_t s = ir->unitygroup->ByteSizeLong(); void* buffer = malloc(s); ir->unitygroup->SerializeToArray(buffer, s); *data = static_cast<unsigned char*>(buffer); *size = s; } |
通过apply函数读取顶点等数据
1 2 3 4 |
void apply(osg::Switch& swch) override; void apply(osg::Geode& geode) override; void apply(osg::PagedLOD& pagedLod) override; void apply(osg::MatrixTransform& mt) override; |
C#端读取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public Group ReadIVE(string path) { ReadIVEFile(path, out var gData, out var gSize); var arr = new byte[gSize]; Marshal.Copy(gData, arr, 0, gSize); var group = Group.Parser.ParseFrom(arr); if (gData != IntPtr.Zero) { Marshal.FreeHGlobal(gData); } return group; } |
最后加载的模型为

转载请注明:veyvin » Osg读取ive模型提供给unity使用