์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

Godot 4 Jolt Physics ๊ณ ์† ๋ฆฌ์ง€๋“œ๋ฐ”๋”” ํ„ฐ๋„๋ง ํ˜„์ƒ ํ•ด๊ฒฐ ๋ฐ ๋ฌผ๋ฆฌ ํ‹ฑ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ

๊ฒŒ์ž„๊ต์ˆ˜ 2026. 8. 31. 22:01
๋ฐ˜์‘ํ˜•

๐ŸŒ English Abstract

This comprehensive troubleshooting guide addresses the bullet tunneling (wall pass-through) issue occurring in high-speed RigidBody3D nodes when using the Jolt Physics engine in Godot 4 with multithreading enabled. It dives deep into Discrete vs. Continuous Collision Detection (CCD), CPU worker thread contention, physics tick rate optimization, and custom Shapecasting strategies. By fine-tuning physics step limits and Jolt-specific broadphase parameters, developers can achieve pixel-perfect collision accuracy while maximizing multi-core rendering efficiency.

Godot 4 ์—”์ง„์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ ๊ณ ์„ฑ๋Šฅ 3D ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ์„ ์œ„ํ•ด Jolt Physics(Godot Jolt) ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋Š˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Jolt๋Š” AAA๊ธ‰ ๊ฒŒ์ž„์ธ Horizon Forbidden West์—์„œ ์ž…์ฆ๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฌผ๋ฆฌ ์—”์ง„์œผ๋กœ, ๊ฐ•๋ ฅํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ(Multithreading) ์„ฑ๋Šฅ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ FPS๋‚˜ ๋ ˆ์ด์‹ฑ ๊ฒŒ์ž„์ฒ˜๋Ÿผ ๋ฆฌ์ง€๋“œ๋ฐ”๋””(RigidBody3D)์˜ ์ด๋™ ์†๋„๊ฐ€ ๊ทน๋„๋กœ ๋น ๋ฅผ ๋•Œ, ๋ฌผ์ฒด๊ฐ€ ์–‡์€ ๋ฒฝ์ด๋‚˜ ์ง€ํ˜•์„ ๊ทธ๋Œ€๋กœ ํ†ต๊ณผํ•ด ๋ฒ„๋ฆฌ๋Š” ํ„ฐ๋„๋ง ํ˜„์ƒ(Tunneling Issue / Bullet-through-paper problem)์„ ์ž์ฃผ ๊ฒช๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ง€ ๋ฌผ๋ฆฌ ํ‹ฑ(Physics Tick) ์ˆ˜์น˜๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ๋”œ๋ ˆ์ด, ๋ถˆ์—ฐ์† ์ถฉ๋Œ ๊ฐ์ง€(Discrete Collision Detection)์˜ ํ•œ๊ณ„, ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ฆฌ ์Šคํ…Œํ•‘(Physics Stepping) ์˜ต์…˜ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” Godot 4 + Jolt Physics ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒฝ ๊ด€ํ†ต ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์›์ธ๋ถ€ํ„ฐ ์ •๋ฐ€ํ•˜๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.



1. ๊ณ ์† ๋ฆฌ์ง€๋“œ๋ฐ”๋”” ๊ด€ํ†ต ํ˜„์ƒ(Tunneling)์˜ ์—ฐ์‚ฐ ๊ตฌ์กฐ์  ์›์ธ

