libgdx游戏引擎3D开发教程-第一章-基础教程

开卷语:我最近才开始学习游戏编程,因为想做个网游玩,所以前几天找了不少引擎来看,于是不出意料的选中了libgdx,值得感谢的是libgdx的文档很多很全,所以没有走多少弯路就成功的配置好了环境。基础教程很完善,好多大神都已经写的很详细了,但是3D方面的很少见,所以我正好要学,索性直接翻译过来,大家共同进步。注意:教程基本是从Wiki上翻译过来,外加自己的小部分理解,所以一般来说应该没什么问题,如有错误请多多指教。

============================================================================================

第一章 基础教程

Basic 3D using LibGDX

  • 我们需要实现一个ApplicationListener来完成操作,如下:

public class Basic3DTest implements ApplicationListener
{

    @Override

    public void create () {

    }

    @Override

    public void render () {

    }

    

    @Override

    public void dispose () {

    }

    

    @Override

    public void resume () {

    }

    @Override

    public void resize (int width, int height)
{

    }

    @Override

    public void pause () {

    }

}

  • 增加一个camera来允许我们以3D视角来透视我们的场景

public class Basic3DTest implements ApplicationListener
{

    public PerspectiveCamera cam;

    @Override

    public void create () {

        cam = new PerspectiveCamera(67,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        cam.position.set(10f, 10f, 10f);

        cam.lookAt(0,0,0);

        cam.near = 1f;

        cam.far = 300f;

        cam.update();

    }

...

}

我们建立了一个PerectiveCamera类,其属性为67度视角(常用视角),宽高为Gdx.graphics预设值;并设camera在X,Y,Z(右,上,后)轴上的位置为10,其中Z轴指向观察者;设置远近值来确保能看到场景;最后使用update()方法来更新相机使我们能看到变化。

  • 现在我们增加点物体

public class Basic3DTest implements ApplicationListener
{

    public PerspectiveCamera cam;

    public Model model;

    public ModelInstance instance;

    @Override

    public void create () {

        cam = new PerspectiveCamera(67,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        ...

        cam.update();

        ModelBuilder modelBuilder = new ModelBuilder();

        model = modelBuilder.createBox(5f, 5f, 5f,

            new Material(ColorAttribute.createDiffuse(Color.GREEN)),

            Usage.Position | Usage.Normal);

        instance = new ModelInstance(model);

    }

    @Override

    public void dispose () {

        model.dispose();

    }

...

}

在这里,我们实例化一个模型构建器 ModelBuilder,它可用于在代码中创建模型。然后我们建立了一个5*5*5的立方体,设置Color绿色,设置位置Usage.Position,设置Usage.Normal(光线等)。Usage继承
VertexAttributes。

  • 模型包含了如何渲染等很多工作,但是它不知道把自己放在哪里,所以我们需要建立ModelInstance。ModelInstance包含需要被渲染的位置,旋转和缩放,默认情况下是( 0,0,0 ) ,所以我们只需要创建设置为(0,0,0)的ModelInstance 。

public class Basic3DTest implements ApplicationListener
{

    public PerspectiveCamera cam;

    public ModelBatch modelBatch;

    public Model model;

    public ModelInstance instance;

    

    @Override

    public void create () {

        modelBatch = new ModelBatch();

        

        cam = new PerspectiveCamera(67,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        ...

        cam.update();

        ModelBuilder modelBuilder = new ModelBuilder();

        model = modelBuilder.createBox(5f, 5f, 5f,

                new Material(ColorAttribute.createDiffuse(Color.GREEN)),

                VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);

        instance = new ModelInstance(model);

    }

    @Override

    public void render () {

        Gdx.gl.glViewport(00,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);

        modelBatch.render(instance);

        modelBatch.end();

    }

    

    @Override

    public void dispose () {

        modelBatch.dispose();

        model.dispose();

    }

...

}

代码中增加了ModelBatch用来渲染图像,在create()中初始化,在render()中clean,begin,render,end。记得在dispose中销毁它。效果如图:

  • 现在加点光照,

public class Basic3DTest implements ApplicationListener
{

    public Environment environment;

    ...

    

    @Override

    public void create () {

        environment = new Environment();

        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f,
1f));

        environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f,
-1f, -
0.8f, -0.2f));

        ...

    }

    @Override

    public void render () {

        Gdx.gl.glViewport(00,
Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);

        modelBatch.render(instance, environment);

        modelBatch.end();

    }

    ...

}

我们添加一个环境实例 Environment。我们构建并设置了环境光( 0.4 , 0.4 , 0.4 ) ,注意alpha值将被忽略。然后我们添加一个DirectionalLight为( 0.8 ,0.8, 0.8)的颜色和(-1.0 ,- 0.8F , 0.2)的方向。效果如图:

  • 现在我们控制camera来从其他角度看模型

public class Basic3DTest implements ApplicationListener
{

    ...

    public CameraInputController camController;

    ...

    

    @Override

    public void create () {

        ...

        camController = new CameraInputController(cam);

        Gdx.input.setInputProcessor(camController);

    }

    @Override

    public void render () {

        camController.update();

        ...

    }

...

}

建立CameraInputController来增加相机控制,这样就可以拖动旋转了。

  • 补充import文件,可能有同学会遇到这类问题

