首頁 資料庫 mysql教程 Libgdx专题系列:物理引擎篇 Box2D

Libgdx专题系列:物理引擎篇 Box2D

Jun 07, 2016 pm 03:08 PM
libgdx 聲明 引擎 物理 系列

声明: 本系列文章使用的Libgdx版本均为 0.99 版本 Libgdx游戏开发交流群 323876830 Box2D的是一个物理引擎库。他是一个用于2D的最流行的物理引擎库中的一个,被用到了许多语言,各种引擎中, 其中就包括咱们使用的这个Libgdx。 Libgdx中的Box2D实现了对于C

声明:

本系列文章使用的Libgdx版本均为0.99版本

Libgdx游戏开发交流群 323876830

 

Box2D的是一个物理引擎库。他是一个用于2D的最流行的物理引擎库中的一个,被用到了许多语言,各种引擎中,

其中就包括咱们使用的这个Libgdx。

Libgdx中的Box2D实现了对于C++引擎的java包装,所以参考文档也可以直接使用C++版本的,official Box2D manual (PDF)

想获得更多的信息可以到Box2D的官网,box2d.org 获得信息。

这里我找到一个中文翻译的v2.0.1版本,这里要谢谢译者Aman JIANG(江超宇)。

文档下载地址

但是v2.0.1的版本比较老了,有一些概念都不一样了,例如2.1世界没有了包围盒,绑定形状到物体有了FixtureDef的概念,

这里有一个v2.1.0的翻译版本

http://blog.csdn.net/complex_ok/article/category/871440

特别推荐Box2D教程 http://www.iforce2d.net/b2dtut/introduction

对应中文译文 http://ohcoder.com/blog/categories/box2d-tutorials/

 

创建一个世界

物理世界,那么首先需要创造一个世界,他是物理物体,作用力的基础。但是他不会帮我们绘制物体, 需要我们使用Libgdx

绘制的相关api来进行绘制。 也就是说我们获取物体的坐标,旋转信息什么的,然后自己绘制。 但是他在debug模式下,可以

绘制自己的物理模拟信息,形状啦,什么的。

 

可以向下面一样创建一个世界

World world = new World(new Vector2(0, -10), true); 
登入後複製

第一个参数是一个2维向量,0说明水平方向的重力为0, 10说明垂直方向的重力为10. 因为他是一个y轴向上的坐标系,所以负号

代表向下。这个和opengl的世界坐标系是一致的。当然你也可以改成你想要的值, 不过要注意比例,在Box2D中 1单元=1米。

第二个参数的意思是我们创造的世界要不要让物体休眠,休眠可以减少cpu的使用, 具体休不休眠看你的情景了。

 

这里的比例最好和绘制的保持一致,也就是我们的opengl绘制。这样精灵,镜头的单位都统一。

 

Debug绘制

如果我们想开启debug绘制, 可以这样

mDebugRender = new Box2DDebugRenderer();
登入後複製
mDebugRender.render(mWorld, mCam.combined);
登入後複製

这里要注意一下, 当我们发布的时候要注释掉 , 我测试了一个例子, 在开启状态只有十几帧,关闭掉能够达到

五六十帧的,还是很好性能的。

 

时间步

想要我们的物理模拟动起来, 需要我们告诉他。最好调用它的位置在reader的最后面。

最好给他的帧率是一样的,不要使用绘制的帧率,像这样

world.step(1/60f, 6, 2);
登入後複製

第一个参数是时间步,也就是我们想让世界模拟的时间。
在大部分情况下, 这个时间步都应该是固定的, Libgdx推荐在移动手机1/45f或者1/300f.

另外两个参数是velocityIterations,positionIterations 速度的约束求解量 和 位置的约束求解量.

约束求解器用于解决模拟中的所有
约束,一次一个。单个的约束会被完美的求解,然而当我们求解一个约束的时候,我们就会稍微耽误另
一个。要得到良好的解,我们需要迭代所有约束多次。建议的  Box2D 迭代次数是 10 次。你可以按自己
的喜好去调整这个数,但要记得它是速度与质量之间的平衡。更少的迭代会增加性能并降低精度,同样
地,更多的迭代会减少性能但提高模拟质量。

 