ํ„ฐ๋„๋ง์ด ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์ถฉ๋Œ ๊ฒ€์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๋ถˆ์—ฐ์† ์ถฉ๋Œ ๊ฐ์ง€(Discrete Collision Detection, DCD)์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DCD(๋ถˆ์—ฐ์† ์ถฉ๋Œ ๊ฐ์ง€)์˜ ํ•œ๊ณ„์™€ ์ด์‚ฐ์  ์œ„์น˜ ์ƒ˜ํ”Œ๋ง

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌผ๋ฆฌ ์—”์ง„์€ ๋งค ํ”„๋ ˆ์ž„(๋˜๋Š” ๋งค ๋ฌผ๋ฆฌ ํ‹ฑ)๋งˆ๋‹ค ๋ฌผ์ฒด์˜ ์œ„์น˜๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ $t_0$์—์„œ์˜ ์œ„์น˜์™€ $t_1$์—์„œ์˜ ์œ„์น˜๋ฅผ ์ˆœ๊ฐ„ ํฌ์ฐฉ(Snapshot)ํ•˜์—ฌ ๋‘ ์‹œ์ ์— ๋ฌผ์ฒด๊ฐ€ ๊ฒน์ณ ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์ƒ ์†๋„: $t_0$์™€ $t_1$ ์‚ฌ์ด์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๊ฐ€ ์žฅ์• ๋ฌผ์˜ ๋‘๊ป˜๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ์ถฉ๋Œ ์ง€์ ์ด ์ •ํ™•ํžˆ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์ดˆ๊ณ ์† ์ด๋™: $t_0$์ผ ๋•Œ ๋ฌผ์ฒด๋Š” ๋ฒฝ ์ „๋ฉด์— ์žˆ๊ณ , ๋‹จ 1 ํ‹ฑ(Tick) ํ›„์ธ $t_1$์—๋Š” ๋ฌผ์ฒด๊ฐ€ ์ด๋ฏธ ๋ฒฝ ํ›„๋ฉด์„ ํ†ต๊ณผํ•œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด์‚ฐ์ (Discrete) ์ˆœ๊ฐ„ ์ƒ˜ํ”Œ๋ง์—์„œ๋Š” $t_0$์™€ $t_1$ ๋ชจ๋‘ ์ถฉ๋Œ ๋ ˆ์ด์–ด์™€ ๊ต์ฐจํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํŒ์ •๋˜์–ด ๋ฒฝ ๊ด€ํ†ต(Tunneling)์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

Jolt ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ ์šฉ ์‹œ ์•…ํ™”๋˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค(Edge Cases)

Jolt Physics๋Š” ์ž‘์—… ๋ถ„ํ• (Work-stealing) ๊ธฐ๋ฐ˜์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ธŒ๋กœ๋“œํŽ˜์ด์ฆˆ(Broadphase) ๋ฐ ๋‚ด๋กœ์šฐํŽ˜์ด์ฆˆ(Narrowphase) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ํ‹ฑ์ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ๋  ๋•Œ ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ(FPS)์™€ ๋ฌผ๋ฆฌ ํ‹ฑ(Physics Ticks) ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜๊ฐ€ ์‹ฌํ•ด์ง€๊ฑฐ๋‚˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ณ€์ˆ˜ ๊ฐฑ์‹  ์—ฐ์‚ฐ ์‹œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๊ฐ€์ค‘๋ฉ๋‹ˆ๋‹ค.

  1. ๋ฌผ๋ฆฌ ์Šคํ… ์Šคํ‚ต(Physics Step Skip): ๋ Œ๋”๋ง ํ”„๋ ˆ์ž„ ๋“ฌ์„ฑ๊ฑฐ๋ฆผ์œผ๋กœ ์ธํ•ด ํ•œ ๋ฒˆ์— ๋ณต์ˆ˜์˜ ๋ฌผ๋ฆฌ ์Šคํ…(`max_physics_steps_per_frame`)์ด ๋ชฐ๋ ค์„œ ์‹คํ–‰๋  ๋•Œ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ์—์„œ ๋ˆ„์  ๋ณ€์œ„๋Ÿ‰์ด ๊ธ‰์ฆํ•˜์—ฌ ๊ด€ํ†ต ํ™•๋ฅ ์ด ์ปค์ง‘๋‹ˆ๋‹ค.
  2. ๋™์  ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค(AABB) ๊ฐฑ์‹  ์˜ค์ฐจ: ๋ธŒ๋กœ๋“œํŽ˜์ด์ฆˆ ๋…ธ๋“œ ํƒ์ƒ‰ ์Šค๋ ˆ๋“œ๊ฐ€ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์Œ์„ ๋ฌถ์„ ๋•Œ, ์ดˆ๊ณ ์† ๋ฌผ์ฒด์˜ AABB(Axis-Aligned Bounding Box)๊ฐ€ ์ถฉ๋ถ„ํžˆ ํ™•์žฅ๋˜์ง€ ์•Š์œผ๋ฉด ๋‚ด๋กœ์šฐํŽ˜์ด์ฆˆ ์—ฐ์‚ฐ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋‹จ๊ณ„๋ณ„ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…: ๋ฒฝ ๊ด€ํ†ต ์™„๋ฒฝ ์ฐจ๋‹จ ์†”๋ฃจ์…˜

