libgdx-chapter14教程
本文最后更新于6 天前,其中的信息可能已经过时,如有错误请发送邮件到nanshaws360@gmail.com

1. 设置开发环境

  1. 安装 JDK:确保安装了 Java Development Kit (JDK),建议使用最新稳定版本。
  2. 安装 IDE:推荐使用 IntelliJ IDEA 或 Eclipse 作为开发环境。
  3. 下载 LibGDX 项目设置工具:
  • 前往 LibGDX 的官方网站下载项目生成工具。
  1. 创建项目:
  • 使用下载的设置工具创建一个新的 LibGDX 项目。在创建过程中可以选择添加 3D 支持。

2. 理解基本概念

  1. 3D 坐标系:了解基本的 3D 坐标系(X, Y, Z)及其在 LibGDX 中的应用。
  2. 摄像机(Camera):
  • 学习如何使用 PerspectiveCamera 来设置视角和投影。
  1. 模型(Model)和模型实例(ModelInstance):
  • 理解如何加载和使用 3D 模型。
  • 理解 Model 和 ModelInstance 的区别。

3. 创建基本 3D 场景

  1. 设置 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();
  2. 加载和显示 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);
  3. 添加环境光照:Environment environment = new Environment();
    environment.add(new DirectionalLight().set(Color.WHITE, 1f, 0.8f, 0.2f));
  4. 渲染循环:@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();
    }

4. 添加交互

  1. 处理用户输入:使用 Gdx.input 来处理键盘和鼠标输入,从而改变摄像机的视角或模型的位置。
  2. 调整摄像机视角:
    • 可以通过鼠标拖拽、滚轮缩放等方式来调整摄像机的视角。

本教程的Libgdx3d代码如下:

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():释放加载的模型资源。

运行本教程的Libgdx3d效果

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