要知道,做一个游戏,摄像头是必不可少的。接下来,我将讲解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. BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...

  2. 特斯拉Dojo超算:AI训练平台的自动驾驶与通用人工智能之关键

    特斯拉公开Dojo超算架构细节,AI训练算力平台成为其自动驾驶与通用人工智能布局的关键一环 在近日举行的Hot Chips 34会议上,特斯拉披露了其自主研发的AI超算Dojo的详细信息.Dojo是一 ...

  3. Solution -「洛谷 P6156」简单题

    Description Link. 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^kf(\gcd(i,j))\gcd(i,j)\). Solution ...

  4. Solution -「CF 959E」Mahmoud and Ehab and the xor-MST

    Description Link. 一完全图有 \(n\) 个节点 \(0,...,n-1\),其中边 \((i,j)\) 的权值为 \(i\oplus j\),其中 \(\oplus\) 为位异或操 ...

  5. Mysql忘记密码后如何重置密码

    长时间不使用本机的Mysql后把密码忘记了咋整?直接上干货: 第一步(Mysql部署的位置,若自己能找到就忽略这一步):任务管理器中也可以找到 第二步:修改配置文件 在my.ini末尾加上 skip- ...

  6. linux下查找文件中某字符串出现的行以及该行前后n行

    linux下查找文件中某字符串出现的行以及该行前后n行 查找指定字符串的前后n行 grep -A 100 -B 100 "要查找的字符串" 被查找的文件 -A after 后面 - ...

  7. 一个 println 竟然比 volatile 还好使?

    前两天一个小伙伴突然找我求助,说准备换个坑,最近在系统复习多线程知识,但遇到了一个刷新认知的问题-- 小伙伴:Effective JAVA 里的并发章节里,有一段关于可见性的描述.下面这段代码会出现死 ...

  8. 0 基础晋级 Serverless 高手课 — 初识 Serverless(下)

    冷启动 1. 流量预测 2. 提前启动 3. 实例复用 每个厂商规范不一致:,兼容,适配层:adapter: fs+oss 云厂商对比 产品维度 功能架构角度 个人博客官网 小程序           ...

  9. 基于.Net 的 AvaloniUI 多媒体播放器方案汇总

    基于.Net 的 AvaloniUI 多媒体播放器方案汇总 摘要 随着国产化的推进,相信.Net的桌面端的小伙伴的可能已经有感受到了. 为了让.Net的桌面框架能够跨桌面平台,首选的就是Avalona ...

  10. 中山市 香山杯2023 Misc pintu

    大便题目啊,跟拼图没有半毛钱关系 附件给我们4703张图片,而且给了tip:8->10,且这些图片的宽度都是一样的. 首先我们考虑将黑色图片当作0,白色图片当作1,将这些按编号顺序将这些图片转成 ...