Construct2/3

创建于:2017-02-24

创建人: iconboy

103 信息 418 成员
Construct2/3 引擎开发专题

C2物理基础教程2篇-翻译

慕雪白羊 2017-07-07

翻译by 白羊 

教程来源于:

Physics in Construct 2: The basics
Physics in Construct 2: Forces, impulses, torque and joints


Physics in Construct 2: The basics

C2的物理基础


C2的物理系统是基于 Box2DWeb. 这允许你用真实的物理物体移动-这里有一个演示来演示这个想法(here's a demo) 物理可以使你的游戏真正有趣和迷人!下面是一个如何在游戏中使用物理的概述。

如果你在学校上过物理课,你会发现你学到的一些东西可以用在C2的物理系统里面。我仍然会简单地解释这些基础知识,因为我怕你学过的东西都还给老师了。对一些理论感兴趣吗?你可能想读维基百科的文章 Newton's laws of motion. 这是另外一个有用的链接: another link

C2自带许多物理方面的例子! 在开始屏幕点击 Browse all examples,搜索 "Physics - "就可以找到和物理相关的所有范例,比如 "Physics - basics.capx".它们很值得一看。如果你已经看过了这些范例,你可能会更加透彻地了解这个教程中所提及的东西。


How to add Physics/怎样添加物理

Properties Bar,选择要添加物理的对象。点击Add / Edit Behaviors.给对象添加一个行为,点击绿色加号图标和对话框找到Physics 行为。准备就绪了!

我们可以给任何对象加上这个 物理行为 让它变成“物理对象”


Gravity/重力

默认情况下,物理对象上存在重力,它让所有物体加速向下运动。默认重力为10(记住,y轴在C2中向下增加)。如果你想关闭重力,你可以在任何物理物体上使用重力作用(Set gravity)。注意:万有引力适用于整个“世界”。如果在一个物体上设置重力为0,则所有物体的重力都被关闭。

Image title


Making the scenery/让场景块固定不动

你不希望你的游戏的场景图块受到一个重力。即使在“没有重力”的游戏中,如果被什么东西碰撞,场景图块会被移动并可能开始转动。(根据牛顿的第三定律:“相互作用的两个物体之间的作用力和反作用力总是大小相等,方向相反,作用在同一条直线上。”,这意味着场景图块也被往后推了一点。)

在我们的游戏中,大部分时间我们都想制作那些坚如磐石的场景:它不会随着重力掉出屏幕,也不会因为被它击中而向后移动一点。解决这个问题,就是将物理对象的不可移动属性(Immovable property)设置为“Yes”来模拟。

Image title


然后这个对象就会被当成有无限质量的物体了。它插翅也难飞了!

注意:物理对象只与其他物理对象交互。在场景图块上添加固体(solid)行为对物理物体没有影响。他们忽略了任何不具有物理行为的东西。物理对象将通过“solid”对象,除非你给他们物理行为,并将其设置不可移动属性(Immovable property)。



The other physics properties/其他物理性质

让我们简要地讨论物理行为中的其他性质:

 Collision mask/碰撞遮罩、碰撞形状
这将设置对象的碰撞形状。碰撞遮罩使用物体的图像编辑中(Image/Animations editor)的碰撞多边形。你可以更改碰撞点,创建复杂的碰撞形状,不过这样做可能会拖慢运行的速度。如果设置为包围框或圆,则忽略图像编辑器中的碰撞多边形。相反,它要么使用对象周围的矩形(包围盒/bounding box),要么是一个用来滚动物体的圆(ball)。

Prevent rotation/防止旋转
如果启用,对象即使受到角度力(glancing angle)也不会旋转。这可能是有用的,如果你想控制玩家自己的角度。例如,在一个平台游戏中,你可能不想让你的玩家每次尝试运行时都被绊倒在地,然后脸着地。

Density/密度
密度用来确定物体的质量。质量定义物体移动的程度。(注意)“重量”不是正确的术语——重量取决于重力,物体在零重力下仍然有质量。大质量物体在失重状态下仍然很难移动。)你的物体的质量取决于它的密度乘以其碰撞形状的面积。因此,一个真正大的物体的质量比小物体大得多,即使它们的密度是一样的。

