libGDX:灯光效果实现一(实现一个点光源)

news2024/9/20 5:40:06

国内的libGDX文章很少,特别是libGDX实现灯光效果,所以就开始总结灯光效果的实现

效果图.png

绿色的框 是为了方便看到Body位置,使用Box2DDebugRenderer渲染的

工欲善其事,必先利其器,工具集合
gdx-setup.jar

1. 从libGDX官网下载项目生成工具

https://libgdx.com/wiki/start/setup

2.配置项目

setup配置.png
Output folder和Android SDK设置自己的,扩展库选择Box2dBox2dlights,然后生成项目

3.配置ApplicationConfiguration,初始化ApplicationListener

由于是演示项目,所以直接使用系统创建好的Activity实现类

public class AndroidLauncher extends AndroidApplication {
   @Override
   protected void onCreate (Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
      config.a = 8;
      config.r = 8;
      config.g = 8;
      config.b = 8;
      initialize(new MyGdxGame(), config);
   }
}

4.创建物理模拟环境

public class MyGdxGame extends ApplicationAdapter {
   private World mWorld;
   private Box2DDebugRenderer mWorldDebugger;
   private ArrayList bodys = new ArrayList<Body>();
   private OrthographicCamera camera;
   private ExtendViewport viewport;
   private float accumulator = 0f;
   private RayHandler rayHandler;
   private Body body;

   private static final float TIME_STEP = 1 / 120f;
   private static final int VELOCITY_ITERATIONS = 6;
   private static final int POSITION_ITERATIONS = 2;

   private int viewportWidth;
   private int viewportHeight;

   @Override
   public void create() {
      super.create();
      // 1.创建world
      mWorld = new World(new Vector2(0f, -10f), true);
      // 2.创建窗口大小,给camera用
      viewportWidth = Gdx.graphics.getWidth();
      viewportHeight = Gdx.graphics.getHeight();
      // 3.初始化正交投影相机
      initCamera();
      // 这个是为了查看body
      mWorldDebugger = new Box2DDebugRenderer();
      // 创建Body,为了让点光源依附于他(可以不设置,点光源可以单独存在)
      makeBody();
      // 创建灯光处理(核心)
      rayHandler = new RayHandler(mWorld);
      makePointLight();
   }
   
    private void makePointLight() {
       // 创建点光源 
       // rays=100 越大约逼真,但是会降低性能
       // distance=150 光照扩展的范围
       PointLight light = new PointLight(rayHandler, 100, Color.RED, 150f, 0, 0);
       light.setSoftnessLength(0); //关闭软阴影
       light.attachToBody(body, 0.5f, 0.5f);
    }

    /**
    * 初始化相机 视口大小设置为屏幕大小
    * 相机位置设置到屏幕中心
    * 这样设置是为了好理解,可以直接让模拟物体设置在哪里就显示在哪里
    * 这样就不用再去想物体和屏幕坐标的映射关系
    */
    private void initCamera() {
       camera = new OrthographicCamera(viewportWidth,
             viewportHeight);
       camera.position.x = Gdx.graphics.getWidth() / 2f;
       camera.position.y = Gdx.graphics.getHeight() / 2f;
       camera.update();
    }

    /**
    * 创建body 
    * 一个半径50的圆形,为了看清楚也可以设置大一点
    */
    private void makeBody() {
       CircleShape ballShape = new CircleShape();
       ballShape.setRadius(50f);

       FixtureDef fixtureDef = new FixtureDef();
       fixtureDef.shape = ballShape;

       BodyDef bodyDef = new BodyDef();
       bodyDef.type = BodyDef.BodyType.StaticBody;
       // 这里也是把这个圆形放到屏幕中心了(圆形是以圆心为绘制起点画圆)
       bodyDef.position.x = viewportWidth / 2f;
       bodyDef.position.y = viewportHeight / 2f;

       body = mWorld.createBody(bodyDef);
       body.createFixture(fixtureDef);
       ballShape.dispose();
    }
  }

5.render

public class MyGdxGame extends ApplicationAdapter {