import com.badlogic.gdx.ApplicationAdapter;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.*;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

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.CameraInputController;

import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;

libgdx游戏引擎3D开发教程-第一章-基础教程

时间: 2024-10-29 19:07:33

libgdx游戏引擎3D开发教程-第一章-基础教程的相关文章

openwrt教程 第一章 物联网&openwrt开发概述

转载请注明出处:http://blog.csdn.net/ns_code/article/details/28505569 序言 求两个正整数的最大公约数是一个很古老且很基本的问题,欧几里得在其著作<几何原本>中给出了高效的解法--辗转相除法,也叫做欧几里得算法.下面我们来看下求最大公约数的一些方法. 方法一 我们先来看欧几里得的辗转相除法.原理很简单,假设用f(x,y)表示x和y的最大公约数,我们令x>y,则有x=ky+b,如果一个数能够同时整除x和y,则必能同时整除b和y,而能够同时

jquery基础教程 - 第一章 JQUERY入门

Jquery基础教程 - 第一章 JQUERY入门 内容提要 1.jquery能做什么 2.jquery为什么如此出色 3.第一个jquery驱动的页面 4.纯javascript与jquery 5.开发工具 6.小结 1.jquery能做什么 取得文档中的元素 -- jQuery为准确的获得需要检查或操纵的文档元素,提供了可靠而富有效率的选择符机制. 找到所有应用了.content class样式的div中所有的P标签             $('div.content').find('p'

Unity3D游戏引擎实战开发视频教程

Unity3D游戏引擎实战开发从入门到精通(坦克大战项目实战.NGUI开发.GameObject) 适合人群:初级 课时数量:20课时 用到技术:Unity3D.VS2008.NGUI2.61.GameObject 涉及项目:坦克大战项目实战 咨询qq:1840215592 课程内容简介 Unity3D游戏引擎实战开发从入门到精通课程由浅入深的介绍Unity3D的开发流程.从软件使用到API接口的使用,从成品到优化.介绍整个Unity3D的基本开发过程及开发中碰到的基础问题进行深入讲解.对代码重

HttpClient 4.3教程 第一章 基本概念

HttpClient 4.3教程 第一章 基本概念 Posted on 2013 年 10 月 9 日 1.1. 请求执行 HttpClient最基本的功能就是执行Http方法.一个Http方法的执行涉及到一个或者多个Http请求/Http响应的交互,通常这个过程都会自动被HttpClient处理,对用户透明.用户只需要提供Http请求对象,HttpClient就会将http请求发送给目标服务器,并且接收服务器的响应,如果http请求执行不成功,httpclient就会抛出异样. 下面是个很简单

【课程下载】基于Cocos2d-x游戏引擎实战开发炸弹超人

我这里有套课程想和大家分享,需要的朋友可以加我qq和我联系.QQ2059055336. 课程讲师:Jason.Z 课程分类:ios适合人群:初级课时数量:31课时更新程度:完毕 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2.1 及更高版本, WindowsXP & Windows7,

村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说明了电子设备中使用EMI静噪滤波器(EMIFIL®)的原因,还概述了通常电磁噪声抑制所用的典型屏蔽和滤波器的操作. 图1-1 EMI静噪滤波器 (EMIFIL®) 1-2. 什么是电磁噪声干扰? 电子设备收到强电磁波时,电路中会感应到不想要的电流,这会产生非预想的操作或对预想的操作形成干扰.如果外部

【读书笔记】《Python基础教程》第一章 基础知识

第一章 基础知识 实现两个数整除:使用命令开关 -Qnew (?): 使用双斜线. from future import division 执行向计算器那样的普通除法. 幂(乘方)运算符: 2 ** 3 (8),用函数代替 pow(2,3),内建函数 长整数型:在数字结尾加L.eg:10000000000000L 获取用户输入 input("提示信息 :") eg: x = input("x: ") .输入的是合法的python表达式 raw_input("

Kubernetes 第一章 基础知识

Kubernetes 第一章 基础知识 Kubernetes是一个开源容器编排引擎,用于自动化容器化应用程序的部署,扩展和管理.开源项目由Cloud Native Computing Foundation(CNCF)托管. Kubernetes是一个可移植,可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明性配置和自动化.它拥有庞大,快速发展的生态系统.Kubernetes服务,具有广泛的工具和支持可用. 发展历程 传统部署时代: 早期,组织在物理服务器上运行应用程序.无法为物理服务器中

Laxcus大数据管理系统(2)- 第一章 基础概述 1.1 基于现状的一些思考

第一章 基础概述 1.1 基于现状的一些思考 在过去十几年里,随着互联网产业的普及和高速发展,各种格式的互联网数据也呈现爆炸性增长之势.与此同时,在数据应用的另一个重要领域:商业和科学计算,在各种新兴技术和产业需求的推动下,对数据存储和计算要求也日益提高,并且对计算数据的准确性和精度也远高于互联网数据.而在这些现象的背后,当前的数据计算早已经突破MB量级,GB成为常态,TB变得流行,正在向PB迈进的时候,面对如此庞大的数据量,如果管理和使用它们,满足各种计算需求,发现和筛选其中有价值的信息,通常