要知道,做一个游戏,摄像头是必不可少的。接下来,我将讲解libgdx里面摄像头的移动

2d摄像头OrthographicCamera也叫做正交相机

结果展示:



按上下左右是可以移动的

OrthographicCamera camera的使用:

完整代码:

package com.brentaureli.mariobros.cam;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils; import static com.badlogic.gdx.Gdx.gl; public class T1 implements ApplicationListener { private OrthographicCamera camera;
private float VIEWPORT_WIDTH=100f;
private float VIEWPORT_HEIGHT=100f;
private SpriteBatch batch;
private Sprite sprite;
@Override
public void create() {
sprite=new Sprite(new Texture(Gdx.files.internal("block.png")));
sprite.setSize(VIEWPORT_WIDTH,VIEWPORT_HEIGHT);
sprite.setPosition(0, 0);
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
camera=new OrthographicCamera(100,100*h/w);
camera.position.set(15f,11.25f,0);
camera.update();
batch=new SpriteBatch();
} @Override
public void resize(int width, int height) { //调整窗口,相机位置不变
camera.viewportWidth = 30f;
camera.viewportHeight = 30f * height / width;
camera.update();
} @Override
public void render() { handleInput();
resetCamera();
camera.update();
batch.setProjectionMatrix(camera.combined);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end();
} private void resetCamera() {
if (Gdx.input.isKeyPressed(Input.Keys.R)) {
camera.position.set(camera.viewportWidth / 2f, camera.viewportHeight / 2f, 0);
camera.zoom = 1;
camera.rotate(0, 0, 0, 1);
}
} private void handleInput() {
//放大相机
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
camera.zoom += 0.02;
}
//缩小相机
if (Gdx.input.isKeyPressed(Input.Keys.Q)) {
camera.zoom -= 0.02;
}
//左移相机
if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
camera.translate(-3, 0, 0);
}
//右移相机
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
camera.translate(3, 0, 0);
}
//下移相机
if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
camera.translate(0, -3, 0);
}
//上移相机
if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
camera.translate(0, 3, 0);
}
} @Override
public void pause() { } @Override
public void resume() { } @Override
public void dispose() {
sprite.getTexture().dispose();
batch.dispose();
}
}

主类完整代码:

package com.brentaureli.mariobros.desktop;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application;
import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import com.brentaureli.mariobros.cam.T1; public class DesktopLauncher {
public static void main (String[] arg) {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setForegroundFPS(60);
config.setTitle("camera-example");
new Lwjgl3Application(new T1(), config);
}
}

先设置了一个背景

private Sprite sprite;
sprite=new Sprite(new Texture(Gdx.files.internal("block.png")));
sprite.setSize(VIEWPORT_WIDTH,VIEWPORT_HEIGHT);
sprite.setPosition(0, 0);

设置了背景的图片,背景的大小,背景位置。

接下来的代码:

 float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
camera=new OrthographicCamera(100,100*h/w);
camera.position.set(15f,11.25f,0);
camera.update();
batch=new SpriteBatch();

设置了camera的范围,camera的位置 camera.update();这个是每次更新camera的位置呀什么的都要进行一次更新。然后就是new了一个缓冲。

接下来的代码:

        //调整窗口,相机位置不变
camera.viewportWidth = 30f;
camera.viewportHeight = 30f * height / width;
camera.update();

就是单纯的再调试了一下窗口。

接下来的代码:

private void handleInput() {
//放大相机
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
camera.zoom += 0.02;
}
//缩小相机
if (Gdx.input.isKeyPressed(Input.Keys.Q)) {
camera.zoom -= 0.02;
}
//左移相机
if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
camera.translate(-3, 0, 0);
}
//右移相机
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
camera.translate(3, 0, 0);
}
//下移相机
if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
camera.translate(0, -3, 0);
}
//上移相机
if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
camera.translate(0, 3, 0);
}
}

添加了一下键盘输入的按键,camera.zoom += 0.02;就是将摄像的范围扩大同理camera.zoom -= 0.02;就是减少,而 camera.translate就是移动位置。

接下来的代码:

 private void resetCamera() {
if (Gdx.input.isKeyPressed(Input.Keys.R)) {
camera.position.set(camera.viewportWidth / 2f, camera.viewportHeight / 2f, 0);
camera.zoom = 1;
camera.rotate(0, 0, 0, 1);
}
}

就是单纯的按r重置摄像头

然后就是:

        camera.update();
batch.setProjectionMatrix(camera.combined);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch); batch.end();

将摄像头进行更新,然后 batch.setProjectionMatrix(camera.combined);这个,这个可以说是固定搭配,就是配置一下摄像头。

        batch.begin();
sprite.draw(batch);
batch.end();

缓存区打开,然后画图,end方法结尾。这算是固定搭配。

3D摄像头PerspectiveCamera也叫做透视相机

完整代码:

