1 前言

​ libGDX 提供了自己的 3D 格式模型文件,称为 G3D,包含 g3dj(Json 格式)和 g3db(Binary 格式)文件,官方介绍见 → importing-blender-models-in-libgdx

​ 对于 fbx 文件,libGDX 提供了转换为 G3D 文件的工具,即 fbx-conv.exe,官方下载见 → fbx-conv,读者也可以从 Libgdx全套工具包 里下载 fbx-conv.exe 工具。

​ fbx-conv 是一个命令行工具,基于命令实现 G3D 格式转换,用户也可以使用图形化工具,即 fbxconv-gui.jar,官方下载见 → libgdx-fbxconv-gui。fbxconv-gui.jar 依赖 fbx-conv.exe,因此需要将他们放在同一个文件夹里面。

​ 一个模型(g3dj 或 g3db 文件)可以包含多个网格,每个网格通过索引顶点构造三角形,libGDX 使用的索引是 short 类型。Java 中最大 short 值是 32767,因此,不能在一个网格中使用超过 32767 个顶点(除非修改 libGDX 源码)。

2 fbx 转换为 g3dj

1)通过命令转换 g3dj 文件

​ 在 fbx-conv.exe 文件所在的目录下面打开 cmd 命令行窗口,执行以下命令,将 Spiderbot.fbx 文件转换为 Spiderbot.g3dj 文件。

// -v: 打印模型详细信息, -f: 强制转换(可能覆盖现有文件而无需确认)
// -m: 每个网格最大顶点个数; -b: 每个人物的最大骨骼数; -w: 每个顶点的最大骨骼权重
// fbx-conv -f -o G3DJ Spiderbot.fbx
fbx-conv.exe -v -f -m 32767 -b 12 -w 4 Spiderbot.fbx Spiderbot.g3dj

2)通过图形化窗口转换 g3dj 文件

​ 双击 fbxconv-gui.jar 文件打开 libGDX 模型预览工具窗口,按以下配置转换模型格式。

​ 在 Output Console 窗口可以查看转换日志,如果提示加载 Texture 失败,是因为图片引用出现问题,我们可以修改 Spiderbot.g3dj 文件中图片资源的路径,使其指向正确的图片。

​ Spiderbot.g3dj 中修改图片资源路径的地方,如果图片资源丢失,可以删除 textures 节点。

3 加载 g3dj 模型

​ 本节同过 G3dModelLoader 加载 g3dj 文件,通过 Model、ModelInstance、ModelBatch 渲染模型,通过 CameraInputController 控制相机运动,完整代码资源见 → libGDX加载G3DJ模型

​ DesktopLauncher.java

package com.zhyan8.game;

import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; public class DesktopLauncher {
public static void main (String[] arg) {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setForegroundFPS(60);
config.setTitle("LoadG3DJ");
new Lwjgl3Application(new MyGame(), config);
}
}

​ MyGame.java

package com.zhyan8.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader;
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
import com.badlogic.gdx.utils.JsonReader; public class MyGame extends ApplicationAdapter {
private Environment mEnvironment; // 光照环境
private PerspectiveCamera mCamera; // 透视相机
private CameraInputController mCameraController; // 相机控制器
private ModelBatch mModelBatch;
private Model mModel;
private ModelInstance mModelInstance; @Override
public void create() {
initEnvironment();
initCamera();
initModel();
} @Override
public void render() {
mCameraController.update();
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0.455f, 0.725f, 1.0f, 1.0f);
Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);
mModelBatch.begin(mCamera);
mModelBatch.render(mModelInstance, mEnvironment);
mModelBatch.end();
} @Override
public void dispose() {
mModelBatch.dispose();
mModel.dispose();
} private void initEnvironment() { // 初始化光照环境
mEnvironment = new Environment();
mEnvironment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
mEnvironment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
} private void initCamera() { // 初始化相机
mCamera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
mCamera.position.set(200f, 200f, 200f);
mCamera.lookAt(0, 0, 0);
mCamera.near = 0.3f;
mCamera.far = 1000f;
mCamera.update();
mCameraController = new CameraInputController(mCamera);
Gdx.input.setInputProcessor(mCameraController);
} private void initModel() { // 初始化模型
mModelBatch = new ModelBatch();
mModel = new G3dModelLoader(new JsonReader()).loadModel(Gdx.files.internal("models/spiderbot/Spiderbot.g3dj"));
mModelInstance = new ModelInstance(mModel);
}
}