绘制

推荐的做法是在step之前绘制我们的图形, 否则将会出现不同步的问题。

如果想要debug绘制, 可以使用

debugRenderer.render(world, camera.combined);
登入後複製

第一个参数是世界,第二个是镜头矩阵

 

Body物体
现在如果我们运行我们的代码,将会什么也看不到,虽然我们的世界步执行着呢, 这是因为我们没有放入

任何物体进去。 所以, 接下来我们会放进去一些物体。

在Box2D中, 对象叫做物体, 物体包含许多固定物fixtures,他可以固定物体的位置,方向等, 固定物可以是

任何形状, 可以组合多个不同的固定物来组成物体。

固定物包含形状, 密度, 摩擦力,恢复力。形状就是集合图形了, 密度是每立方米的物体的质量, 就比如保龄球

和氢气球,密度大密度小。摩擦力就是物体接触移动产生的力,在冰上移动和在橡胶上, 摩擦力显而易见了。

恢复力就是有多大的弹性, 石头的弹性就比较小 , 乒乓球的弹性就比较大。 当一个物体的弹性是0的时候, 当接触到

地面就会停止,当为1的时候, 他会反弹到他原来的高度。

物体有三种类型:Dynamic动态的,Static静态的,Kinematic介于他们之间的运动物体。

 

动态物体

动态物理可以四处移动, 他受力的作用和其他动态物体,静态物体, 运动物体的作用。

他适合那种需要移动然后受到力的作用的物体。

现在我们学习固定物的创建, 来构造物体

// First we create a body definition
BodyDef bodyDef = new BodyDef();
// We set our body to dynamic, for something like ground which doesn't move we would set it to StaticBody
bodyDef.type = BodyType.DynamicBody;
// Set our body's starting position in the world
bodyDef.position.set(100, 300);

// Create our body in the world using our body definition
Body body = world.createBody(bodyDef);

// Create a circle shape and set its radius to 6
CircleShape circle = new CircleShape();
circle.setRadius(6f);

// Create a fixture definition to apply our shape to
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.density = 0.5f; 
fixtureDef.friction = 0.4f;
fixtureDef.restitution = 0.6f; // Make it bounce a little bit

// Create our fixture and attach it to the body
Fixture fixture = body.createFixture(fixtureDef);

// Remember to dispose of any shapes after you're done with them!
// BodyDef and FixtureDef don't need disposing, but shapes do.
circle.dispose();
登入後複製

现在我们创建了一个球的物体到我们的世界。运行的时候可以看到他将会下落, 但是感觉还是没多少意思,

没有力的作用, 下面我们来加入静态物体地板。

 

静态物体

静态物体是一个不能移动, 也不受力的作用的物体。动态物体接触它, 动态物体会有力的作用的。静态物体

让他来做为地板,墙壁等不能动的物体是非常合适的。 静态物体也消耗比较少的计算量。

让我们来创建一个静态物体, 跟我们前面的创建动态物体的代码比较像

// Create our body definition
BodyDef groundBodyDef =new BodyDef();  
// Set its world position
groundBodyDef.position.set(new Vector2(0, 10));  

// Create a body from the defintion and add it to the world
Body groundBody = world.createBody(groundBodyDef);  

// Create a polygon shape
PolygonShape groundBox = new PolygonShape();  
// Set the polygon shape as a box which is twice the size of our view port and 20 high
// (setAsBox takes half-width and half-height as arguments)
groundBox.setAsBox(camera.viewportWidth, 10.0f);
// Create a fixture from our polygon shape and add it to our ground body  
groundBody.createFixture(groundBox, 0.0f); 
// Clean up after ourselves
groundBox.dispose();
登入後複製

我们怎么样不适用FixtureDef创造一个夹具呢?如果我们只有形状和密度, createFixture有个重载方法,调用它就可以了。

现在我们看到, 球下落到我们的地面上, 然后反弹, 最终停止在地面上, 我们也可以更改其中的值来看看有什么其他效果。

 

