はじめに
ゲーム内で投げられたボール、爆発で吹き飛ぶ物体、プレイヤーが動かせるブロック──こうした「動いて、衝突して、回転する」オブジェクトを作るならRigidBody3Dが欠かせません。このノードは物理演算エンジンと完全に統合され、重力、力、衝突をすべて自動で処理します。本記事では、RigidBody3Dの使い方と活用方法を詳しく解説します。
RigidBody3Dとは?
RigidBody3Dは、物理演算で動く3Dオブジェクトです。重力の影響を受け、力を加えると移動し、衝突するとそれに応じて反発します。つまり、「自分の意志で動く、重い物体」という特性があります。
たとえ: ボーリングのボール、ダンジョンに転がる岩、プレイヤーが投げた武器。いずれもリアルな物理的な動きをします。
継承ツリー:
RigidBody3D → PhysicsBody3D → CollisionObject3D → Node3D → Node2D版との対応: このノードは2DのRigidBody2Dと同じ役割を3D空間で果たします。

このノードを使うべき場面
使うべき場面:
- 投擲物: プレイヤーが投げるボール、火の玉、矢などの飛び道具
- 破壊可能なオブジェクト: 爆発で吹き飛ぶ樽、砕ける氷、崩れる壁
- 物理パズル: ブロック移動パズル、ドミノ倒し、バランスゲーム
- ラグドール: キャラクターが倒れたときの手足の動き、死体表現
- インタラクティブな環境: プレイヤーが押したり引いたりできるオブジェクト
使わない場面:
- プレイヤーキャラクター(CharacterBody3Dを使用 – より細かい制御が可能)
- 動かない背景オブジェクト(StaticBody3Dを使用)
主なプロパティと機能
| プロパティ/メソッド | 説明 | デフォルト値 |
|---|---|---|
| mass | オブジェクトの質量(重い = 小さい値でも大きく動かない) | 1.0 |
| gravity_scale | 重力の影響度(0 = 重力なし、2 = 2倍の重力) | 1.0 |
| linear_damp | 空気抵抗(速度の減衰)。大きいほど速く止まる | 0.0 |
| angular_damp | 回転の抵抗。大きいほど速く止まる | 0.0 |
| freeze | 特定の軸の動きを固定(例:X/Y軸のみ動く) | FREEZE_MODE_ACTIVE |
| freeze_mode | STATIC(完全に固定)/ KINEMATIC(手動制御)/ DYNAMIC(物理演算) | DYNAMIC |
| apply_force(force, position) | 指定位置に力を加える(トルク発生) | ─ |
| apply_impulse(impulse, position) | 瞬間的な力を加える(衝撃) | ─ |
| apply_central_impulse(impulse) | 中心に瞬間的な力を加える(回転なし) | ─ |
基本的な使用例1:投擲物を発射する
extends RigidBody3D
func _ready():
# 質量を軽くして飛びやすく
mass = 0.5
# 線形速度を設定(初速度)
linear_velocity = Vector3(0, 5, 20) # 上へ5、奥へ20の速度
func _on_fired():
# 発射時に中心に力を加える
apply_central_impulse(Vector3(0, 0, 50))
基本的な使用例2:爆発で吹き飛ばす
extends RigidBody3D
func _on_explosion(explosion_position: Vector3, explosion_force: float):
# 爆心地からの方向を計算
var direction = (global_position - explosion_position).normalized()
# 衝撃波を加える
var impulse = direction * explosion_force
apply_central_impulse(impulse)
# 衝撃で回転させる(より自然な動き)
var random_spin = Vector3(
randf_range(-5, 5),
randf_range(-5, 5),
randf_range(-5, 5)
)
angular_velocity = random_spin
もっと使いこなす:カスタマイズできるパラメータ
まずは基本を動かしてみてから、余裕が出たら試してみてください。
| パラメータ | 効果 | 使用例 |
|---|---|---|
| mass | 小さい値 = 軽い(風で吹き飛ぶ)、大きい値 = 重い(止まりにくい) | 羽毛:0.1、岩:10.0 |
| gravity_scale | 0 で浮遊、負の値で逆重力。浮力や月面の環境を表現 | 水中:0.3、月:0.16 |
| linear_damp / angular_damp | 摩擦の効果。大きいほどすぐ止まる | 氷上:0.1、砂の上:0.8 |
| freeze | FREEZE_MODE_KINEMATIC で手動制御(プレイヤーキャラに近い) | スイッチやドアなど、プレイヤーが動かすもの |
| lock_rotation | 回転を禁止。コマ状に回らない独楽や球体 | 球体カウンター、コイン |
| continuous_cd / continuous_collision_detection | 高速移動時の貫通防止。CPUコスト増 | 銃弾、超高速物体 |

まとめ
RigidBody3Dは、物理演算でリアルに動くオブジェクトを作る、ゲーム開発の強い味方です。
- apply_force()・apply_impulse()・apply_central_impulse()で様々な動きを実現できます
- mass、gravity_scale、linear_damp、angular_dampを調整することで、環境に応じた物理演算をカスタマイズできます
- freeze_modeで DYNAMICと KINEMATICを使い分けることで、プレイヤーキャラに近い制御も可能になります
次回は、衝突や接触を検出するArea3Dについて解説します。ダメージゾーン、トリガー、ピックアップ判定など、「接触したら何かをする」という仕掛けを作るときに欠かせないノードです。
シリーズ:Godot 4 ノード解説
001〜040:各種ノード
041〜060:
041:Node / 042:Node2D / 043:Node3D / 044:Control / 045:Canvas Layer / 046:Sprite2D / 047:Sprite3D / 048:Label / 049:Button / 050:ColorRect / 051:TextureRect / 052:AnimatedSprite2D / 053:AnimationPlayer / 054:CharacterBody3D / 055:PhysicsBody3D / 056:StaticBody3D / 057:RigidBody3D / 058:Area3D / 059:CollisionShape3D / 060:OmniLight3D
この記事はGodot 4.xをもとに執筆しています。


コメント