`
macken
  • 浏览: 346730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

libgdx学习之Camera

    博客分类:
  • game
阅读更多

Camera定义

 

游戏中,Camera用来向用户展示场景,Camera就像一个摄像机,摄像机里面的景象就是Camera的展示范围,如下图所示:



在3D空间中Camera被定义为一个位置,有一个单位“方向”向量和一个“向上”的单位向量组成,方向和向上向量告诉OpenGL 当前Camera如何定向。

 

视景体

      Camera的另一个重要特性是视觉平截体(View Frustrum),在上面的图片中可以看到一个被砍去顶尖的角锥体,这就是一个视觉平截体,所以视觉平截体内部的东西都可以在屏幕上看到,视觉平截体被六个剖面确定,near、far、left、right、top、bottom。near剖面还有一个特殊的性质:你可以认为它是相机照出的照片中的平面。这个由3D转换为2D的过程,称为投影,通常有两种投影:orthographic projection(正交投影) 和 perspective projection(透视投影、中心投影),正交投影在2D的图形中经常使用,无论物体离camera远近,物体在屏幕上的大小始终一样。透视投影是现实世界中的成像原理:物体离眼睛越远,物体的就越小。不同的投射类型就是改变视景体的形状,透视投影的视觉平截体形状就是上图的角锥体形状,正交投影的视觉平截体是一个长方体,投影的过程简单来说:对于物体上的每一个点,计算这个点到camera之间的连线是否与near剖面相交。下图是正交投影与透视投影的图片示例:



 由此可以看出为什么在透视投影下,屏幕上越远的物体会越小,而正交投影下,物体保持大小不变。OpenGL一般使用3D空间展示,无论你是绘图还是输出字符串,当你使用正交投影时,可以假设z轴不存在,下图就是一个2D精灵在3D空间中的样子:


 

因此,在这里可以忽略2D和3D的不同之处,下图是一个在未设置任何矩阵(matrix)下使用SpriteBatch绘图的正交视景体


我们所做的就是让我们的精灵在x/y平面上移动,忽略z轴,保持我们一直工作在2D空间的假象

 

透视投影使用两个属性来定义它的投影规则:广角和纵横比(长宽比),广角是一个角度值,用来定义视场有多大”开口“,如下图




纵横比是视口的宽度和高度比。视口是一个长方形,即camera用来进行渲染图像的地方,一个480*320像素的窗口,它的纵横比是480/320。

 

Camera相关类

Camera:基础类

OrthographicCamera:正交Camera 继承自Camera

PerspectiveCamera:投影Camera继承在Camera

 

首先看Camera类

 

public abstract class Camera {				
	public final Vector3 position = new Vector3();
	public final Vector3 direction = new Vector3(0, 0, -1);	
	public final Vector3 up = new Vector3(0, 1, 0);

三个公共成员分别是Camera的位置、方向、up向量 ,采用的是默认属性,因此camera默认位于原点,z轴默认朝上。

public final Matrix4 projection = new Matrix4();
public final Matrix4 view = new Matrix4();
public final Matrix4 combined = new Matrix4();
public final Matrix4 invProjectionView = new Matrix4();

这是一系列的在OpenGL ES 2.0中用到的矩阵,前两个是投影和模型视图矩阵,第三个是前两个的结合,第四个是第三个的翻转,经常用来做提取登时,这些都不会经常使用到

 

	public float near = 1;	
	public float far = 100;	
	public float viewportWidth = 0;
	public float viewportHeight = 0;

这是near和far剖面距离camera的距离,以及视口的宽度和高度,near和far必须遵循0<=near<far的公式。默认情况情况下near剖面距离camera是1个单位,对于正交投影,near经常设置为0,width和height用来计算透视投影的纵横比或者正交投影的视景体长方体

 

public final Frustum frustum = new Frustum();

最后的成员是Frustum,有6个平面组成,Frustum可以用来进行裁剪:检测一个物体是否在Frustum内,如果不在则不绘制它。Frustum有一些的方法用来检测一个 盒子、球体或者一个点是否在Frustum中。

 

	public abstract void update();
	public void apply(GL10 gl);

 这是两个常用方法,update方法用来重新计算camera的举证,当camera的属性发生改变时进行调用。apply方法用来设置camera的GL_PROJECTION或者GL_MODELVIEW矩阵,不过这个方法在OpenGL ES 2.0上不可用。

public void unproject(Vector3 vec);	
public void project(Vector3 vec);
public Ray getPickRay(float x, float y);

      最后是几个你可能用到额高级方法。unproject方法用来从屏幕坐标中取得一个点,并产生这个点的三位坐标。与原有类的OrthographicCamera.screenToWorld()左右相同,也等同于gluUnproject方法。x、y坐标是可触坐标,参数中的z坐标是个0和1之间的值,0表示点位于near平面,1表示点位于far平面;

    project方法正好相反,从3D世界中取得一个点,并转换成屏幕上的2d点;

    getPickRay方法会返回一个直线,可以想象成3D世界中,从camera位置到x、y的一条直线,用来检测这个直线是否与其他图形或者物体接触到。

 

public class OrthographicCamera extends Camera {
	public float zoom = 1;
 
	public OrthographicCamera(float viewportWidth, float viewportHeight);

 

OrthographicCamera有一个额外成员zoom用来定义缩放因子。构造参数定义了camera的视口width和高度,如果想要最佳的利用机器像素,只需要在这里定义GRaphics.getWidth()/getHeight(),也可以使用不同的单位,比如厘米。

 

 

public class PerspectiveCamera extends Camera {		
	public float fieldOfView = 67;
 
	public PerspectiveCamera(float fieldOfView, float viewportWidth, float viewportHeight);

 

 PerspectiveCamera 也有一个额外的成员,广角。

 

文章翻译完,对Camera的理解又进了一层。

参考资料:

http://www.badlogicgames.com/wordpress/?p=1550

  • 大小: 42.4 KB
  • 大小: 26.6 KB
  • 大小: 13.4 KB
  • 大小: 32.1 KB
  • 大小: 41.6 KB
分享到:
评论
1 楼 k496229870 2013-09-29  
                                                                           

相关推荐

    libgdx游戏

    3. **Camera**: LibGDX提供了多种相机类,如OrthographicCamera和PerspectiveCamera,用于管理游戏视图和投影。 4. **AssetManager**: 资产管理器负责加载和管理游戏中的资源,如音频、图像、字体等,确保它们在...

    libgdx源码invaders

    通过分析和学习这个源码,开发者可以深入了解LibGDX的工作原理和功能。 1. **LibGDX框架基础**: LibGDX提供了一整套工具和库,包括图形渲染、音频处理、输入管理、文件I/O、网络通信等。它使用Java语言编写,通过...

    Libgdx专题系列 地图移动

    通过这个“Libgdx专题系列 地图移动”的学习,你将掌握如何在Libgdx环境中构建可交互、可探索的游戏世界,并为玩家提供流畅的地图导航体验。无论是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和技巧。记得...

    根据libGDX官方文档制作的雨滴游戏,作为Java学习.zip

    通过学习这个雨滴游戏项目,不仅可以提升对libGDX框架的理解,也能加深对Java编程和游戏开发流程的认识。实践是检验理论的最好方式,尝试运行并修改这个游戏,将有助于你更好地掌握相关知识,并激发更多创新灵感。

    Libgdx游戏开发图形图像绘制示例代码

    总的来说,这些示例代码提供了从基础到进阶的Libgdx图形图像绘制实践,通过学习和理解这些代码,开发者可以更好地掌握Libgdx游戏开发,创造出丰富多样的游戏体验。对于想要深入学习Libgdx的人来说,这是一个很好的...

    libGDX3DTest:一些使用 libgdx 的 3D 测试

    总结来说,libGDX3DTest是一个学习libGDX 3D游戏开发的宝贵资源。通过分析和运行其中的测试案例,开发者可以深入理解libGDX如何处理3D图形、模型加载、光照渲染、相机操作以及用户交互等方面,从而为自己的3D游戏...

    libgdx 绘制图形

    LibGDX是一个强大的开源游戏开发框架,用于创建跨平台的游戏。在LibGDX中,绘制图形是游戏开发的核心部分,它允许开发者构建丰富多彩的...通过学习和实践这些知识点,你可以熟练地在LibGDX中绘制出丰富多彩的图形世界。

    GdxDemos:使用 libGDX 构建的示例游戏

    GdxDemos项目则为学习libGDX提供了一系列示例游戏,通过这些实例,我们可以深入理解libGDX在游戏开发中的应用。 一、libGDX简介 libGDX是一个用Java语言编写的游戏开发框架,支持Windows、Linux、Mac OS X、Android...

    基于libgdx ,java游戏引擎开发.zip

    本项目源码是针对初学者和有一定编程基础的开发者,提供了一个极好的学习资源,无论是用于毕业设计、课程设计,还是自我提升,都能从中获益良多。 1. **LibGDX简介** LibGDX是Java开发者的一款利器,它支持Windows...

    LibgdxSandbox:libgdx 的沙箱

    总结起来,LibgdxSandbox是一个宝贵的libgdx学习资源,它涵盖了libgdx的各个方面,包括图形渲染、音频处理、物理引擎、输入系统和文件操作等,是提升Java游戏开发技能的理想实践平台。通过深入研究和实践,你将能够...

    libgdx_game_initial:LibGdx游戏演示样本

    这个"libgdx_game_initial"项目是一个基于LibGDX的示例游戏项目,旨在帮助开发者理解和学习如何使用LibGDX来构建游戏。以下是关于LibGDX和这个初始游戏项目的一些关键知识点: 1. **LibGDX简介**: - LibGDX是一个...

    my-libgdx-test:我自己的libgdx测试存储库

    这个名为"my-libgdx-test"的项目显然是一个个人的LibGDX测试存储库,用于实验和学习LibGDX的各种功能。下面我们将深入探讨LibGDX框架以及如何利用Java进行游戏开发。 1. LibGDX简介: LibGDX是一个跨平台的游戏开发...

    libgdx.info-Basic_Action

    这个"libgdx.info-Basic_Action"压缩包包含了LibGDX基础操作的示例代码,是学习如何在LibGDX中实现基本游戏动作的绝佳资源。下面将详细介绍LibGDX的关键组件和基础操作。 1. **核心组件**: - **Stage**: LibGDX中...

    OrbOrbOrb:一个带有 LIBgdx 的安卓游戏

    LIBgdx架构分为几个关键部分:`ApplicationAdapter`或`Game`基类,`Stage`(用于2D场景管理),`Camera`(视角和投影控制),`Batch`(用于绘制图形),以及`Input`系统(处理用户输入)。OrbOrbOrb可能利用这些...

    JimMaze:JimMaze是基本版本的libgdx中用于Java的Android编程的2d游戏

    libgdx中的核心组件包括Stage(舞台)、SpriteBatch(精灵批处理)、Texture(纹理)、Camera(相机)等。在JimMaze游戏中,Stage用于管理游戏场景中的所有对象,SpriteBatch则负责高效地绘制多个精灵。纹理是游戏...

    NewCodeGame:Android上的一个游戏原始码,LibGDX游戏框架开发

    1. **LibGDX架构**:LibGDX的核心结构包括Stage(舞台)、Scene2D(2D场景)、Batch(批次渲染)和Camera(相机)等。这些组件协同工作,帮助开发者构建游戏世界。 2. **游戏循环**:游戏的基本运行机制是游戏循环...

    libgdxGP:我的GravityParticles项目使用libGDX。 您可以在https上查看此项目的文档

    该项目不仅具有高度的可定制性,而且提供了丰富的视觉体验,是学习libGDX游戏开发的绝佳案例。 首先,libGDX的核心在于其强大的图形库,包括2D和3D渲染功能。在“GravityParticles”项目中,我们利用了libGDX的...

    LibGDXSampleGame,使用libgdk的示例游戏场.zip

    这个“LibGDXSampleGame”压缩包包含了一个使用LibGDX框架的示例游戏项目,旨在帮助开发者理解和学习如何利用LibGDX进行游戏开发。本文将详细介绍LibGDX的核心概念、特性以及如何通过这个示例项目来实践这些知识。 ...

    GusHackaton:带有用Java,Android Studio编写的ARCore和libGDX的Prohealth应用

    健康宠物 24小时Hackaton GUS ShowMeData Android应用程序 ...电子学习/排名功能 datatabse提取 后端Java Spring服务器的链接: : 二手工具: Camera2 API MPAndroid图表 QR码库阅读器 核心 libGDX 翻新

    android 立方体旋转效果

    在Android开发中,实现立体旋转效果是一个常见的需求,特别是在创建3D UI或者游戏场景时。...同时,学习并理解OpenGL ES或者使用现代的图形库如`libGDX`或`Sceneform`,能让你在Android 3D编程上有更深入的掌握。

Global site tag (gtag.js) - Google Analytics