运动物体


Kinematic物体是一个介于在静态和动态物体之间的物体。 像静态物体,他们不受力的作用, 像动态物体,他们可以移动。

应用的场景例如移动的平台等。

我们可以直接的调用Kinematic物体的位置,直接更改他的位置, 但是最好的方式是设置一个速度,让Box2D自己来更改

他的坐标。

我们可以使用上面创建动态和静态物体的方式一样来创建这个物体, 一旦我们创建好, 我们可以像下面一样来控制他

// Move upwards at a rate of 1 meter per second
kinematicBody.setLinearVelocity(0.0f, 1.0f);
登入後複製

好了, 运行程序, 我们发现, 我们的物体在朝着一个固定的方向移动, 当我们的小球遇到咱们这个方块的时候,由于力

的作用,朝右方向移动了,但是它与静态物体地板接触的时候, 并没有受到力的作用, 当然地板也没有力的作用。

 

冲量与力

冲量和力用来移动物体, 但是不会改变重力和碰撞检测。

力是一个逐渐改变物体速度的过程, 比如火箭的升起,是有一个力的驱动,逐渐改变火箭的速度, 慢慢升起的,越来

越快。

冲量就不同了,可以瞬间改变物体速度,比如吃豆人游戏,角色都是在一个恒定的速度移动,改变也是瞬间的。

首先我们需要一个动态的物体,就使用上面那个吧。

 

应用力

力是单位是牛顿。 如果力没有作用在质量的中心,那么将会产生一个扭矩, 产生一个带有夹角的速度。

// Apply a force of 1 meter per second on the X-axis at pos.x/pos.y of the body slowly moving it right
dynamicBody.applyForce(1.0f, 0.0f, pos.x, pos.y, true);

// If we always want to apply force at the center of the body, use the following
dynamicBody.applyForceToCenter(1.0f, 0.0f, true);
登入後複製


应用冲量
冲量就像一个特殊的力,只是冲量可以立即改变物体的速度。 同样的, 如果冲量没有作用在物体的中间, 也将会产生

一个扭矩, 产生一个带有夹角的速度。冲量的单位是 牛顿每秒 或者 kg-m/s.

// Immediately set the X-velocity to 1 meter per second causing the body to move right quickly
dynamicBody.applyLinearImpulse(1.0f, 0, pos.x, pos.y, true);
登入後複製


有一点要注意一下,应用力和冲量会唤醒物体, 有时候这不是我们想要的, 比如, 你想作用一个稳定的力,想让物体在睡眠中执行,

这种情况下, 我们可以这样

// Apply impulse but don't wake the body
dynamicBody.applyLinearImpulse(0.8f, 0, pos.x, pos.y, false);
登入後複製


Joints关节

占位

 

Fixture Shapes形状

占位

 

Sprites and Bodies 精灵与物体

最简单的方式管理精灵语物体的是使用Box2D的用户数据,我们可以使用用户数据改变游戏对象的位置坐标, 旋转等信息。

设置用户信息也比较简单,可以这样

body.setUserData(Object);
登入後複製

这个用户数据可以是任何java对象, 一个比较好的方式是建立一个游戏对象然后放入用户数据,这样以后可以使用。

Fixtures夹具也可以设置用户数据,和上面一样。

想更新我们的角色或精灵的信息, 可以遍历所有的世界物体,取出对应的用户数据,然后更新信息, 示例

Iterator bi = world.getBodies();
        	   
while (bi.hasNext()){
    Body b = bi.next();

    // Get the bodies user data - in this example, our user 
    // data is an instance of the Entity class
    Entity e = (Entity) b.getUserData();

    if (e != null) {
        // Update the entities/sprites position and angle
        e.setPosition(b.getPosition().x, b.getPosition().y);
        // We need to convert our angle from radians to degrees
        e.setRotation(MathUtils.radiansToDegrees * b.getAngle());
    }
}
登入後複製


绘制部分还是和以前一样的。 没有什么改动。

 

Sensors传感器
传感器是当物体间碰撞,而又不产生自动响应。 比如, 我们想知道两个物体重叠的事件。

