
@CSDN冰翼无痕冰翼无痕-CSDN博客感谢支持!
提示:AI没有解决方案,有也是从这来的,目前全网独家,现在咋感觉ai都跟搜索引擎一样,家家自己做了个数据库搜索引擎工具,AI现在基本上是个搜索引擎2.0或3.0,有时间聊聊底层数学算法逻辑。
这里导出的格式为:.glb
使用unity Japan的开源插件,需要对插件进行一些修改
插件:com.vrmc.gltf
GLTF importer and exporter 2021.3
开始我们需要理解一下模型的构成,一般模型不会是一个整体,而是有节点一层一层的,因此一般模型会有个根节点,人物角色模型换装,更换武器等,也是根据模型的这个特性进行的。
一般模型的坐标系通常与unity的不一样,因此通常需要左右手坐标系转换
需要您将包放到:packet 下

1、将想要的模型都放在一个节点下
2、实例化加载模型
3、导出下载
步骤一:
cs
//实例化根节点
GameObject exportObj = new GameObject("Root");
//实例化模型
GameObject cloneObj = Instantiate(frameObj);
//归置坐标节点,到原点
exportObj.transform.position = cloneObj.transform.position;
//设置到子集
cloneObj.transform.SetParent(exportObj.transform);
步骤二:
cs
// ---------------------------UniGLTF--------------------------------------------
//设置模型导出的一些参数,(这是默认的)是在这里设置了一些数据块
var data = new ExportingGltfData();
//创建参数设置值
var settings = new GltfExportSettings
{
// 1. 解决位置偏移:保持模型原始坐标,不重置中心点
InverseAxis = Axes.Z,
// 2. 解决材质差异:是否保留纹理(WebGL建议设为true)
// 如果发现贴图丢失,请确保材质使用的是 Standard 或 UniGLTF 支持的 Shader
// 3. 解决顶点错乱:如果模型导出后变碎或面片反了,尝试切换此项
DivideVertexBuffer = true,
// 4. 解决蒙皮骨骼问题:如果是角色模型,确保导出当前的姿态
// UseCurrentShape = true
};
//创建导出
using (gltfExporter exporter = new gltfExporter(data, settings))
{
//设置实体对象
exporter.Prepare(exportObj);
//导出
exporter.Export();
}
//创建数据流
byte[] bytes = data.ToGlbBytes();
//下载导出,设置名称
DownloadFileByBin(bytes, "NewModel.glb");
// ---------------------------UniGLTF--------------------------------------------
//清理内存 立即销毁对象"obj"。强烈建议您使用"Destroy"函数。
DestroyImmediate(exportObj);
步骤三:下载的代码
cs
[DllImport("__Internal")]//这里得用一个三方插件
private static extern void BinFileDownloader(string str, string fn, string type);
/// <summary>
/// 传入二进制数据转二进制字符串
/// </summary>
/// <param name="binData"></param>
/// <param name="fileName"></param>
private static void DownloadFileByBin(byte[] binData, string fileName)
{
if (binData != null)
{
Debug.Log("Downloading..." + fileName);
//将二进制数据转化为js可识别的Base64String
BinFileDownloader(System.Convert.ToBase64String(binData), fileName, "application/octet-stream");
}
}
以上为关键部分代码,分析,他们写的这个还是比较明确的,具体内容略,这也不是新手该看的内容,上面足够解决使用问题了
cs
public virtual void Prepare(GameObject go)
{
// コピーを作って左手系を右手系に変換する
//制作副本并将左手系转换为右手系
Copy = GameObject.Instantiate(go);
Copy.transform.ReverseRecursive(m_settings.InverseAxis.Create());
// Export の root は gltf の scene になるので、
// エクスポート対象が単一の GameObject の場合に、
// ダミー親 "m_tmpParent" を一時的に作成する。
// 由于导出的根节点将成为 glTF 的场景,
// 因此当导出对象为单个游戏对象时,
// 临时创建一个虚拟父对象 "m_tmpParent"。
//
// https://github.com/vrm-c/UniVRM/pull/736
if (Copy.transform.childCount == 0)
{
m_tmpParent = new GameObject("tmpParent");
Copy.transform.SetParent(m_tmpParent.transform, true);
Copy = m_tmpParent;
}
if (Copy.transform.TryGetComponent<Renderer>(out var r))
{
// should throw ?
UniGLTFLogger.Error("root mesh is not exported");
}
ReportProgress("prepared", 0.1f);
}
插件上传到csdn,免费
放置路径位置:
