-
安装 JDK:确保安装了 Java Development Kit (JDK),建议使用最新稳定版本。
-
安装 IDE:推荐使用 IntelliJ IDEA 或 Eclipse 作为开发环境。
-
下载 LibGDX 项目设置工具:
- 前往 LibGDX 的官方网站下载项目生成工具。
- 创建项目:
- 使用下载的设置工具创建一个新的 LibGDX 项目。在创建过程中可以选择添加 3D 支持。
-
3D 坐标系:了解基本的 3D 坐标系(X, Y, Z)及其在 LibGDX 中的应用。
-
摄像机(Camera):
- 学习如何使用 PerspectiveCamera 来设置视角和投影。
- 模型(Model)和模型实例(ModelInstance):
- 理解如何加载和使用 3D 模型。
- 理解 Model 和 ModelInstance 的区别。
-
设置 3D 摄像机:
PerspectiveCamera camera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); camera.position.set(10f, 10f, 10f); camera.lookAt(0, 0, 0); camera.near = 1f; camera.far = 300f; camera.update();
-
加载和显示 3D 模型:
ModelBatch modelBatch = new ModelBatch(); Model model = new ModelBuilder().createBox(5f, 5f, 5f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal); ModelInstance modelInstance = new ModelInstance(model);
-
添加环境光照:
Environment environment = new Environment(); environment.add(new DirectionalLight().set(Color.WHITE, 1f, 0.8f, 0.2f));
-
渲染循环:
@Override public void render() { Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); camera.update(); modelBatch.begin(camera); modelBatch.render(modelInstance, environment); modelBatch.end(); }
-
处理用户输入:使用 Gdx.input 来处理键盘和鼠标输入,从而改变摄像机的视角或模型的位置。
-
调整摄像机视角:
- 可以通过鼠标拖拽、滚轮缩放等方式来调整摄像机的视角。
package com.nanshaws.butt;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.VertexAttributes;
import com.badlogic.gdx.graphics.g3d.*;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.math.Vector3;
public class Main extends ApplicationAdapter {
private PerspectiveCamera camera;
private ModelBatch modelBatch;
private Model model;
private ModelInstance modelInstance;
private Environment environment;
@Override
public void create() {
modelBatch = new ModelBatch();
// Set up the camera
camera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.position.set(10f, 10f, 10f);
camera.lookAt(0, 0, 0);
camera.near = 1f;
camera.far = 300f;
camera.update();
// Set up environment with directional light
environment = new Environment();
environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.8f, 0.8f, 0.8f, 1f));
environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
// Create a cube model
ModelBuilder modelBuilder = new ModelBuilder();
model = modelBuilder.createBox(5f, 5f, 5f,
new Material(ColorAttribute.createDiffuse(Color.GREEN)),
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
modelInstance = new ModelInstance(model);
}
@Override
public void render() {
// Clear the screen
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
// Rotate the cube
modelInstance.transform.rotate(Vector3.Y, 1f);
// Render model using the environment’s light settings
modelBatch.begin(camera);
modelBatch.render(modelInstance, environment);
modelBatch.end();
}
@Override
public void dispose() {
modelBatch.dispose();
model.dispose();
}
}
@Override
public void create() {
modelBatch = new ModelBatch();
// Set up the camera
camera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.position.set(10f, 10f, 10f);
camera.lookAt(0, 0, 0);
camera.near = 1f;
camera.far = 300f;
camera.update();
-
create() 方法:初始化应用程序的关键组件,并设置初始状态。
-
modelBatch:用于处理模型的渲染批次。
-
摄像机设置:
-
创建 PerspectiveCamera,使用 67 度的视角。
-
设置摄像机位置为 (10, 10, 10)。
-
让摄像机朝向 (0, 0, 0)。
-
定义近平面 (near) 和远平面 (far) 为 1 和 300。
-
调用 update() 更新摄像机的投影矩阵。
// Set up environment with directional light environment = new Environment(); environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.8f, 0.8f, 0.8f, 1f)); environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
-
光照设置:
-
创建 Environment 对象,用于储存环境光设置。
-
使用 ColorAttribute 设置环境光颜色为浅灰色。
-
创建一个方向光源,设置其方向为 (-1, -0.8, -0.2),光线颜色为浅灰色。
// Create a cube model ModelBuilder modelBuilder = new ModelBuilder(); model = modelBuilder.createBox(5f, 5f, 5f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal); modelInstance = new ModelInstance(model); }
-
创建立方体模型:
-
使用 ModelBuilder 创建一个立方体模型。
-
立方体的边长为 5 个单位。
-
使用 Material 设置立方体材质为绿色。
-
使用 VertexAttributes 指定模型顶点包含位置和法线信息。
-
创建 ModelInstance,这对于处理一个模型的多个实例如移动和旋转是必要的。
@Override
public void render() {
// Clear the screen
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
// Rotate the cube
modelInstance.transform.rotate(Vector3.Y, 1f);
// Render model using the environment’s light settings
modelBatch.begin(camera);
modelBatch.render(modelInstance, environment);
modelBatch.end();
}
- render() 方法:每帧调用以更新和渲染场景。
- 清空屏幕:
- 设置视口,确保渲染区域覆盖整个窗口。
- 清空颜色和深度缓存,以准备渲染新帧。
- 旋转模型:
- 对模型实例施加围绕 Y 轴旋转 1 度的变换。
- 渲染模型:
- 通过 modelBatch 开始渲染。
- 调用 render 方法,应用光照环境来渲染 modelInstance。
- 在结束渲染批次时调用 end()。
@Override
public void dispose() {
modelBatch.dispose();
model.dispose();
}
- dispose() 方法:清理所有分配的本地资源,防止内存泄漏。
- modelBatch.dispose():释放渲染批次使用的资源。
- model.dispose():释放加载的模型资源。