【libGDX】加载G3DJ模型

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);
	}
}

        运行效果如下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/194489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day65

今日回顾内容 web应用 HTTP协议 web应用 一、什么是web应用程序 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 对于传统的应用软件来说,…

zi定义指令

hello,我是小索奇,精心制作的Vue系列持续发放,涵盖大量的经验和示例,如果对您有用,可以点赞收藏哈~ 自定义指令 自定义指令就是自己定义的指令,是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM&#xff…

前端实现埋点

前端实现埋点 如何去了解用户呢?最直接有效的方式就是了解用户的行为,了解用户在网站中做了什么,呆了多久。而如何去实现这一操作,这就涉及到我们前端的埋点了。 埋点方式 什么是埋点? 所谓埋点是数据采集领域&…

leetcode:414. 第三大的数

一、题目 函数原型:int thirdMax(int* nums, int numsSize) 二、思路 将数组降序排序。 如果数组元素个数小于3,直接返回第一个元素; 如果数组元素个数大于等于3,且不同元素个数小于3,直接返回第一个元素; …

AIGC系列之:Variational Auto Encoder-VAE模块

目录 1.VAE 概述 2.概率分布 3.损失函数 4.重参数技巧 5.维度对 VAE 的影响 6.损失函数对VAE的影响 7.总结 VAE原始https://arxiv.org/abs/1312.6114 论文解读:https://mp.weixin.qq.com/MzI1MjQ2O 1.VAE 概述 变分自动编码器(Variational auto…

STM32CubeIDE(CUBE-MX hal库)----串口通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CUBE-MX可视化配置二、发送数据和接收数据1.HAL库串口的阻塞模式和非阻塞模式2.HAL库串口阻塞模式数据发送函数3.HAL库串口阻塞模式数据接收函数4.HAL库串口…

Pygame直线绘制

文章目录 lines光线反射 pygame.draw中有4个绘制直线的函数,列表如下 一条线段多条线段正常linelines抗锯齿aalineaalines 一条和多条线段的输入参数如下 line(surface, color, start_pos, end_pos, width1)lines(surface, color, closed, points, width1) line…

搭建Appium工具环境

1、安装Java Development Kit(JDK) 前往Oracle官网下载JDK。 在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到最新版本的JDK。根据操作系统选择适合的版本,并根据指示下载安装程序。 安装JDK。运行下载的安…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看,或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家,有需要的可是尝试下,小编这边测试了可以用,就是下载的时候慢的一匹。。。 第一…

计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)

目录 介绍 三个重要问题 封装成帧 差错检测 可靠传输 使用广播信道的数据链路层 其他问题 介绍 本篇对数据链路层进行概述,我们首先来看看数据链路层在网络体系结构中的地位: 主机H1给主机H2发送数据,中间要经过三个路由器和电话网、…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏

deepin-terminal 安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0…

33 - MySQL调优之索引:索引的失效与优化

不知道你是否跟我有过同样的经历,那就是作为一个开发工程师,经常被 DBA 叫过去“批评”,而最常见的就是申请创建新的索引或发现慢 SQL 日志了。 记得之前有一次迭代一个业务模块的开发,涉及到了一个新的查询业务,需要…

考试周刊杂志考试周刊杂志社考试周刊编辑部2023年第46期目录

教育教学研究 丰富作业形式 拓展课堂教学——“双减”下初中英语优化作业设计探析 王慧; 1-5 博学慎思明辨 撬动思维杠杆——论“思辨性阅读与表达”学习任务群范式构建 丁亚琴; 6-10《考试周刊》投稿邮箱:cn7kantougao163.com(注明投稿“《考试周刊》”) 崔…

Leetcode—35.搜索插入位置【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—35.搜索插入位置 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid;// 左闭右开[left, right)while(left < right) {mid left (right - left) / 2;if(arr[mid] &…

企业网络中的身份安全

随着近年来数字化转型的快速发展&#xff0c;企业使用的数字身份数量急剧增长。身份不再仅仅局限于用户。它们现在扩展到设备、应用程序、机器人、第三方供应商和组织中员工以外的其他实体。即使在用户之间&#xff0c;也存在不同类型的身份&#xff0c;例如属于IT管理员、远程…

vue3+ts 指令拖拽案例

<template><div class"box" v-move><div class"header"></div><div>内容</div></div> </template><script setup lang"ts"> import { ref, Directive, DirectiveBinding } from "vu…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …

智慧工厂人员定位系统源码,融合位置物联网、GIS可视化等技术,实现对人员、物资精确定位管理

智慧工厂人员定位系统源码&#xff0c;UWB高精度定位系统源码 随着中国经济发展进入新常态&#xff0c;在资源和环境约束不断强化的背景下&#xff0c;创新驱动传统制造向智能制造转型升级&#xff0c;越发成为企业生存发展的关键。智能工厂作为实现智能制造的重要载体&#xf…

[操作系统]京东一面~进程相关汇总

1 进程、线程、协程的概念 进程&#xff1a; 静态程序的运行状态就叫进程。是资源分配的基本单位。 线程&#xff1a; 是进程的一个执行单元&#xff0c;是进程内的调度实体。是CPU调度的独立单位。线程也被称为轻量级进程。 协程&#xff1a; 是一种比线程更加轻量级的存在。…