package com.brentaureli.mariobros.cam;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.VertexAttributes;
import com.badlogic.gdx.graphics.g3d.Material;
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.TextureAttribute;
import com.badlogic.gdx.graphics.g3d.utils.FirstPersonCameraController;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder; import static com.badlogic.gdx.Gdx.gl; public class T2 implements ApplicationListener {
private PerspectiveCamera camera;
private FirstPersonCameraController cameraController;
private ModelBatch batch;
private ModelBuilder builder;
private Texture texture;
private Model model;
private ModelInstance instance;
@Override
public void create() {
camera=new PerspectiveCamera(70, Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
camera.position.set(0,0,0);
camera.near=0.1f;
camera.far=1000f;
camera.update();
cameraController=new FirstPersonCameraController(camera);
Gdx.input.setInputProcessor(cameraController);
cameraController.update(); batch=new ModelBatch();
builder=new ModelBuilder();
texture=new Texture(Gdx.files.internal("block.png"));
Material material=new Material(new TextureAttribute(TextureAttribute.Diffuse,texture));
int attributes= VertexAttributes.Usage.Position|VertexAttributes.Usage.TextureCoordinates;
model= builder.createBox(3, 3, 3, material, attributes);
instance= new ModelInstance(model);
instance.transform.setToTranslation(0,0,-5); } @Override
public void resize(int width, int height) {
camera.viewportWidth=width;
camera.viewportHeight=height;
camera.update();
cameraController.update();
} @Override
public void render() {
gl.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT);
camera.update();
cameraController.update();
batch.begin(camera);
batch.render(instance);
batch.end();
} @Override
public void pause() { } @Override
public void resume() { } @Override
public void dispose() { }
}

主类就换个类名就行了,接下来是结果展示图:



按wsad可以上下左右移动。

由于篇幅可能过长,下一章也许会讲。

libgdx摄像头的移动的更多相关文章

  1. 在DevExpress中使用CameraControl控件进行摄像头图像采集

    在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像 ...

  2. ubuntu-Linux系统读取USB摄像头数据(gspca)

    将摄像头图像保存为jpg格式.摄像头需要是gspca免驱的.uvc若用uvc格式的需要在图像中插入Huffman表.否则无法正常显示. 程序代码: #include <stdio.h> # ...

  3. ubuntu-Linux系统读取USB摄像头数据(uvc)

    这几天在做小车的过程中,需要用到图像采集.我想现在用的摄像头是UVC免驱的.根据国嵌的教程中有一个gspca摄像头的程序.我发现把gspca的采集程序用到uvc上时,在显示图像的时候提示没有huffm ...

  4. C# 使用AForge调用笔记本摄像头拍照

    vs2012  winform 连接摄像头设备,这里需要引入 代码: using AForge; using AForge.Controls; using AForge.Imaging; using ...

  5. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  6. Opencv VideoCapture实时捕捉摄像头信息

    #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using ...

  7. Unity打开摄像头占满全屏

    Unity打开摄像头占满全屏 AR项目需求,Unity打开摄像头作为背景渲染占满全屏~ Unity对设备硬件操作的API并不是太友好~打开一个摄像头,渲染到屏幕上也都得自己写,虽然步骤少,提取摄像头t ...

  8. Vuforia unity开发摄像头问题

    Vuforia unity开发摄像头问题 项目一直在赶进度,写博的时间越来越少了~从事Unity开发也快两个月了,AR方向~ 使用的是高通家的SDK Vuforia...从工程融合一直到对unity和 ...

  9. HTML5网页打开摄像头,并拍照

    谷歌提高了安全要求,要摄像头必须用https 效果图:

  10. 摄像头拍照,PHP输入流php://input的使用分析

    在做一个摄像头拍照然后上传的功能,php中使用php://input来获取内容.于是就了解了下php://input. 从官网信息来看,php://input是一个只读信息流,当请求方式是post的, ...

随机推荐

  1. 看完这篇HTTP,跟面试官扯皮就没问题了(转)

    认识 HTTP 首先你听的最多的应该就是 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),这你一定能说出来,但是这样还不够,假如你是大厂面试官,这不可能是他 ...

  2. SpringBoot项目优雅停机+Pid暴力停机

    bootstrap.yaml配置项目的pid输出位置 spring: pid: file: F:/cloud-nacos/cloud_gateway/application.pid springboo ...

  3. DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

    前言 继续书接上文 Docker Compose V2 安装常用数据库MySQL+Mongo,部署安装好之后我本来是找了一个web端的在线连接数据库的工具,但是使用过程中并不丝滑,最终还是选择了使用 ...

  4. 其它——ZeroRPC和SimpleXMLRPCServer

    文章目录 一 Python中RPC框架 二 SimpleXMLRPCServer使用 服务端 客户端 三 ZeroRPC使用 服务端 客户端 一 Python中RPC框架 自带的:SimpleXMLR ...

  5. android 尺寸适配相关

    Android上常见度量单位 px(像素):屏幕上的点,绝对长度,与硬件相关. in(英寸):长度单位. mm(毫米):长度单位. pt(磅):1/72英寸,point. dp(与密度无关的像素):一 ...

  6. Mysql数据库、表设计规范指南

    结合网上资料与项目实际情况,总结下列MYSQL数据库设计规范. 一.MYSQL数据库设计规范1.数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,禁止使 ...

  7. P1119 floyd

    最开始看错数据了没看到Q = 100 是50%的数据以为跑q遍floyd能过,结果只有30,其他全t 1.要注意题目中的条件,挖掘一些性质 2.本题的另一个关键的是要对floyd的过程原理比较熟悉,f ...

  8. 邮差之死--python源代码

    """sth imported""" import time import os '''2 flags''' flag = 0 tmp = ...

  9. 01_实验一_操作系统的启动start

    实验一 操作系统的启动 从源代码到可运行的操作系统(前置知识) API 与 SDK 以 C 语言编写的操作系统为背景进行介绍,EOS 是由 C 语言编写的 操作系统和应用程序之间一个重要的纽带就是应用 ...

  10. 确定性有限状态自动机 DFA

    前言 在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机.对于一个给定的属于该自动机的状态和一 ...