Godot 4์™€ Jolt Physics ์กฐํ•ฉ์—์„œ ๋ฒฝ ๊ด€ํ†ต์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•œ 3๋‹จ๊ณ„ ์‹ค๋ฌด ์ ์šฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Step 1: ์—ฐ์† ์ถฉ๋Œ ๊ฐ์ง€(CCD - Continuous Collision Detection) ํ™œ์„ฑํ™”

๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ์ฑ…์€ ์—ฐ์† ์ถฉ๋Œ ๊ฐ์ง€(Continuous Collision Detection, CCD)๋ฅผ ์ผœ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. CCD๋Š” ์ด์‚ฐ ์ง€์ ์ด ์•„๋‹Œ $t_0$์—์„œ $t_1$๊นŒ์ง€์˜ ์ด๋™ ๊ถค์  ์ „์ฒด๋ฅผ ์Šค์œ„ํ”„ํŠธ ๋ณผ๋ฅจ(Swept Volume) ๋˜๋Š” ๋ ˆ์ด์บ์ŠคํŠธ(Motion Casting)๋กœ ํ›‘์–ด ์ถฉ๋Œ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ ๋ฐฉ๋ฒ•:

  • ๊ด€ํ†ต ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” `RigidBody3D` ์ธ์ŠคํŽ™ํ„ฐ ์ฐฝ์„ ์—ด๊ณ  Solver -> Continuous CD ์†์„ฑ์„ `true`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŠธ๋กœ ์„ค์ • ์‹œ:
    $FastRigidBody.continuous_cd = true

Jolt ์—”์ง€๋‹ˆ์–ด๋ง ์ฃผ์˜์‚ฌํ•ญ: Jolt Physics๋Š” CCD ์ž‘๋™ ์‹œ ๋ ˆ์ด์บ์ŠคํŠธ/์‰์ดํ”„์บ์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ Motion Casting์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋™์  ์˜ค๋ธŒ์ ํŠธ์— CCD๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด CPU ์ž‘์—… ์Šค๋ ˆ๋“œ์˜ ๋ถ€ํ•˜๊ฐ€ ๊ธ‰์ฆํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์„ฑ๋Šฅ ์ด์ ์ด ๋ฐ˜๊ฐ๋˜๋ฏ€๋กœ, ์ด์•Œ, ๋ฏธ์‚ฌ์ผ, ๊ณ ์† ์ฐจ๋Ÿ‰ ๋“ฑ ๊ผญ ํ•„์š”ํ•œ ์˜ค๋ธŒ์ ํŠธ์—๋งŒ ์„ ๋ณ„์  ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 2: ๋ฌผ๋ฆฌ ํ‹ฑ(Physics Ticks) ์ˆ˜์น˜ ๋ฐ ์Šคํ… ํ•œ๋„ ์ •๋ฐ€ ์กฐ์ •