这里需要设置'isSensor'为true。像这样

//At the definition of the Fixture
fixtureDef.isSensor = true;
登入後複製

想监听它,需要实现ContactListener接口,在对应方法中实现自己的逻辑。

 

传感器接口

传感器接口监听fixture夹具的碰撞,方法包含一个传感对象, 传感对象包含了两个物体的有关信息, 当物体重叠的时候

调用beginContact ,当物体分开的时候调用endContact

public class ListenerClass implements ContactListener {
			
      @Override
			public void endContact(Contact contact) {
				
			}
			
			@Override
			public void beginContact(Contact contact) {
				
			}
		};
登入後複製


有时候, 我们需要得到游戏对象的信息, 怎么办呢?其实这个在我们需要在设置用户数据的时候, 把我们的游戏对象信息设置

到body或者fixture中, 然后取出来, 做逻辑,比如,减血或其他。

 

好了, Box2D的简单的了解,就到这了。 想深入学习,可以到他的官网查看。

 

项目下载地址

 

截屏

Libgdx专题系列:物理引擎篇 Box2D

 

http://blog.csdn.net/wu928320442/article/details/17285405

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
如何將虛擬機器轉換為實體機器? 如何將虛擬機器轉換為實體機器? Feb 19, 2024 am 11:40 AM

將虛擬機器(VM)轉換為實體機器是一種將虛擬實例和關聯的應用軟體遷移到實體硬體平台的過程。這種轉換有助於優化作業系統的效能和硬體資源利用。本文旨在深入探討如何進行這種轉換。如何實現從虛擬機器到實體機器的遷移?通常,虛擬機器與實體機之間的轉換過程由第三方軟體在虛擬機器外部執行。這個過程包括多個階段,涉及虛擬機器的配置和資源轉移。準備實體機器:第一步是確保實體機符合Windows的硬體需求。我們需要在實體機上備份數據,因為轉換過程將覆蓋現有數據。 *管理員帳戶的使用者名稱和密碼,具有建立系統映像的管理員權限。將虛擬

小米 15 系列全代號曝光:Dada、Haotian、Xuanyuan 小米 15 系列全代號曝光:Dada、Haotian、Xuanyuan Aug 22, 2024 pm 06:47 PM

小米15系列預計10月正式發布,其全系列代號已在外媒MiCode程式碼庫曝光。其中,旗艦級小米15Ultra代號為"Xuanyuan"(意為"軒轅"),此名源自中國神話中的黃帝,象徵尊貴。小米15的代號為"Dada",而小米15Pro則以"Haotian"(意為"昊天")為名。小米15SPro內部代號為"dijun",暗指《山海經》創世神帝俊。小米15Ultra系列涵蓋

華為 Mate 60 系列最佳入手時機,新增 AI 消除 + 影像升級,更可享秋日禮遇活動 華為 Mate 60 系列最佳入手時機,新增 AI 消除 + 影像升級,更可享秋日禮遇活動 Aug 29, 2024 pm 03:33 PM

自去年华为Mate60系列开售以来,我个人就一直将Mate60Pro作为主力机使用。在将近一年的时间里,华为Mate60Pro经过多次OTA升级,综合体验有了显著提升,给人一种常用常新的感觉。比如近期,华为Mate60系列就再度迎来了影像功能的重磅升级。首先是新增AI消除功能,可以智能消除路人、杂物并对空白部分进行自动补充;其次是主摄色准、长焦清晰度均有明显升级。考虑到现在是开学季,华为Mate60系列还推出了秋日礼遇活动:购机可享至高800元优惠,入手价低至4999元。常用常新的产品力加上超值

雲端伺服器vCPU與實體CPU關係? 雲端伺服器vCPU與實體CPU關係? Feb 19, 2024 pm 07:10 PM