​ 运行效果如下。

​ 声明:本文转自【libGDX】加载G3DJ模型

【libGDX】加载G3DJ模型的更多相关文章

  1. 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题

    笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...

  2. ceisum_加载倾斜摄影模型

    osgb转换为3Dtiles格式(使用工具转换) 然后加载到cesium中(加载代码见下,可以控制模型高度) var offset = function(height,tileset) { conso ...

  3. xBIM 实战02 在浏览器中加载IFC模型文件并设置特效

    系列目录    [已更新最新开发文章,点击查看详细]  在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...

  4. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...

  5. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  6. 开园第一篇---有关tensorflow加载不同模型的问题

    写在前面 今天刚刚开通博客,主要想法跟之前某位博主说的一样,希望通过博客园把每天努力的点滴记录下来,也算一种坚持的动力.我是小白一枚,有啥问题欢迎各位大神指教,鞠躬~~ 换了新工作,目前手头是OCR项 ...

  7. 深度学习之加载VGG19模型分类识别

    主要参考博客: https://blog.csdn.net/u011046017/article/details/80672597#%E8%AE%AD%E7%BB%83%E4%BB%A3%E7%A0% ...

  8. cesium加载gltf模型

    cesium加载gltf模型 一.采用vue-cesium:在项目里加载依赖包.命令如下: npm i --save vue-cesium 在main.js中加入如下代码: https://www.n ...

  9. WebGL three.js学习笔记 加载外部模型以及Tween.js动画

    WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...

  10. live2d web端加载moc3模型

    大佬博客链接:https://blog.csdn.net/weixin_44128558/article/details/104792345 照着大佬的博客做一下,可以先学会怎么生成bundle.js ...

随机推荐

  1. [转帖]Kubernetes-17:Kubernets包管理工具—>Helm介绍与使用

    https://www.cnblogs.com/v-fan/p/13949025.html Kubernets包管理工具->Helm 什么是Helm? 我们都知道,Linux系统各发行版都有自己 ...

  2. [转帖]tar、gzip、zip、jar是什么,怎么查看?

    https://www.cnblogs.com/codelogs/p/16702759.html   原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果你是后 ...

  3. openssh 修改版本号显示

    #背景介绍:G端项目经常收到相关漏洞但有时升级最新版本(8.8p)还是会有相关漏洞(CVE-2020-15778),只能禁用相关命令或修改版本号 #漏洞名称OpenSSH 命令注入漏洞(CVE-202 ...

  4. java 调优需要关闭的组建

  5. 基于Spring Cache实现Caffeine、jimDB多级缓存实战

    作者: 京东零售 王震 背景 在早期参与涅槃氛围标签中台项目中,前台要求接口性能999要求50ms以下,通过设计Caffeine.ehcache堆外缓存.jimDB三级缓存,利用内存.堆外.jimDB ...

  6. ES6 Array.fiill()的用法

    简单使用 // arr.fill(value, start, end) // value填充的值 // start填充的起始位置包含 // end填充的结束值,不包含,如果省略这个参数,表示从起始位置 ...

  7. 【K哥爬虫普法】大众点评VS百度地图,论“数据权属”对爬虫开发的罪与罚!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知 ...

  8. 【k哥爬虫普法】非法入侵计算机信息系统,获取1500万余条个人信息!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  9. 【分享】从Mybatis源码中,学习到的10种设计模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:小镇卷码家 总有不少研发伙伴问小傅哥:"为什么学设计模式.看框架源码.补技 ...

  10. Properties集合的使用

    Properties集合是唯一一个可以和IO流相结合的集合 可以将集合中的数据持久化存储,也可以将硬盘上的数据加载到该集合中. 1 Properties集合添加.遍历 1 private static ...