如果你有一个实心的块,给它一个比泡沫块更高的密度就可以了!

Friction/摩擦力
摩擦影响物体和另外一个物体接触后,速度减慢的程度。没有摩擦就像在冰上滑冰一样,高摩擦就像在混凝土上拖着砖块一样。在混凝土上拉砖比在冰上拉砖更困难。

Elasticity/弹性
弹性(or "bounciness" or "restitution")影响的对象是多么快活。弹性高的物体掉到地板上会弹得很高,没有弹性的物体根本不会弹跳。

Linear damping/线性阻尼
物体永远以相同的速度朝同一方向运动,除非其他因素影响它们。想想在太空扔网球,它会永远消失。(牛顿的第一个运动定律:“任何物体都要保持匀速直线运动或静止状态,直到外力迫使它改变运动状态为止。”。)在地球上,重力、摩擦力和空气阻力等作用力往往使这一点不那么明显。

在你的物理游戏中,你可能会发现你按牛顿的第三定律,去推一个物体,它会永远持续运动下去。你可能想模拟地板上的摩擦,或者空气阻力。增加线性阻尼(linear damping)使物体逐渐由自身逐渐减速,最终达到停止。零线性阻尼在空间中是一样的——物体将永远运动下去。

Angular damping/角度阻尼
角阻尼与线性阻尼是非常相似的概念,但与物体的自旋相反。同样,在太空中,旋转的物体会以同样的速度一直旋转下去。增加角阻尼将使旋转物体逐渐减速,直到不再旋转。注意,无论物体移动的速度如何,都会产生角度阻尼。



General physics tips/使用物理的提示

Performance/性能

物理模拟非常消耗CPU资源。为了完成适当的物理操作可能需要很多的处理。为了确保你的游戏运行速度快,建议你不要同时使用太多的物理对象。同时移动的100多个物理物体可能会大幅减慢你的游戏运行速度。而且,手机和平板电脑的处理能力要比台式电脑弱很多。如果你的目标是手机,你应该非常保守,尽量不要有超过20-30个物理对象。

要注意的是,只有完全停下来的物理对象才算是“休眠”(sleep)了,在移动或旋转的物体并不算。休眠中的对象就不需要再处理了。如果对象被另一个对象击中,它被“唤醒”并开始再次使用处理。然而,如果物体移动得非常小的距离,它就不会保持休眠状态,尽管你可能看不到它在移动。例如,在一个摇摇欲坠的塔上放着的物体都将保持唤醒状态。记住,如果你有数以百计的物体在休眠状态,最多只能20-30移动(甚至更少),游戏运行应该是比较流畅的。

Stability/稳定性

物理模拟不是完全稳定的情况。如果你模拟非现实的事物,比如一个巨大的混凝土物体以音速去撞击一块泡沫,结果可能也不现实。事实上,任何涉及极端力量的事情都可能使模拟变得不稳定(不现实,例如物体穿过或相互运动)。

像极为沉重的物体堆放在一堆非常轻的箱子上,巨大的物体堆起来,或者非常快速移动一些重物,往往会造成不稳定。所以尽量使游戏中的一切保持合理的比例。

这同样适用于对象大小。非常小(5像素以下)或非常大(超过500像素)的对象可能无法逼真地模拟。试着把所有的宽度和高度确定在5-500像素范围,另外还要避免极端的比例(例如5x500大小的物体)。

换言之,物理系统将在同一大小和质量的物体,以相对较低的速度相互作用,这种情况将发挥最佳作用。



Manual movement & other behaviors/手册里的移动方式和其他行为

如果你通过事件移动物体(例如,设置x,设置y)或其他行为(例如向物理对象添加8个方向),物理模拟将尽其所能跟上你所做的。然而,通过将力和冲量施加到物理对象来实现相同的东西通常更为现实。最好让有物理行为的物体只 “在物理世界”发生行为。

例如,如果您使用的设置位置把一个对象瞬间移动到另一个位置上,它是瞬间传送过去的。这可不是一个现实的物理现象,所以结果可能也是不现实的。为了跟上这一变化,物理行为将发现这一点,并使得模拟对象以极快的速度移动到目标点上,(约1/60秒)。这有着现实中难以置信的加速度,速度,和减速度。记住,要保持模拟的稳定,你应该避免极端。

