Libgdx专题系列:物理引擎篇 Box2D
声明: 本系列文章使用的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的简单的了解,就到这了。 想深入学习,可以到他的官网查看。
项目下载地址
截屏
http://blog.csdn.net/wu928320442/article/details/17285405

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











가상 머신(VM)을 물리적 머신으로 변환하는 것은 가상 인스턴스 및 관련 애플리케이션 소프트웨어를 물리적 하드웨어 플랫폼으로 마이그레이션하는 프로세스입니다. 이러한 변환은 운영 체제 성능과 하드웨어 리소스 활용도를 최적화하는 데 도움이 됩니다. 이 문서에서는 이러한 변환을 수행하는 방법을 자세히 살펴보는 것을 목표로 합니다. 가상 머신에서 물리적 머신으로의 마이그레이션을 어떻게 구현하나요? 일반적으로 가상 머신과 물리적 머신 간의 변환 프로세스는 타사 소프트웨어에 의해 가상 머신 외부에서 수행됩니다. 이 프로세스는 가상 머신 구성 및 리소스 전송과 관련된 여러 단계로 구성됩니다. 실제 머신 준비: 첫 번째 단계는 실제 머신이 Windows의 하드웨어 요구 사항을 충족하는지 확인하는 것입니다. 변환 프로세스가 기존 데이터를 덮어쓰게 되므로 실제 머신에 데이터를 백업해야 합니다. *시스템 이미지를 생성할 수 있는 관리자 권한이 있는 관리자 계정의 사용자 이름 및 비밀번호입니다. 가상일 것이다

샤오미 Mi 15 시리즈는 10월 정식 출시될 예정이며, 전체 시리즈 코드명이 외신 MiCode 코드베이스에 노출됐다. 그중 주력 제품인 샤오미 미 15 울트라의 코드명은 '쉬안위안(Xuanyuan)'('쉬안위안(Xuanyuan)'이라는 뜻)이다. 이 이름은 중국 신화 속 황제(Yellow Emperor)에서 유래한 것으로 귀족을 상징한다. Xiaomi 15의 코드명은 "Dada"이고, Xiaomi 15Pro의 이름은 "Haotian"("Haotian"을 의미)입니다. Xiaomi Mi 15S Pro의 내부 코드명은 "dijun"으로, "산과 바다의 고전"의 창조신인 Jun 황제를 암시합니다. Xiaomi 15Ultra 시리즈 커버

지난해 화웨이 메이트60 시리즈가 출시된 이후 개인적으로는 메이트60프로를 메인폰으로 사용해오고 있다. 거의 1년 동안 Huawei Mate60Pro는 여러 번의 OTA 업그레이드를 거쳤으며 전반적인 경험이 크게 개선되어 사람들에게 끊임없이 새로운 느낌을 줍니다. 예를 들어, 최근 Huawei Mate60 시리즈는 이미징 기능이 다시 한 번 크게 업그레이드되었습니다. 첫 번째는 행인과 잔해를 지능적으로 제거하고 빈 영역을 자동으로 채울 수 있는 새로운 AI 제거 기능입니다. 두 번째로 메인 카메라의 색상 정확도와 망원 선명도가 크게 업그레이드되었습니다. 개학 시즌을 고려하여 Huawei Mate60 시리즈도 가을 프로모션을 시작했습니다. 휴대폰 구매 시 최대 800위안 할인 혜택을 누릴 수 있으며, 시작 가격은 최저 4,999위안입니다. 일반적으로 사용되며 종종 가치가 높은 새로운 제품

일부 물리학자들은 인간이 실제로 매트릭스 공간에 살고 있음을 확인했습니다! ? 이렇게 신비해 보이는 결론이 과학으로 확인될 수 있습니까? 포츠머스 대학 물리학과 부교수이자 정보 이론 전문가인 멜빈 밥슨(Melvin Vopson)은 새로운 논문에서 인간이 시뮬레이션된 세계에 살고 있다는 가설이 정보의 기본 법칙에 존재할 수 있다고 제안했습니다. 예를 들어, 이러한 법칙은 인간의 DNA 유전 정보나 컴퓨터에 저장된 디지털 정보에 숨겨져 있을 수 있습니다. 역학 제2법칙과 그의 결과는 시간이 지남에 따라

