🐡
[Godot] 物理エンジンで複雑な計算を行いたいときの注意点
Rigidbody3Dには物理的状態にかかわるプロパティがありますが、このプロパティを頻繁に変更すると予期しない挙動を示すことがあるため、複雑な物理シミュレーションを行うには直接物理エンジンのプロパティを変更することがおすすめです。
そのためにRigidbody3Dの_integrate_forces()を使います。
ドキュメントではRigidbody2Dのサンプルコードがあります。
integrate_forces_2d.gd
extends RigidBody2D
var thrust = Vector2(0, -250)
var torque = 20000
func _integrate_forces(state):
if Input.is_action_pressed("ui_up"):
state.apply_force(thrust.rotated(rotation))
else:
state.apply_force(Vector2())
var rotation_direction = 0
if Input.is_action_pressed("ui_right"):
rotation_direction += 1
if Input.is_action_pressed("ui_left"):
rotation_direction -= 1
state.apply_torque(rotation_direction * torque)
_integrate_forces()は_physics_process()内で毎回実行されます。
たとえば以下のようなコードだとconstant_forceとconstant_torpueはphysics_process()内で毎回変更されます。
integrate_forces_3d.gd
extends RigidBody3D
func _ready():
pass
func _process(delta):
pass
func _physics_process(delta):
pass
func _integrate_forces(state):
state.apply_central_force(Vector3(0, randf_range(9.4, 10.4), 0))
state.apply_torque(Vector3(0, randf_range(-0.1, 0.1), 0))
if Input.is_action_just_pressed("ui_accept"):
state.apply_central_impulse(-transform.basis.z * 15.0)
Discussion