RigidBody2D

原文:https://blog.csdn.net/ddd999ppp/article/details/83584359

RigidBody2D

以下为我对于官方文档的翻译以及使用情况,3.0版本的文档
RigidBody2D官方文档
继承: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object
类型: Core

简要说明

由2D物理引擎控制的物体。

成员函数

返回类型 函数
void _integrate_forces ( Physics2DDirectBodyState state ) virtual
void add_force ( Vector2 offset, Vector2 force )
void apply_impulse ( Vector2 offset, Vector2 impulse )
Array get_colliding_bodies ( ) const
void set_axis_velocity ( Vector2 axis_velocity )
bool test_motion ( Vector2 motion, float margin=0.08, Physics2DTestMotionResult result=null )
信号

body_entered ( Object body )
当一个物体进入这个物体时发出的。 contact_monitor 必须为true,contacts_reported 必须大于0。

body_exited ( Object body )
当一个物体离开这个物体时发出的。 contact_monitor 必须为true,contacts_reported 必须大于0。

body_shape_entered ( int body_id, Object body, int body_shape, int local_shape )
当一个物体进入这个物体时发出的。报告碰撞形状信息。有关形状索引信息,请参见 CollisionObject2D 。 contact_monitor 必须为true, contacts_reported 必须大于 0 。

body_shape_exited ( int body_id, Object body, int body_shape, int local_shape )
当一个物体离开这个物体时发出的。报告碰撞形状信息。有关形状索引信息,请参见 CollisionObject2D 。 contact_monitor 必须为true, contacts_reported 必须大于 0 。

sleeping_state_changed ( )
当睡眠改变时发出。

成员变量

float angular_damp - 抑制物体的 angular_velocity 。如果值为 -1 那么物体将使用 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Angular Damp” 。默认值: -1 。
float angular_velocity - 物体的旋转速度。
Vector2 applied_force - 物体的总施加力。
float applied_torque - 物体的总施加扭矩。
float bounce - 物体的弹性。默认值: 0 。
bool can_sleep - 如果值为 true ,如果没有运动,物体就不会计算力并且它将作为一个静止的物体。当其他力通过碰撞或使用 apply_impulse 或 add_force 时,身体会醒来。默认值: true 。
bool contact_monitor - 如果是真的,当它与另一个 RigidBody2D 相撞时,物体会发出信号。请参阅 contacts_reported 。默认值: false 。
int contacts_reported - 要报告的接触的最大数量。默认值: 0 。
CCDMode continuous_cd - 连续碰撞检测模式。默认值: CCD_MODE_DISABLED 。
连续碰撞检测试图预测一个运动物体在哪里碰撞,而不是移动它,并在碰撞后校正它的运动。连续碰撞检测速度较慢,但精度更高,并且忽略了小的、快速移动的物体的碰撞。光线投射与形状转换方法是能找到的。详情见CCD_MODE_ 常数。

bool custom_integrator - 如果值为 true 那么这个物体的内力结合将被禁止。除了碰撞响应之外,物体将只由 integrate_forces 函数决定移动。
float friction - 身体的摩擦力值范围从 0 (无摩擦)到 1 (最大摩擦)。默认值: 1 。
float gravity_scale - 乘以重力施加于身体。物体的重力是由“ Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Gravity” 值 和/或 Area2Ds应用的任何附加重力矢量计算的。默认值:1 。
float inertia - 物体的转动惯量。这就像质量,但为了旋转:它决定旋转身体需要多少扭矩。惯性矩通常是根据质量和形状自动计算的,但是这个函数允许您设置一个自定义值。设置0(或负)惯性返回自动计算它。
float linear_damp - 抑制物体的 linear_velocity 。如果- 1,物体将使用 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的“Default Linear Damp”。默认值: -1。
Vector2 linear_velocity - 物体的线性速度。
float mass - 物体的质量。默认值: 1 。
Mode mode - 物体的模式。参见 MODE
* 常数。默认值: MODE_RIGID 。
bool sleeping - 如果值为 true 物体会进入睡眠且不会计算力,直到通过碰撞或使用 apply_impulse 或 add_force 唤醒。
float weight - 物体的重量基于其的质量和 “Project(项目) > Project Settings(项目设置) > Physics > 2d” 中的 “Default Gravity” 的值。
枚举

enum CCDMode

