Godot入門:RigidBody3Dの使い方と活用法

はじめに

ゲーム内で投げられたボール、爆発で吹き飛ぶ物体、プレイヤーが動かせるブロック──こうした「動いて、衝突して、回転する」オブジェクトを作るならRigidBody3Dが欠かせません。このノードは物理演算エンジンと完全に統合され、重力、力、衝突をすべて自動で処理します。本記事では、RigidBody3Dの使い方と活用方法を詳しく解説します。

RigidBody3Dとは?

RigidBody3Dは、物理演算で動く3Dオブジェクトです。重力の影響を受け、力を加えると移動し、衝突するとそれに応じて反発します。つまり、「自分の意志で動く、重い物体」という特性があります。

たとえ: ボーリングのボール、ダンジョンに転がる岩、プレイヤーが投げた武器。いずれもリアルな物理的な動きをします。

継承ツリー:
RigidBody3D → PhysicsBody3D → CollisionObject3D → Node3D → Node

2D版との対応: このノードは2DのRigidBody2Dと同じ役割を3D空間で果たします。




RigidBody3Dの物理パラメータ
RigidBody3Dは重力、衝突、外力のすべてを物理エンジンで計算します

このノードを使うべき場面

使うべき場面:

  • 投擲物: プレイヤーが投げるボール、火の玉、矢などの飛び道具
  • 破壊可能なオブジェクト: 爆発で吹き飛ぶ樽、砕ける氷、崩れる壁
  • 物理パズル: ブロック移動パズル、ドミノ倒し、バランスゲーム
  • ラグドール: キャラクターが倒れたときの手足の動き、死体表現
  • インタラクティブな環境: プレイヤーが押したり引いたりできるオブジェクト

使わない場面:

  • プレイヤーキャラクター(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コスト増 銃弾、超高速物体




freeze_modeの動作比較
DYNAMICは物理演算で動き、STATICは完全に固定、KINEMATICはスクリプトで手動制御します

まとめ

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をもとに執筆しています。

コメント