๊ธฐ๋ณธ 60Hz ๋ฌผ๋ฆฌ ํ‹ฑ ํ™˜๊ฒฝ์—์„œ๋Š” ์†๋„๊ฐ€ ์•ฝ 100m/s๋งŒ ๋„˜์–ด๊ฐ€๋„ 1 ํ‹ฑ๋‹น 1.66m๋ฅผ ์ด๋™ํ•˜๋ฏ€๋กœ ์–‡์€ ๋ฒฝ(์˜ˆ: 0.2m ๋‘๊ป˜)์€ ๋ฌด์กฐ๊ฑด ๊ด€ํ†ตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์กฐ์œจํ•˜์—ฌ ์ •๋ฐ€๋„๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

  • Project Settings -> Physics -> Common -> Physics Ticks Per Second: ๊ธฐ๋ณธ๊ฐ’ `60`์—์„œ `120` ๋˜๋Š” `140`์œผ๋กœ ๋ณ€๊ฒฝ. (๋ฌผ๋ฆฌ ๊ณ„์‚ฐ ๋นˆ๋„๋ฅผ ๋†’์—ฌ ํ‹ฑ๋‹น ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ ˆ๋ฐ˜ ์ดํ•˜๋กœ ๋‹จ์ถ•)
  • Max Physics Steps Per Frame: ๊ธฐ๋ณธ๊ฐ’ `8` ์œ ์ง€ ๋˜๋Š” `4~6` ์ •๋„๋กœ ์ œํ•œ. (ํ”„๋ ˆ์ž„ ๋“œ๋ž ๋ฐœ์ƒ ์‹œ ๋‚˜์„ ํ˜• ์„ฑ๋Šฅ ํ•˜๋ฝ(Spiraling of Death) ๋ฐฉ์ง€)

Step 3: Shapecast3D๋ฅผ ํ™œ์šฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํˆฌ์‚ฌ์ฒด ๊ตฌํ˜„ (์—ฃ์ง€ ์ผ€์ด์Šค ๋Œ€์‘)

์†๋„๊ฐ€ ๊ทน๋‹จ์ ์œผ๋กœ ๋น ๋ฅธ ๊ด‘์„ ๊ฒ€, ๋ ˆ์ผ๊ฑด, ์ดˆ๊ณ ์† ์ด์•Œ ๋“ฑ์€ RigidBody3D์™€ ๋ฌผ๋ฆฌ ์—”์ง„์˜ ํ‹ฑ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ShapeCast3D ๊ธฐ๋ฒ•์„ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์—ฐ์‚ฐ ํšจ์œจ ๋ฐ ์ •ํ™•๋„ ์ธก๋ฉด์—์„œ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ด๋™ ์ „ ์œ„์น˜์—์„œ ์ด๋™ํ•  ๋ชฉํ‘œ ์œ„์น˜๊นŒ์ง€ ๋ฏธ๋ฆฌ ์‰์ดํ”„(์˜ˆ: Sphere, Cylinder)๋ฅผ ํˆฌ์˜(Cast)ํ•˜์—ฌ ์ถฉ๋Œ ์ง€์ ์„ ์ฆ‰์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.



3. ์‹ฌํ™” ๋‚ด์šฉ: Jolt Physics ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋ฐ ๋ฌผ๋ฆฌ ํ‹ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ถฉ๋Œ ๊ด€ํ†ต์„ ๋ง‰๊ธฐ ์œ„ํ•ด CCD์™€ ํ‹ฑ(Tick)์„ ๋Š˜๋ ธ๋‹ค๋ฉด, ์ด์ œ๋Š” ๋ฌผ๋ฆฌ ์—”์ง„์ด ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์ตœ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Jolt ๊ณ ์œ  ์†์„ฑ์„ ํŒŒ์ดํ”„๋ผ์ธ ๋ ˆ๋ฒจ์—์„œ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Jolt Physics ์›Œ์ปค ์Šค๋ ˆ๋“œ(Worker Threads) ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹

Godot 4์šฉ Jolt ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ž์ฒด ์Šค๋ ˆ๋“œ ํ’€(Thread Pool)์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค์ •์˜ Physics 3D -> Jolt Physics ํƒญ์—์„œ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.