虽然可以将平台行为添加到物理对象中,但两者之间的关系并不融洽。同样,最好是通过施加力量来达到同样的效果。你可以看看C2的关于物理平台游戏的例子。


Conclusion/总结

物理在你的游戏中是很有趣的,但不要忘记:避免太多的物体,避免极端,试着用力(forces)和脉冲(impulses)来移动物体——知道这些理论并不痛苦!


近期喜欢的会员

 
慕雪白羊 2017-07-07

Physics in Construct 2: Forces, impulses, torque and joints

构造2中的物理学:力、冲量、力矩和关节


如果你还没有准备好学习物理,看看Physics in Construct 2: The Basics 这篇教程。这将涵盖你需要了解的基本知识,搞定后再着手力、冲量和关节 这方面的知识吧。

使用构造2的物理行为的主要乐趣在于操纵对象。你可以用力量、冲动和关节(forces, impulses and joints)来加速、打击或约束物体。以下是它们的工作原理。



What are forces, impulses and joints?/什么是力、冲量和关节


forces/力是“任何影响物体在速度或方向上发生变化的影响”(根据维基百科)。通常,你在很长一段时间内对一个物体施加一个力,使它朝着一个方向加速。例如,重力是一个不断向下的力。

Impulse/脉冲就像对物体的突然撞击。如果一个球在你的游戏中被球棒击中,你会用一个脉冲(impulse)而不是一个力(forces)来进行突然的一次性打击。重要的区别在于,力量通常是随着时间推移而来的,而脉冲是一次性的打击。力使物体逐渐加速,而脉冲使它们立刻加速。

Torque/扭矩是一种旋转力。转矩不是物体向某个方向加速,而是逐渐加快物体自身的旋转的速度。

Joint/关节 约束两个物体之间的运动。换句话说,它以某种方式连接两个对象。例如,你可以“铰链”两个物体在一起。这些物体仍然可以独立旋转,但它们的位置受到限制,因为它们是在一个点上连接的。


How to use forces, impulses, torque and joints

如何使用力、冲量、扭矩和关节


物理行为为添加的对象添加了一些操作。您可以在事件表编辑器中找到与对象的普通操作类似的设置。

Image title


通常情况下,你会在一个连续的真实条件下施加力(forces)和力矩(torque),比如鼠标左键按下,触发器和物体碰撞时产生脉冲(impulses),在布局开始时创建一个新对象后创建关节(joints)。


Forces/力

当施加一个力时,你可以指定力的强度和方向,以及它所应用的物体上的点。运用力有三个action。他们基本上都做同样的事情,但是有些系统会在幕后做一些数学运算,以便更容易地指定你想要的力。can apply a force on the X施加力(Apply force)可以分别施加在x轴和y轴上。在角上施加力(Apply force at angle)是以某个角度来施加一个力(为你计算出x和y分量)。向位置施加力时(Apply force towards position),向某一位置施加特定强度的力(并计算出角度,然后换算成x和y两个方向)。

这里有一张图片来证明施加在海盗公主上的一个力:

Image title



力(蓝色箭头)可以用三种方式来指定:x和y向量,角度和强度(箭头的长度),或者箭头指向的强度和位置。所有这三个都可以指定相同的力,区分出来是为了方便针对不同情况使用。


Point of application/应用点

您也可以对一个图像点施加力。这允许您从对象上的不同位置应用一个强制的力。默认情况下,它应用于对象的原点,它通常在对象的中间。注意,上图中箭头开始的蓝色点位于海盗公主的中间。


假设我们想用他/她的钩子来吸引海盗公主,而不是从原点上。在图像编辑器中,可以将图像点放置在挂钩上。然后,我们可以在操作中输入该图像点的名称或数字。然后将力从那个点释放出来。见下面的图像:现在从钩子上施力。

Image title



Here's a demo project showing the difference.(这个范例可以观察到两者有什么不同)

当你在物体的边缘施加一个力时,它更容易旋转,并且朝那个点的前方运动。从中间施加力量往往会让运动更“飘逸”,就它们在一个轨道上。