8일 뉴스에 따르면 미국 자동차 시장은 그동안 사랑받았던 6기통과 8기통 동력엔진이 점차 그 위세를 잃어가는 가운데 3기통 엔진이 등장하고 있다. 10월 8일자 뉴스에서는 미국 자동차 시장이 내부적으로 변화를 겪고 있다는 소식을 전했습니다. 과거에 사랑받았던 6기통과 8기통 동력엔진은 점차 그 지배력을 잃어가고 있으며, 대부분의 사람들의 마음 속에는 미국인들이 대용량 배기량 모델과 '미국의 대형 V8'을 좋아하기 시작하고 있습니다. 항상 미국 자동차와 동의어였습니다. 그러나 최근 외신이 공개한 자료에 따르면 미국 자동차 시장의 지형은 엄청난 변화를 겪고 있으며 내부 경쟁도 치열해지고 있다. 2019년 이전에는 미국이

클라우드 서버의 vCPU는 물리적 서버의 CPU에서 실행을 시뮬레이션하는 프로세서입니다. 물리적 서버는 일반적으로 여러 vCPU 인스턴스를 지원할 수 있으며 각 인스턴스는 독립적으로 실행됩니다. 이러한 vCPU의 수는 물리적 서버의 구성과 클라우드 서비스 제공업체의 정책에 따라 다릅니다. vCPU와 물리적 CPU 간의 관계는 시분할 다중화 기술을 통해 달성됩니다. 즉, 물리적 CPU의 시간을 여러 시간 세그먼트로 나누고 각 세그먼트가 가상 머신 인스턴스의 vCPU에 할당된다는 의미입니다. 따라서 가상 머신 인스턴스의 vCPU는 전체 물리적 CPU가 아닌 할당된 시간 조각만 사용할 수 있습니다. vCPU의 성능은 기본 물리적 CPU에 의해 제한됩니다. 예를 들어 CPU 코어 4개와 스레드 8개를 갖춘 물리적 서버가 가장 적합합니다.

'사이버펑크 2077'에서 황학자가 만든 지능형 NPC는 이미 중국어를 할 수 있다고요? 중국어와 영어로 유창하게 대화하는 NPC들의 자연스러운 표정과 움직임, 그리고 입 모양의 조화까지.. 눈앞에 스크린이 없었다면 정말 그곳에 있는 것 같은 느낌이 들었습니다. 올해 CES 전시회에서 엔비디아는 자사의 지능형 엔진인 아바타 클라우드 엔진(ACE)을 사용해 게임 NPC를 '살아있다'로 만들어 적잖은 충격을 안겼다. △CES에 전시된 지능형 NPC는 ACE를 사용한다. 게임 속 캐릭터는 미리 대본을 준비하지 않고도 생생한 표정과 신체 움직임을 보여주며 플레이어와 실감나는 음성 대화를 할 수 있다. 데뷔 당시 유비소프트, 텐센트, 넷이즈, 미호요 등이 있었다.

실시간 전역 조명(Real-time GI)은 항상 컴퓨터 그래픽의 성배였습니다. 수년에 걸쳐 업계에서는 이 문제를 해결하기 위해 다양한 방법을 제안해 왔습니다. 일반적인 방법에는 정적 기하학, 대략적인 장면 표현 또는 대략적인 프로브 추적과 같은 특정 가정을 활용하고 둘 사이에 조명을 보간하여 문제 영역을 제한하는 것이 포함됩니다. 언리얼 엔진에서 전역 조명 및 반사 시스템인 Lumen 기술은 Krzysztof Narkowicz와 Daniel Wright가 공동 창립했습니다. 목표는 이전 제품과 달리 균일한 조명과 구워진 듯한 조명 품질이 가능한 솔루션을 구축하는 것이었습니다. 최근 SIGGRAPH 2022에서 Krzysztof Narko는