์„ค์ • ํ•ญ๋ชฉ (Setting) ๊ถŒ์žฅ๊ฐ’ / ํŠœ๋‹ ์ „๋žต ๊ธฐ์ˆ ์  ์˜ํ–ฅ (Impact)
Thread Count Default (0 = Auto) ๋˜๋Š” CPU ์ฝ”์–ด ์ˆ˜ - 1 ๋ฉ”์ธ ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ ๋ฐ ์˜ค๋””์˜ค ์Šค๋ ˆ๋“œ์™€์˜ ๊ฒฝํ•ฉ(Contention) ์ถ•์†Œ
Velocity Iterations 8 ~ 10 (๊ธฐ๋ณธ 8) ๋ฆฌ์ง€๋“œ๋ฐ”๋”” ๊ฐ„์˜ ๊ด€ํ†ต ๋ฐ ํŠ•๊น€ ์•ˆ์ •์„ฑ ์ฆ๊ฐ€
Position Iterations 2 ~ 4 (๊ธฐ๋ณธ 2) ์ œ์•ฝ ์กฐ๊ฑด(Constraint) ํ•ด์ œ ์‹œ ๊ฒน์นจ ํ˜„์ƒ ์ •๋ฐ€ ๋ณต์›
Position Solve Body Threshold 0.01 m ๋‚ด์™ธ ์กฐ์ • ๋ฏธ์„ธ ์ง„๋™(Jittering) ๋ฐฉ์ง€ ๋ฐ ๋ธŒ๋กœ๋“œํŽ˜์ด์ฆˆ ๊ณ„์‚ฐ ๋ถ€ํ•˜ ๊ฐ์†Œ

์„œ๋ธŒ์Šคํ…Œํ•‘(Sub-stepping)๊ณผ ๋ฌผ๋ฆฌ ๋ณด๊ฐ„(Physics Interpolation)

๋ฌผ๋ฆฌ ํ‹ฑ์„ 120Hz ์ด์ƒ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋ฉด CPU ๋ Œ๋”๋ง ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Godot 4.3 ์ด์ƒ์—์„œ ์ง€์›ํ•˜๋Š” ๋ฌผ๋ฆฌ ๋ณด๊ฐ„(Physics Interpolation) ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋ฉด ๋ฌผ๋ฆฌ ํ‹ฑ์€ 60Hz๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ Œ๋”๋ง ํ”„๋ ˆ์ž„(์˜ˆ: 144Hz, 240Hz ๋ชจ๋‹ˆํ„ฐ)์—์„œ๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์›€์ง์ž„์„ ์—ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Physics Interpolation ํ™œ์„ฑํ™”: Project Settings -> Physics -> Common -> Physics Interpolation์„ `true`๋กœ ์„ค์ •.
  • ๊ฒฐ๊ณผ: ์ดˆ๊ณ ์† ๋ฌผ์ฒด๋งŒ CCD๋ฅผ ์ ์šฉํ•˜๊ณ  ์ „์ฒด ๋ฌผ๋ฆฌ ํ‹ฑ ์ฆ๊ฐ€๋Š” ์ตœ์†Œํ™”ํ•จ์œผ๋กœ์จ CPU ์ ์œ ์œจ์„ ํฌ๊ฒŒ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์‹ค๋ฌด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฐ ์—ฃ์ง€ ์ผ€์ด์Šค ๋ฐฉ์ง€ ์ „๋žต

์‹ค์ œ ์ƒ์šฉ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

1) ์–‡์€ ๋ฉ”์‰ฌ์˜ CollisionShape3D ๋‘๊ป˜ ๋ณด๊ฐ•

๋ฒฝ์ด๋‚˜ ๋ฐ”๋‹ฅ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ‰๋ฉด(Plane) ํ˜•ํƒœ์˜ ๋ฉ”์‰ฌ๋‚˜ ๋‘๊ป˜๊ฐ€ 0์— ๊ฐ€๊นŒ์šด `ConcavePolygonShape3D`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ„ฐ๋„๋ง์˜ ์ฃผ์›์ธ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ CCD๋ฅผ ์ž˜ ์„ค์ •ํ•ด๋„ ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค์ฐจ๋กœ ์ธํ•ด ์ถฉ๋Œ์ด ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒฝ ๋‚ด๋ถ€์— ์ตœ์†Œ 0.2m ~ 0.5m ์ด์ƒ์˜ ๋‘๊ป˜(BoxShape3D)๋ฅผ ์ ์šฉํ•˜๋Š” ์„ค๊ณ„ ์Šต๊ด€์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

2) Scale ์ถ• ๋ณ€ํ˜• ์ฃผ์˜