雲端伺服器中的vCPU是在實體伺服器的CPU上模擬運行的處理器,一台實體伺服器通常可以支援多個vCPU實例,每個實例都獨立運作。這些vCPU的數量取決於實體伺服器的配置和雲端服務提供者的策略。 vCPU與實體CPU之間的關係是透過分時復用技術實現的,這意味著物理CPU的時間被劃分成多個時間片段,每個片段都分配給一個虛擬機器實例的vCPU使用。因此,虛擬機器實例的vCPU只能使用分配給它的時間片,而不是整個實體CPU。 vCPU的效能受到底層實體CPU的限制。例如,一個有4個CPU核心和8個執行緒的實體伺服器最

Redmi G Pro 2024 3 月 4 日見,冰封散熱 狂暴引擎 PC 版加持 Redmi G Pro 2024 3 月 4 日見,冰封散熱 狂暴引擎 PC 版加持 Mar 02, 2024 pm 12:19 PM

Redmi官方今日宣布,全新RedmiGPro2024將於3月4日正式發表。也就是說,下週我們將迎來這款令人期待的新品發表會。 RedmiGPro2024以電競旗艦身份全面登場,將手機產業能力深度融入筆電業務,呈現210W超強性能釋放,Redmi性能再創新高。搭載i9-14900HX處理器與RTX4060顯示卡,將電競與創作完美結合,實現雙重進化。就此來看,這款新品的性能表現將會再次提升,實際效果如何令人期待。官方預熱中提到,全新RedmiGPro2024帶來了狂暴引擎PC版。手機技術賦能,三大子引

AI炸翻物理學! 21度室溫超導預定諾獎? Nature撤稿教授反獲OpenAI投資 AI炸翻物理學! 21度室溫超導預定諾獎? Nature撤稿教授反獲OpenAI投資 Apr 12, 2023 pm 07:04 PM

人類在21℃條件下達到室溫超導了?物理圈徹底炸了!北京時間昨天下午,一顆驚雷在美國拉斯維加斯舉辦的物理學會上爆炸——高溫超導疑似顛覆性突破。會議上,美國羅徹斯特大學物理學家Ranga Dias報告了這個室溫超導研究的里程碑式突破。假如這次Ranga Dias真的實現了室溫超導,那全球的能耗問題,將從源頭解決──人類將利用電能獲得巨大的力量。如果再從根上掌握了可控核融合,我們甚至可以進行遠距離的太空旅行,可以說,人類真的要起飛了。而掌握這項技術的人,無疑將引領世界。 (簡直是科幻走進現實。)

實測英偉達AI遊戲引擎:與NPC即時聊天,中文流暢爆了 實測英偉達AI遊戲引擎:與NPC即時聊天,中文流暢爆了 Mar 04, 2024 am 09:40 AM

黃院士在《Cyber​​punk2077》裡搞的智能NPC,已經飆起中文了?量子位的一手體驗,親眼見證了NPC們流利地用中英雙語對話,表情動作自然,口型也能對上……如果不是眼前就有一塊屏幕,真的會有種身臨其境之感。今年的CES展上,英偉達用智慧引擎AvatarCloudEngine(ACE),讓遊戲NPC「活」了起來,引起了不小的震撼。 △CES上展示的智慧NPC使用ACE,遊戲中的角色可以與玩家進行逼真的語音對話,同時展現出生動的表情和肢體動作,而無需事先準備劇本。亮相當時,就有育碧、騰訊、網易、米哈遊等國

清華光學 AI 登 Nature!物理神經網絡,反向傳播不需要了 清華光學 AI 登 Nature!物理神經網絡,反向傳播不需要了 Aug 10, 2024 pm 10:15 PM

用光訓練神經網絡,清華成果最新登上了Nature!無法應用反向傳播演算法怎麼辦?他們提出了一種全前向模式(FullyForwardMode,FFM)的訓練方法,在實體光學系統中直接執行訓練過程,克服了傳統基於數位電腦模擬的限制。簡單點說,以前需要對物理系統進行詳細建模,然後在電腦上模擬這些模型來訓練網路。而FFM方法省去了建模過程,讓系統直接使用實驗數據進行學習和最佳化。這也意味著,訓練不需要再從後向前檢查每一層(反向傳播),而是可以直接從前向後更新網路的參數。打個比方,就像拼圖一樣,反向傳播

See all articles