CCD_MODE_DISABLED = 0 — 禁用连续碰撞检测。这是检测身体碰撞最快的方法,但可以错过小而快速移动的物体。
CCD_MODE_CAST_RAY = 1 — 使用光线投射实现连续碰撞检测。这比形状调整快,但精度不高。
CCD_MODE_CAST_SHAPE = 2 — 使用形状调整实现连续碰撞检测。这是最慢的CCD方法,也是最精确的。
enum Mode
MODE_RIGID = 0 — 刚性模式。身体表现为一个物理对象。它与其他物体发生碰撞,并对它施加的力作出反应。这是默认模式。
MODE_STATIC = 1 — 静态模式。物体的表现类似 StaticBody2D ,不动。
MODE_CHARACTER = 2 — 字符模式。类似于 MODE_RIGID ,但身体不能旋转。
MODE_KINEMATIC = 3 — 运动模式。物体类似一个 KinematicBody2D ,必须用代码移动。
说明

这个节点实现了模拟2D物理。您不直接控制 RigidBody2D 。取而代之的是,你施加力(重力、脉冲等)并且物理模拟基于它的质量、摩擦和其他物理特性来计算最终的运动。

RigidBody2D 具有4种行为模式:刚性、静态、字符和运动。

注意:你不应该改变 RigidBody2D 的 position 或 linear_velocity 每帧甚至非常频繁。如果你需要直接影响身体的状态,请使用 _integrate_forces 力,它可以让你直接进入物理状态。
如果需要重写默认物理行为,可以编写自定义力集成。参见 custom_integrator 。

成员函数说明

void _integrate_forces ( Physics2DDirectBodyState state ) virtual
允许您读取并安全地修改对象的仿真状态。如果你需要直接改变身体的 position 或其他物理特性,就用这个 Node._physics_process 代替。默认情况下,它还可以用于附加普通的物理行为,但是 custom_integrator 允许禁用默认行为,并为主体编写自定义的力集成。

void add_force ( Vector2 offset, Vector2 force )
向物体增加一个定向力。来自物体原点的力和偏移都在全局坐标中。

void apply_impulse ( Vector2 offset, Vector2 impulse )
对物体施加一个定向推力(这将受身体质量和形状的影响)。这相当于用球杆击打台球:瞬间施加的力。推力和来自物体原点的偏移都在全局坐标中。

Array get_colliding_bodies ( ) const
返回与此碰撞的物体的列表。使用 contacts_reported 设置最大报告数。还必须将 contact_monitor 设置为 true。注意,在移动对象之后,此测试的结果不是即时的。对于性能,每帧一次和物理步骤之前更新一次碰撞列表。考虑使用信号代替。

void set_axis_velocity ( Vector2 axis_velocity )
在给定的轴上设置物体的速度。在给定的矢量轴中的速度将被设置为给定的矢量长度。这对于跳跃行为是有用的。

bool test_motion ( Vector2 motion, float margin=0.08, Physics2DTestMotionResult result=null )
如果用给定向量进行移动会导致冲突,则返回 true 。 margin 增加了碰撞检测中涉及的形状的大小, 并且 result(结果) 是Physics2DTestMotionResult类型的对象,该对象包含关于碰撞的附加信息(如果有的话)。

使用

RigidBody2D的使用需要创建碰撞区域,可以通过 CollisionShape2D 和 CollisionPolygon2D 创建碰撞区域。
关于RigidBody2D的mode属性的4个模式:

Rigid模式是RigidBody2D默认的模式,会自行根据所受的力计算合力进行运动,也受扭力的作用进行自身旋转。
Static模式属于静态不会动,无论施加怎样的力都不会移动。
Character模式与Rigid相近,当时不会出现自身的旋转,也就是说给它的applied_torque属性设置多大的值都不会出现旋转的情况,可以说是使物体不存在扭力。
Kinematic模式如果没有代码控制其移动的话,它将与Static模式相近处于静止状态,也不受碰撞影响。
关于 Angular Damp 与 Linear Damp:

属性用于抑制物体的旋转和移动的。
Angular Damp 随着这个属性增大,旋转所需的扭力会不断增大。
Linear Damp 随着这个属性增大,移动所需的力会不断增大。
关于 Custom Integrator 启用:

物体的内力结合将被禁止,它将只由 _integrate_forces 函数决定移动和碰撞造成的移动。
但可以在 Angular Velocity 和 Linear Velocity 属性中赋予物体线性移动速度和自身旋转速度。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容