    @Override
    public void render() {
       super.render();
       // 1.更新相机
       camera.update();
       // 2.清理绘制区域
       ScreenUtils.clear(Color.CLEAR);
       Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
       // 3.时间步模拟(也可以按照官网的做固定时间步 1/60)
       doPhysicsStep(Gdx.graphics.getDeltaTime());
       // 4.给rayHandler设置matrix
       rayHandler.setCombinedMatrix(camera);
       // 5.渲染灯光
       rayHandler.updateAndRender();
       // 6.渲染body(非必须)
       mWorldDebugger.render(mWorld, camera.combined);
    }

    private void doPhysicsStep(float deltaTime) {
       // fixed time step
       // max frame time to avoid spiral of death (on slow devices)
       float frameTime = Math.min(deltaTime, 0.25f);
       accumulator += frameTime;
       while (accumulator >= TIME_STEP) {
          mWorld.step(
                TIME_STEP,
                VELOCITY_ITERATIONS,
                POSITION_ITERATIONS
          );
          accumulator -= TIME_STEP;
       }
    }
}

这样一个点光源就做好了,我的demo是让他附着在Body上,这样Body移动,他就可以跟着动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GrabCut算法、物体显著性检测

图割GraphCus算法。利用颜色、纹理等信息对GraphCut进行改进&#xff0c;形成效果更好的GrabCut算法。 对图像的目标物体和背景建立一个K维的全协方差高斯混合模型。 其中&#xff0c;单高斯模型的概率密度函数用公式表示为&#xff1a; 高斯混合模型可表示为n个单高斯模型的概…

Java生态/Redis中如何使用Lua脚本

文章目录一、安装LUA1&#xff09;简单使用二、lua语法简介1、注释1&#xff09;单行注释2&#xff09;多行注释2、关键字3、变量1&#xff09;全局变量2&#xff09;局部变量4、数据类型1&#xff09;Lua数组2&#xff09;字符串操作5、if-else6、循环1&#xff09;for循环1&g…

Java多线程中的CAS

多线程中的CAS 什么是CAS CAS CompareAndSwap&#xff0c;或者 CompareAndSet&#xff0c; 是一个能够比较和替换的方法。 这个方法能够在多线程环境下保证对一个共享变量进行修改时的原子性不变。 通常&#xff0c;CAS方法会传递三个参数&#xff0c; ● 第一个参数V表示要更新…

核心 Android 调节音量的过程

核心 Android 系统提供的调节音量的方法 核心 Android 系统提供了多种调节音量的方法&#xff0c;这些方法主要包括如下这些。 如在 Android Automotive 调节音量的过程 中我们看到的&#xff0c;CarAudioService 最终在 CarAudioDeviceInfo 中 (packages/services/Car/servi…

RHCSA-文件内容显示(3.6)

查看命令 cat&#xff1a;显示文件内容 cat -n&#xff1a;显示文件内容的同时显示编号 tac&#xff1a;倒叙查看 head 文件名 &#xff08;默认显示前10行&#xff09;&#xff1a;显示前10行 tail&#xff1a;显示末尾行数信息 more&#xff1a;查看文件信息&#xff0c;从头…

前端基础知识

文章目录前端基础知识HTML1. html基本结构2.常见的html标签注释标签标题标签(h1~h6)段落标签p换行标签 br格式化标签图片标签&#xff1a;img超链接标签表格标签列表标签表单标签input标签label标签select标签textarea 标签盒子标签div&span3. html特殊字符CSS1. 基本语法2…

Hive总结

文章目录一、Hive基本概念二、Hive数据类型三、DDL,DML,DQL1 DDL操作2 DML操作3 DQL操作四、分区操作和分桶操作1、分区操作2、分桶操作五、Hive函数六、文件格式和压缩格式一、Hive基本概念 Hive是什么&#xff1f; Hive&#xff1a;由 Facebook 开源用于解决海量结构化日志的…

监控易网络管理:网络流量分析

1、什么是网络流量分析2、网络流量分析的作用3、为什么要用网络流量分析功能&#xff0c;如何开启什么是网络流量分析简单的来说&#xff0c;网络流量分析就是捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量、分析、统计等&#xff0c;协助发…

[ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

XSS挑战赛(xsslabs)1~10关通关解析

简介 XSS挑战赛&#xff0c;里面包含了各种XSS的防御方式和绕过方式&#xff0c;好好掌握里面的绕过细节&#xff0c;有助于我们更好的去发现XSS漏洞以及XSS的防御。本文更多的是分享解析的细节&#xff0c;不是一个标准的答案&#xff0c;希望大家在渗透的时候有更多的思维。…

基于MindAR实现的网页端WebAR图片识别叠加动作模型追踪功能(含源码)

前言 由于之前一直在做这个AR/VR 相关的功能开发&#xff0c;大部分的时候实现方式都是基于高通Vuforia或者EasyAR等基于Unity3d的引擎的开发&#xff0c;这样开发的程序大部分都是运行在APP上&#xff0c;安卓或者ios的开发也能一次性搞定。不过当时大部分的需求都是需要在网…

Xshell的下载、使用、配置【ssh、telnet、串口】

目录 一、概述 二、Xshell的使用  2.1 Xshell使用ssh协议远程连接Linux主机或服务器  2.2 Xshell使用telnet协议远程连接Linux开发板  2.3 Xshell使用SERIAL协议远程连接Linux开发板 三、Xshell常用配置  3.1 配置默认会话属性 一、概述 Xshell是由NetSarang公司开发的强大…

【Linux】-- 进程间通讯

目录 进程间通讯概念的引入 意义&#xff08;手段&#xff09; 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载均衡 匿名管道读写规则 命名管道 前言 原理…

深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制

深入理解java虚拟机精华总结&#xff1a;性能监控和故障处理工具、类加载机制性能监控和故障处理工具、类加载机制jpsjstatjinfojmapjhatjstackVisualVM类加载机制类加载的时机类加载的过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型破坏双亲委派模型往期内容&am…

HTML5的新特性

前言 为了更好地处理今天的互联网应用&#xff0c;HTML5添加了很多新元素及功能&#xff0c;比如: 图形的绘制&#xff0c;多媒体内容&#xff0c;更好的页面结构&#xff0c;更好的形式 处理&#xff0c;和几个api拖放元素&#xff0c;定位&#xff0c;包括网页 应用程序缓存…

八股总结(二)计算机网络与网络编程

layout: post title: 八股总结&#xff08;二&#xff09;计算机网络与网络编程 description: 八股总结&#xff08;二&#xff09;计算机网络与网络编程 tag: 八股总结 文章目录计算机网络网络模型网络体系结构在浏览器输入一个网址后回车&#xff0c;背后都发生了什么&#x…

C/C++每日一练(20230306)

目录 1. 判断素数的个数 ☆ 2. 分隔链表 ★★ 3. 数据流的中位数 ★★ 1. 判断素数的个数 在一个数组A中存放100个数据&#xff0c;用子函数判断该数组中哪些是素数&#xff0c;并统计该素数的个数&#xff0c;在主函数中输出该素数的个数。 代码&#xff1a; #includ…

三、Spark 内存管理

文章目录Spark 内存管理堆内和堆外内存堆内内存堆外内存堆外与堆内的平衡内存空间分配静态内存管理&#xff08;早期版本&#xff09;统一内存管理Spark 内存管理 堆内和堆外内存 Spark 引入了堆外&#xff08;Off-heap&#xff09;内存&#xff0c;使之可以直接在工作节点的…

Java——打开轮盘锁

题目链接 leetcode在线oj题——打开轮盘锁 题目描述 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转&#xff1a;例如把 ‘9’ 变为 ‘0’&#xff0…

对话镕铭微电子蔡媛:深入理解用户痛点,满足差异化需求

“芯片不仅仅是一个硬件产品&#xff0c;为了更好的贴近用户、服务用户&#xff0c;我们需要在固件和软件的框架上投入足够的研发资源&#xff0c;与客户同步迭代更新&#xff0c;以适应其快速的业务迭代要求。在深入理解用户需求和痛点的基础上&#xff0c;满足用户差异化的功…