`RigidBody3D`๋‚˜ ๊ทธ ํ•˜์œ„ `CollisionShape3D`์˜ ํŠธ๋žœ์Šคํผ Scale์„ ์Œ์ˆ˜ ๋˜๋Š” ๊ท ์ผํ•˜์ง€ ์•Š๊ฒŒ(Non-uniform Scale) ๋ณ€๊ฒฝํ•˜๋ฉด, Jolt Physics์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ถฉ๋Œ ์ฒด๊ณ„(BVH Tree) ๊ณ„์‚ฐ ์‹œ ๋ฐ”์šด๋”ฉ ๋ณผ๋ฅจ์ด ์™œ๊ณก๋˜์–ด ๊ด€ํ†ต ํ˜„์ƒ์ด ์‹ฌํ™”๋ฉ๋‹ˆ๋‹ค. Scale์€ ๋ฐ˜๋“œ์‹œ `(1, 1, 1)`๋กœ ์œ ์ง€ํ•˜๊ณ  Shape์˜ Extents/Size ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3) StaticBody3D ์ถฉ๋Œ ๋ ˆ์ด์–ด ์ตœ์ ํ™”

Jolt์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ธŒ๋กœ๋“œํŽ˜์ด์ฆˆ ํƒ์ƒ‰ ํšจ์œจ์„ ๋†’์ด๋ ค๋ฉด ์ถฉ๋Œ ๋ ˆ์ด์–ด(Collision Layer)์™€ ๋งˆ์Šคํฌ(Collision Mask)๋ฅผ ์—„๊ฒฉํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ด์–ด ๊ฐ„ ์—ฐ์‚ฐ์„ ๋„๋ฉด CCD ํƒ์ƒ‰ ์Šค๋ ˆ๋“œ์˜ ๋ถ€๋‹ด์ด ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.



5. ๊ฒฐ๋ก : ์„ฑ๋Šฅ๊ณผ ์ •ํ™•๋„์˜ ์ตœ์  ๋ฐธ๋Ÿฐ์Šค

Godot 4์™€ Jolt Physics ์กฐํ•ฉ์€ ์••๋„์ ์ธ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ณ ์† ๋ฆฌ์ง€๋“œ๋ฐ”๋””์˜ ๋ฒฝ ๊ด€ํ†ต ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•œ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ์ด์‚ฐ์  ๋ฌผ๋ฆฌ ์—ฐ์‚ฐ ํŠน์„ฑ์—์„œ ๋น„๋กฏ๋˜๋Š” ๊ธฐ์ˆ ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์™„๋ฒฝํžˆ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐํ•ฉ ์ „๋žต์ด ์ตœ์„ ์ž…๋‹ˆ๋‹ค:

  1. ๊ณ ์† ์˜ค๋ธŒ์ ํŠธ์—๋งŒ ์„ ๋ณ„์  CCD(Continuous CD) ํ™œ์„ฑํ™”
  2. Godot 4.3+ ๋ฌผ๋ฆฌ ๋ณด๊ฐ„(Physics Interpolation)๊ณผ ํ•จ๊ป˜ ์ ์ ˆํ•œ ๋ฌผ๋ฆฌ ํ‹ฑ(60Hz~90Hz) ์„ธํŒ…
  3. ์ดˆ๊ณ ์† ํˆฌ์‚ฌ์ฒด๋Š” ShapeCast3D ๊ธฐ๋ฐ˜ ์กฐ์ค€/๊ถค์  ์ถ”์ ์œผ๋กœ ๋Œ€์ฒด
  4. Jolt ์—”์ง„ ์„ค์ •์—์„œ ์Šค๋ ˆ๋“œํ’€ ๋ฐ ์›Œ์ปค ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ ์ตœ์†Œํ™”

์œ„ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋‹จ๊ณ„๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ฅผ ์ตœ์  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ์–ด๋– ํ•œ ๊ณ ์† ํ”„๋ ˆ์ž„ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฒฝ์„ ๋šซ์ง€ ์•Š๋Š” ์•ˆ์ •์ ์ธ 3D ๋ฌผ๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•