Impulses/脉冲

使用脉冲(Apply Impulse)操作和使用力的操作是非常相似的,因为你可以用x和y向量,朝向一个角度,或者朝向一个位置 来施加脉冲。还可以从对象上的图像点指定脉冲点。同样,在物体边缘使用脉冲更可能使物体发射出去。

记住冲动是一次性的——你最好是在触发事件中使用它们,比如与对象碰撞。


Torque/扭矩

扭矩是一种旋转力。只需输入一个值,而不需要提供x和y向量的值。正向扭矩让对象在顺时针方向加速,和一个负扭矩力则相反。

扭矩会影响物体的角速度(angular velocity)。这就是每秒旋转多少度。同样的,正值是顺时针旋转,负值是逆时针。

您可以向一个角度施加扭矩力。这适用已经指定施力角度(顺时针或逆时针)的一种情况(哪怕角度很小)。您也可以朝向一个位置施加扭矩力。虽然这听起来很奇怪,不过它只是用来计算的角度,与位置无关,只是对这个角度运用一个扭矩力。

你不能从一个位置施加扭矩。旋转是影响整个物体的!


Joints/关节

物理行为有两种关节。

Revolute joint/旋转关节

旋转关节是一个铰链:一物体在另一个对象上。这些物体可以自由旋转,但在那一点上是连接在一起的。物理旋转关节的例子C2默认示例中就有。 要创建一个 旋转关节,就使用 创建旋转关节的操作(Create revolute joint)。

Image title


您只需要创建一次关节,无论是在布局开始时,还是在创建对象或需要连接对象时,创建后关节是一直存在的。你可以从一个对象的图像点来创建对象的关节,因此不用去改变另一个对象的原点。你也不需要为另外一个对象再多加图像点了,你只要确保在使用创建关节操作(Create revolute joint action)前,所有的图像都放在正确的位置上。


Distance joint/铰链关节

使两个物体的绑定在一定距离内的行为,好像它们是用一根杆子连接在一起的。虽然他们可以围绕他们的连接点旋转,但是他们总是保持完全相同的距离。请参见与C2的Physics - distance joint example 示例。要创建铰链关节使用(Create distance joint)这个操作。

Image title


注意连接后并不会出现蓝色的连接杆的!如果你自己使用这个动作,加入对象后你看不到这个连接杆,尽管它们好像有一个极点连接它们。上面的图片是用一个精灵来显示这个连接杆的,这样就更容易看出这个铰链的物理行为是如何工作的。你可能想在游戏中做一些类似的事情,因为物体被一个看不见的磁极连接起来会显得很奇怪。

您可以为所附对象指定图像点。在动作的参数中,这个图像点指的是物理行为被添加到物体上的一个点,图像点是指另一物体上的一个图像点。这允许您通过它们的边缘连接两个对象,例如。

还可以指定阻尼比和弹簧频率(damping ratio and spring frequency.)。弹簧的频率使连接杆的作用更像一个大弹簧。如果你把它设置为4Hz,其中一个物体被击中,这两个物体之间的连接将“反弹”一点,大约每秒振荡4次。振荡衰减率是由阻尼比决定的。阻尼比为0意味着弹簧将永远保持摆动,1意味着弹簧几乎马上停止就摆动。



Don't forget.../别忘了


牛顿的第二定律说:“物体的质量m,它的加速度a和施加的力f之间的关系是f=MA。”。换句话说,如果你把一个100的力施加到一个小质量的小物体上,那么你得到的加速度要比一个大质量的物体施加同样的力要大得多。很明显,大而重的物体很难移动,而且往往移动得比较慢!因此,你可能会发现你需要用较小的力量来对付小物体和 大物体需要更大的力量。脉冲和转矩也是如此。


Conclusion/结语


力(Forces)、冲量(impulses)和力矩(torque)让你在游戏中可以移动物体,使它们加速、旋转和飞行。关节允许你以有趣的方式连接物体。你甚至可以做出奇怪的玩意儿!为了测试你的想法可以做一辆车(参考C2自带的Physics – vehicle 范例)。你可以试着用距离关节连接一系列物体,看看会发生什么。可能性是无穷无尽的——和它一起玩也很有趣!


 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册