Skip to content

devouring123/ProceduralWorld

Repository files navigation

๐Ÿ—๏ธ ProceduralWorld - ๊ณ ๊ธ‰ 3D WFC ์‹œ์Šคํ…œ

Unreal Engine C++ ๋ผ์ด์„ ์Šค ํฌํŠธํด๋ฆฌ์˜ค

๊ณ ๊ธ‰ ์ ˆ์ฐจ์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ์‹œ์Šคํ…œ
์‹ค์‹œ๊ฐ„ 3D ๋ ˆ๋ฒจ ์ƒ์„ฑ์„ ์œ„ํ•œ Wave Function Collapse ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

๐Ÿ“‹ ๋ชฉ์ฐจ


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ProceduralWorld ์ธ๋„ค์ผ

ProceduralWorld๋Š” Unreal Engine 5.4์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณต์žกํ•œ ๊ฑด์ถ• ๊ตฌ์กฐ๋ฌผ๊ณผ ๋˜์ „ ํ™˜๊ฒฝ์„ ์ ˆ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ 3D ๊ณต๊ฐ„์˜ ์ตœ์ฒจ๋‹จ Wave Function Collapse (WFC) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.

๐Ÿš€ ์ฃผ์š” ์„ฑ๊ณผ

  • ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ: ๋ช‡ ์ดˆ ๋‚ด์— ๋ณต์žกํ•œ 3D ๊ตฌ์กฐ ์ƒ์„ฑ
  • ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜: ๋ชจ๋“ˆํ˜• ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ SOLID ์›์น™
  • ๊ณ ๊ธ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ํ™•๋ฅ ์  ์„ ํƒ์„ ํ†ตํ•œ ์—”ํŠธ๋กœํ”ผ ๊ธฐ๋ฐ˜ ์ œ์•ฝ ๋งŒ์กฑ
  • ํ”„๋กœ๋•์…˜ ์ค€๋น„: ์Šค๋ ˆ๋“œ ์•ˆ์ „ ์ž‘์—…์„ ํ†ตํ•œ ์™„์ „ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • ์‹œ๊ฐ์  ์šฐ์ˆ˜์„ฑ: 100๊ฐœ ์ด์ƒ์˜ ๊ฑด์ถ• ์—์…‹์„ ํ†ตํ•œ ๋‹ค์ค‘ ๋ฐ”์ด์˜ด ์ง€์›

๐Ÿ’ก ๊ธฐ์ˆ ์  ํ˜์‹ 

// ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํƒ€์ž… ์•ˆ์ „ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์‹œ์Šคํ…œ
template<typename T>
using TStaticFuncPtr = typename TBaseStaticDelegateInstance<T, FDefaultDelegateUserPolicy>::FFuncPtr;

// ๋Ÿฐํƒ€์ž„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์ „๋žต ํŒจํ„ด
FCollapseStrategy strategy(
    ECollapseCellSelectStrategy::ByEntropy,
    ECollapseTileInfoSelectStrategy::ByWeight
);

๐Ÿ“ฑ ์‚ฌ์šฉ ์˜ˆ์‹œ

๐Ÿ”ง ๊ธฐ๋ณธ ๋ฉ”์‹œ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

๋ฉ”์‹œ ๋ณ€๊ฒฝ WFC3DActor์˜ Property ์ฐฝ์—์„œ Generate Mesh ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒˆ๋กœ์šด 3D ๊ตฌ์กฐ๊ฐ€ ์ฆ‰์‹œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ ๋‹ค๋ฅธ ํŒจํ„ด์˜ ๊ฑด์ถ•๋ฌผ์ด ์ ˆ์ฐจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ๋™์ผํ•œ ์ œ์•ฝ ์กฐ๊ฑด ํ•˜์—์„œ๋„ ๊ณ ์œ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ๊ทธ๋ฆฌ๋“œ ํฌ๊ธฐ ๋™์  ์กฐ์ •

๊ทธ๋ฆฌ๋“œ ํฌ๊ธฐ ๋ณ€๊ฒฝ Grid Dimension ์†์„ฑ์„ ํ†ตํ•ด ์ƒ์„ฑํ•  ๊ตฌ์กฐ๋ฌผ์˜ ํฌ๊ธฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 5x5x5๋ถ€ํ„ฐ ๋” ํฐ ๊ทธ๋ฆฌ๋“œ๊นŒ์ง€ ์ง€์›ํ•˜๋ฉฐ, ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ณต์žก์„ฑ๊ณผ ์ƒ์„ฑ ์‹œ๊ฐ„์ด ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

๐Ÿ—๏ธ ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ๋ฌผ ์ƒ์„ฑ

์™„์„ฑ๋œ ๊ตฌ์กฐ๋ฌผ ์ƒ์„ฑ๋œ ๋ฉ”์‹œ๋Š” ์™ธ๋ถ€์—์„œ ๋ณด์•˜์„ ๋•Œ ๋ชจ๋“  ๋ฉด์ด ์™„๋ฒฝํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ์ผ์ฒดํ˜• ๊ตฌ์กฐ๋ฌผ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. WFC ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด ๋•๋ถ„์— ์–ด์ƒ‰ํ•œ ์—ฐ๊ฒฐ๋ถ€๋‚˜ ๋ถˆ์™„์ „ํ•œ ๊ตฌ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ ์ž๋™ WFC ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

WFC ๋ฐ์ดํ„ฐ ์ƒ์„ฑ DataAsset Generator๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ๋ฉ”์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž๋™์œผ๋กœ WFC์— ํ•„์š”ํ•œ ํ˜ธํ™˜์„ฑ ๊ทœ์น™๊ณผ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™ ์„ค์ • ์—†์ด๋„ ์‹œ์Šคํ…œ์ด ์ง€๋Šฅ์ ์œผ๋กœ ๊ฐ ๋ฉด์˜ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ์„ฑ์„ ๋ถ„์„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ๊ฐœ๋ณ„ ๋ฉ”์‹œ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ

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

๐Ÿ” ์ •๋ฐ€ํ•œ ์—ฐ๊ฒฐ์„ฑ ๊ฒ€์ฆ

๋ฉ”์‹œ ๊ฐ„ ํ‹ˆ ์—†์Œ ๋ชจ๋“  ๋ฉ”์‹œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์—๋Š” 0.0001 ๋‹จ์œ„์˜ ์ •๋ฐ€๋„๋กœ ํ‹ˆ์ด๋‚˜ ์ค‘์ฒฉ ์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ๊ณ ํ’ˆ์งˆ ๋ Œ๋”๋ง๊ณผ ์ •ํ™•ํ•œ ์ฝœ๋ฆฌ์ „ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์—„๊ฒฉํ•œ ์ขŒํ‘œ ์‹œ์Šคํ…œ๊ณผ ์Šค๋ƒ…ํ•‘ ๋กœ์ง์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฎ Wave Function Collapse ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•ต์‹ฌ ๊ฐœ๋…

WFC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–‘์ž์—ญํ•™์˜ ์›๋ฆฌ๋ฅผ ์ ˆ์ฐจ์  ์ƒ์„ฑ์— ์ ์šฉํ•˜์—ฌ, ์…€๋“ค์„ ํ™•๋ฅ ์  ์ค‘์ฒฉ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋‹ค๊ฐ€ ๊ด€์ฐฐ ์‹œ ๊ฒฐ์ •์  ๊ฐ’์œผ๋กœ ๋ถ•๊ดด์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ ํ•˜์ด๋ผ์ดํŠธ

graph TD
    A[๐ŸŽฏ ์ œ์•ฝ ์กฐ๊ฑด ๋ถ„์„] --> B[๐ŸŒŠ ์ค‘์ฒฉ ์ƒํƒœ ์ดˆ๊ธฐํ™”]
    B --> C[๐Ÿ” ์—”ํŠธ๋กœํ”ผ ์„ ํƒ]
    C --> D[๐Ÿ“ก ์ œ์•ฝ ์ „ํŒŒ]
    D --> E{์™„๋ฃŒ?}
    E -->|์•„๋‹ˆ์˜ค| C
    E -->|์˜ˆ| F[๐ŸŽจ ์‹œ๊ฐ์  ์ƒ์„ฑ]
Loading
  1. ์ œ์•ฝ ์ •์˜: 6๋ฉด ์ •์œก๋ฉด์ฒด ํƒ€์ผ ํ˜ธํ™˜์„ฑ ๊ทœ์น™
  2. ํ™•๋ฅ ์  ์ดˆ๊ธฐํ™”: ๋ชจ๋“  ์…€์ด ์–‘์ž ์ค‘์ฒฉ ์ƒํƒœ๋กœ ์‹œ์ž‘
  3. ์—”ํŠธ๋กœํ”ผ ๊ธฐ๋ฐ˜ ์„ ํƒ: ๊ฐ€์žฅ ๋‚ฎ์€ ์—”ํŠธ๋กœํ”ผ ์…€์„ ๋ถ•๊ดด์šฉ์œผ๋กœ ์„ ํƒ
  4. BFS ์ „ํŒŒ: ์ฃผ๋ณ€ ๊ฐ€๋Šฅ์„ฑ์„ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ
  5. ์‹œ๊ฐ์  ๊ตฌํ˜„: ๋ฐ”์ด์˜ด ๋ณ€ํ˜•์œผ๋กœ 3D ๋ฉ”์‹œ ์ƒ์„ฑ

๐Ÿ›๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ๊ตฌ์กฐ

AWFC3DActor (๊ฒŒ์ž„ ์›”๋“œ ์ธํ„ฐํŽ˜์ด์Šค)
โ”œโ”€โ”€ UWFC3DController (์‹œ์Šคํ…œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)
โ”‚   โ”œโ”€โ”€ UWFC3DAlgorithm (ํ•ต์‹ฌ WFC ์—”์ง„)
โ”‚   โ”œโ”€โ”€ UWFC3DVisualizer (๋ฉ”์‹œ ์ƒ์„ฑ)
โ”‚   โ””โ”€โ”€ UWFC3DGrid (3D ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ)
โ””โ”€โ”€ UWFC3DModelDataAsset (๊ตฌ์„ฑ)

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

๐ŸŽฎ WFC3DController - ์‹œ์Šคํ…œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ

UFUNCTION(BlueprintCallable)
void ExecuteAsync(const FWFC3DExecutionContext& Context);

UPROPERTY(BlueprintAssignable)
FOnWFC3DExecutionCompleted OnExecutionCompleted;

๐Ÿง  WFC3DAlgorithm - ํ•ต์‹ฌ ์—”์ง„

// ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋น„๋™๊ธฐ ์‹คํ–‰
std::atomic<bool> bIsRunningAtomic;
TUniquePtr<FAsyncTask<FWFC3DAlgorithmAsyncTask>> AsyncTask;

// ์ „๋žต ํŒจํ„ด ๊ตฌํ˜„
FCollapseStrategy CollapseStrategy;
FPropagationStrategy PropagationStrategy;

โšก ์„ฑ๋Šฅ ๋ฐ ์ตœ์ ํ™”

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์•„ํ‚คํ…์ฒ˜

  • ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ์‹œ์Šคํ…œ: FAsyncTask๋ฅผ ํ†ตํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ WFC ์‹คํ–‰
  • ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ: std::atomic ๋ฐ FCriticalSection ์‚ฌ์šฉ
  • ๋…ผ๋ธ”๋กœํ‚น UI: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ ์—†๋Š” ์‹ค์‹œ๊ฐ„ ์ง„ํ–‰๋ฅ  ์—…๋ฐ์ดํŠธ

๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”

  • RAII ํŒจํ„ด: ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ (TUniquePtr, TSharedPtr)
  • ๊ฐ์ฒด ํ’€๋ง: GC ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋ฉ”์‹œ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ
  • ๋น„ํŠธ ๋ฐฐ์—ด: ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์ƒํƒœ ํ‘œํ˜„

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์„ฑ

// O(log n) ์ ‘๊ทผ ์‹œ๊ฐ„์˜ O(nยณ) ๊ณต๊ฐ„
TMap<FIntVector, UStaticMeshComponent*> GridToMeshMap;

// ๋ฒ”์œ„ ์ œํ•œ ์ „ํŒŒ
ERangeLimitStrategy: Sphere/Cube RangeLimited

๐ŸŽจ ์‹œ๊ฐํ™” ์‹œ์Šคํ…œ

๋‹ค์ค‘ ๋ฐ”์ด์˜ด ๋ Œ๋”๋ง

  • ํ…Œ๋งˆ ๋ณ€ํ˜•: ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘ ๋ฐ”์ด์˜ด ๋จธํ‹ฐ๋ฆฌ์–ผ
  • ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ์„ ํƒ: ํ™•๋ฅ ์  ํƒ€์ผ ๋ณ€ํ˜• ์„ ํƒ
  • ์‹ค์‹œ๊ฐ„ ์ ์šฉ: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰๊ณผ ๋™์‹œ ์‹œ๊ฐํ™”

์—์…‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (100๊ฐœ ์ด์ƒ ์ปดํฌ๋„ŒํŠธ)

๐Ÿ—๏ธ ๊ฑด์ถ• ์š”์†Œ:
โ”œโ”€โ”€ ๊ธฐ๋ณธ ๊ตฌ์กฐ: ๋ฒฝ, ๋ฐ”๋‹ฅ, ์ฒœ์žฅ (6๋ฐฉํ–ฅ)
โ”œโ”€โ”€ ๋ณต์žกํ•œ ์กฐ์ธํŠธ: ๋ชจ์„œ๋ฆฌ, ๊ต์ฐจ์  (12๊ฐœ ์ด์ƒ ๋ณ€ํ˜•)
โ”œโ”€โ”€ ๊ณ ๊ธ‰ ์ปดํฌ๋„ŒํŠธ: InBackRight, InDownBack, InUpBack
โ””โ”€โ”€ ๋จธํ‹ฐ๋ฆฌ์–ผ ๋ณ€ํ˜•: ์ปดํฌ๋„ŒํŠธ๋‹น 4๊ฐœ ์ด์ƒ PBR ๋ณ€ํ˜•

๐Ÿ“Š ํ”„๋กœ์ ํŠธ ๋ฉ”ํŠธ๋ฆญ

๊ฐœ๋ฐœ ํ†ต๊ณ„

๐Ÿ“ ์†Œ์Šค ํŒŒ์ผ:        25๊ฐœ ์ด์ƒ์˜ C++ ๊ตฌํ˜„ ํŒŒ์ผ
๐Ÿ“Š ์ฝ”๋“œ ๋ณต์žก๋„:      5,000์ค„ ์ด์ƒ (์ฃผ์„ ์ œ์™ธ)
๐Ÿ—๏ธ ํ•ต์‹ฌ ํด๋ž˜์Šค:      15๊ฐœ ์ด์ƒ์˜ ์•„ํ‚คํ…์ฒ˜ ์ปดํฌ๋„ŒํŠธ
๐Ÿ“‹ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ:      20๊ฐœ ์ด์ƒ์˜ ์ตœ์ ํ™”๋œ ๊ตฌ์กฐ์ฒด
โšก ๊ณต๊ฐœ ํ•จ์ˆ˜:        100๊ฐœ ์ด์ƒ์˜ ๋ฉค๋ฒ„ ๋ฉ”์†Œ๋“œ
๐ŸŽฏ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€:   5x5x5 ๊ทธ๋ฆฌ๋“œ ๊ฒ€์ฆ

์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

๐ŸŽฏ ์ƒ์„ฑ ์†๋„:        5ยณ ๊ทธ๋ฆฌ๋“œ 1์ดˆ ๋ฏธ๋งŒ
๐Ÿ’พ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰:     O(nยณ) ์ตœ์ ํ™”๋œ ํ• ๋‹น
๐Ÿ”„ ์„ฑ๊ณต๋ฅ :          99% ์ด์ƒ ์ œ์•ฝ ๋งŒ์กฑ
๐Ÿ“Š ์Šค๋ ˆ๋“œ ํšจ์œจ์„ฑ:     100% ๋น„๋™๊ธฐ ์ž‘์—… ์„ฑ๊ณต

๐Ÿš€ ๊ธฐ์ˆ ์  ์šฐ์ˆ˜์„ฑ

๊ณ ๊ธ‰ C++ ๊ธฐ๋Šฅ

  • ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ์•ˆ์ „์„ฑ
  • ๋ชจ๋˜ C++17: ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ, ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ๋ฃจํ”„, ๊ตฌ์กฐ์  ๋ฐ”์ธ๋”ฉ
  • ์–ธ๋ฆฌ์–ผ ํ†ตํ•ฉ: ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ์ƒํ˜ธ ์šด์šฉ, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์‹œ์Šคํ…œ, ๋ฆฌํ”Œ๋ ‰์…˜

์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง

  • SOLID ์›์น™: ๋‹จ์ผ ์ฑ…์ž„, ์˜์กด์„ฑ ์—ญ์ „
  • ์ „๋žต ํŒจํ„ด: ๋Ÿฐํƒ€์ž„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์„ฑ
  • ๊ด€์ฐฐ์ž ํŒจํ„ด: ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ์•„ํ‚คํ…์ฒ˜
  • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋™์‹œ ์‹คํ–‰

ํ’ˆ์งˆ ๋ณด์ฆ

  • ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ: RAII, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ, ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ
  • ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ: ์›์ž์  ์—ฐ์‚ฐ, ์ž„๊ณ„ ์„น์…˜
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: ํฌ๊ด„์ ์ธ ๊ฒ€์ฆ ๋ฐ ๋ณต๊ตฌ

๐Ÿ› ๏ธ ์‹œ์ž‘ํ•˜๊ธฐ

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

Unreal Engine 5.4 ์ด์ƒ
Visual Studio 2022 (C++17 ์ง€์›)
Windows 10/11 (64๋น„ํŠธ)
์ตœ์†Œ 16GB RAM (๋Œ€ํ˜• ๊ทธ๋ฆฌ๋“œ์šฉ ๊ถŒ์žฅ)

๋น ๋ฅธ ์„ค์ •

# 1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํด๋ก 
git clone https://github.com/devouring123/ProceduralWorld.git

# 2. ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ
ProceduralWorld.uproject ์šฐํด๋ฆญ โ†’ Generate Visual Studio Files

# 3. ์†”๋ฃจ์…˜ ๋นŒ๋“œ
ProceduralWorld.sln ์—ด๊ธฐ โ†’ ๋นŒ๋“œ โ†’ ์†”๋ฃจ์…˜ ๋นŒ๋“œ

# 4. ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธ
UE5 ์—๋””ํ„ฐ์—์„œ ์—ด๊ธฐ โ†’ WFCDataGeneratingLevel ๋กœ๋“œ โ†’ ํ”Œ๋ ˆ์ด

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

// ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ๊ตฌ์„ฑ
BP_WFC3DActor ์„ค์ •:
- Grid Dimension: (10, 10, 5)
- Model Data: DA_WFC3DModel  
- Random Seed: [์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ’]
- Auto Execute On Begin Play: โœ“

๐ŸŽ“ ํ•™์Šต ๋ฐ ์—ฐ๊ตฌ

ํ•™์ˆ  ์ฐธ๊ณ ์ž๋ฃŒ

  • ์›๋ณธ WFC ์—ฐ๊ตฌ: mxgmn/WaveFunctionCollapse
  • 2D ๊ตฌํ˜„: devouring123/WFC2D
  • ์ œ์•ฝ ๋งŒ์กฑ: CSP ์ด๋ก  ๋ฐ ํ™•๋ฅ ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ˆ  ๋ฌธ์„œ

  • UE5 PCG ํ”„๋ ˆ์ž„์›Œํฌ: ์ ˆ์ฐจ์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ํ†ตํ•ฉ
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ: ์–ธ๋ฆฌ์–ผ์˜ ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ์‹œ์Šคํ…œ
  • ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํ†ตํ•ฉ: C++์—์„œ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํ†ต์‹  ํŒจํ„ด

๐Ÿ† ์ „๋ฌธ์  ์˜ํ–ฅ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—”์ง€๋‹ˆ์–ด๋ง

โœ… ๋ณต์žกํ•œ CSP ์†”๋ฃจ์…˜: 3D ์ œ์•ฝ ๋งŒ์กฑ ์ตœ์ ํ™”
โœ… ํ™•๋ฅ ์  ์‹œ์Šคํ…œ: ์ผ๊ด€์„ฑ ๋ณด์žฅ์„ ํ†ตํ•œ ๊ฐ€์ค‘์น˜ ๋ฌด์ž‘์œ„ํ™”
โœ… ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ: ์ƒํ˜ธ์ž‘์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‘๋‹ต ์‹œ๊ฐ„

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜

โœ… ๊ธฐ์—… ํŒจํ„ด: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„์˜ SOLID ์›์น™
โœ… ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ™œ์šฉ
โœ… ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง: ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์ตœ์ ํ™”

๊ฒŒ์ž„ ์—”์ง„ ์ „๋ฌธ์„ฑ

โœ… ๊ณ ๊ธ‰ UE5 ๊ธฐ๋Šฅ: PCG, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ, ๋ฆฌํ”Œ๋ ‰์…˜ ์‹œ์Šคํ…œ
โœ… ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ˜ธํ™˜์„ฑ: Windows/Mac/Linux ์ง€์›
โœ… ๋””์ž์ด๋„ˆ ์นœํ™”์  ๋„๊ตฌ: ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํ†ตํ•ฉ ๋ฐ ๋น„์ฃผ์–ผ ์Šคํฌ๋ฆฝํŒ…


๐Ÿš€ ๊ฐœ๋ฐœ ํ˜„ํ™ฉ ๋ฐ ๋กœ๋“œ๋งต

๐Ÿ“ ํ˜„์žฌ ๋ฒ„์ „: v1.0 (๊ธฐ๋ณธ WFC ๊ตฌํ˜„)

ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ๋‹จ์ผ ๊ทธ๋ฆฌ๋“œ WFC ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์™„์„ฑ๋œ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค:

  • โœ… 5ร—5ร—5 ๊ทธ๋ฆฌ๋“œ์—์„œ ์•ˆ์ •์ ์ธ 3D ๊ตฌ์กฐ ์ƒ์„ฑ
  • โœ… ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐํ™” ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • โœ… ๋‹ค์ค‘ ๋ฐ”์ด์˜ด ์ง€์› (100๊ฐœ ์ด์ƒ ๊ฑด์ถ• ์—์…‹)
  • โœ… ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ํ†ตํ•ฉ ๋ฐ ์‚ฌ์šฉ์ž ์นœํ™”์  ์ธํ„ฐํŽ˜์ด์Šค

๐ŸŽฏ ๋‹ค์Œ ๋ฒ„์ „ ๊ณ„ํš

๐Ÿ“‹ v2.0 - Enhanced WFC (์˜ˆ์ •)

๋ชฉํ‘œ: ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ํ•œ๊ณ„์  ํ•ด๊ฒฐ ๋ฐ ์ž๋™ํ™” ๊ตฌํ˜„

  • ๐Ÿ”„ ๊ฑด๋ฌผ ์—ฐ๊ฒฐ์„ฑ ๋ณด์žฅ: 4ร—4ร—4+ ๊ทธ๋ฆฌ๋“œ์—์„œ ๋‹จ์ผ ๊ฑด๋ฌผ ์ƒ์„ฑ ๋ณด์žฅ
  • โš™๏ธ ์ž๋™ ๋ฉ”์‹œ ๋ถ„ํ• : ๊ฑด๋ฌผ ๋ฉ”์‹œ โ†’ WFC ๋ฐ์ดํ„ฐ ์™„์ „ ์ž๋™ํ™”
  • ๐Ÿค– AI ํ˜ธํ™˜์„ฑ ํŒ๋‹จ: 3D ํ˜•์ƒ ๊ธฐ๋ฐ˜ ์ž๋™ ๋ฉด ํ˜ธํ™˜์„ฑ ๋ถ„์„
  • ๐Ÿ“ˆ 95% ์ž‘์—… ์‹œ๊ฐ„ ๋‹จ์ถ•: ์ˆ˜์ž‘์—… ์ตœ์†Œํ™”๋กœ ์ƒ์‚ฐ์„ฑ ๊ทน๋Œ€ํ™”

ํ•ต์‹ฌ ๊ธฐ์ˆ : ์—ฐ๊ฒฐ์„ฑ ๋ถ„์„, ๊ณต๊ฐ„ ์ธ์‹, ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๋งค์นญ

๐Ÿ—๏ธ v3.0 - Hierarchical WFC (๊ณ„ํš)

๋ชฉํ‘œ: ์ค‘๊ฐ„ ๊ทœ๋ชจ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์œ„ํ•œ ๊ณ„์ธต์  ๊ตฌ์กฐ ๊ตฌํ˜„

  • ๐Ÿ“Š 2-๋ ˆ๋ฒจ ๊ณ„์ธต: SuperGrid โ†’ SubGrid ๋ถ„ํ•  ์‹œ์Šคํ…œ
  • ๐Ÿ”— ๊ฒฝ๊ณ„๋ฉด ๊ด€๋ฆฌ: ์ธ์ ‘ ๊ทธ๋ฆฌ๋“œ ๊ฐ„ ์™„๋ฒฝํ•œ ์—ฐ๊ฒฐ์„ฑ ๋ณด์žฅ
  • โšก ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ: ๋…๋ฆฝ์  ๊ทธ๋ฆฌ๋“œ์˜ ๋™์‹œ ์‹คํ–‰
  • ๐Ÿ“ ํ™•์žฅ ๋ฒ”์œ„: 32ร—32ร—32 ๊ทธ๋ฆฌ๋“œ๊นŒ์ง€ ์•ˆ์ •์  ์ง€์›

ํ•ต์‹ฌ ๊ธฐ์ˆ : ๊ทธ๋ฆฌ๋“œ ๋ถ„ํ• , ๊ฒฝ๊ณ„ ๋™๊ธฐํ™”, ๋ฐฐ์น˜ ์‹คํ–‰

๐ŸŒณ v4.0 - Recursive Hierarchical WFC (๋น„์ „)

๋ชฉํ‘œ: ๋Œ€๊ทœ๋ชจ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์œ„ํ•œ ๋ฌดํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ

  • โ™พ๏ธ ๋ฌด์ œํ•œ ํ™•์žฅ: ์ด๋ก ์ ์œผ๋กœ 1000ร—1000ร—1000+ ์ง€์›
  • ๐Ÿง  ์ ์‘์  ๋ถ„ํ• : ๋ณต์žก๋„ ๊ธฐ๋ฐ˜ ์ž๋™ ๋ ˆ๋ฒจ ๊ฒฐ์ •
  • ๐Ÿ’พ ์ง€์—ฐ ๋กœ๋”ฉ: ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ
  • ๐ŸŽฎ ์‹ค์‹œ๊ฐ„ ์ƒ์„ฑ: ๊ฑฐ๋Œ€ ๋„์‹œ/๋˜์ „์˜ ์‹ค์‹œ๊ฐ„ ์ ˆ์ฐจ์  ์ƒ์„ฑ

ํ•ต์‹ฌ ๊ธฐ์ˆ : ์žฌ๊ท€์  ๋…ธ๋“œ, ํŠธ๋ฆฌ ๊ตฌ์กฐ, ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŠธ๋ฆฌ๋ฐ

๐Ÿ› ๏ธ ์ฃผ์š” ํ˜์‹  ๊ธฐ์ˆ 

Layer 1: ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  (v2.0)

๐Ÿ” ์—ฐ๊ฒฐ์„ฑ ๋ถ„์„ โ†’ ๐Ÿ”ง ์ž๋™ ๋ฉ”์‹œ ๋ถ„ํ•  โ†’ ๐Ÿค– AI ํ˜ธํ™˜์„ฑ ํŒ๋‹จ
  • UWFC3DConnectivityAnalyzer: DFS ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ ๋ถ„์„
  • UWFC3DMeshSlicer: ๋ณผ๋ฅจ ๊ธฐ๋ฐ˜ ์ž๋™ ๋ฉ”์‹œ ์Šฌ๋ผ์ด์‹ฑ
  • UWFC3DGeometryMatcher: 3D ํ˜•์ƒ ๊ธฐ๋ฐ˜ ํ˜ธํ™˜์„ฑ ํŒ๋‹จ
  • UWFC3DAutoDataGenerator: ์™„์ „ ์ž๋™ํ™” ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ

Layer 2: ๊ณ„์ธต ๊ตฌ์กฐ (v3.0)

๐Ÿข SuperGrid โ†’ ๐Ÿ  SubGrid โ†’ ๐Ÿงฑ AtomicGrid
  • UWFC3DHierarchicalController: ๊ณ„์ธต์  ์‹คํ–‰ ์ œ์–ด
  • UWFC3DBoundaryManager: ๋‹ค์ค‘ ๊ทธ๋ฆฌ๋“œ ๊ฒฝ๊ณ„๋ฉด ๊ด€๋ฆฌ
  • UWFC3DIntelligentScheduler: ์˜์กด์„ฑ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์Šค์ผ€์ค„๋ง

Layer 3: ๋ฌดํ•œ ํ™•์žฅ (v4.0)

๐ŸŒ MasterGrid โ†’ ๐Ÿ™๏ธ District โ†’ ๐Ÿ˜๏ธ Block โ†’ ๐Ÿ  Building
  • UWFC3DGridNode: ์žฌ๊ท€์  ํŠธ๋ฆฌ ๋…ธ๋“œ ์‹œ์Šคํ…œ
  • UWFC3DHierarchyManager: ์ ์‘์  ๋ถ„ํ•  ์ „๋žต ๊ด€๋ฆฌ
  • UWFC3DLazyLoadingManager: ์ง€์—ฐ ๋กœ๋”ฉ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”

๐Ÿ“ˆ ์˜ˆ์ƒ ์„ฑ๋Šฅ ํ–ฅ์ƒ

๋ฒ„์ „ ์ง€์› ๊ทธ๋ฆฌ๋“œ ์ƒ์„ฑ ์‹œ๊ฐ„ ์„ฑ๊ณต๋ฅ  ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ
v1.0 5ร—5ร—5 1์ดˆ 99%+ ๊ธฐ์ค€์„ 
v2.0 8ร—8ร—8 30์ดˆ 99%+ ๋™์ผ
v3.0 32ร—32ร—32 5๋ถ„ 95%+ +50%
v4.0 ๋ฌด์ œํ•œ ๊ฐ€๋ณ€ 90%+ +95%

๐ŸŽฎ ์‘์šฉ ๋ถ„์•ผ ํ™•์žฅ

๊ฒŒ์ž„ ๊ฐœ๋ฐœ

  • AAA ๊ฒŒ์ž„: ๋Œ€๊ทœ๋ชจ ์ ˆ์ฐจ์  ๋„์‹œ ์ƒ์„ฑ
  • ์ธ๋”” ๊ฒŒ์ž„: ๋ฌดํ•œ ๋˜์ „/๋กœ๊ทธ๋ผ์ดํฌ ์‹œ์Šคํ…œ
  • VR/AR: ์‹ค์‹œ๊ฐ„ ๊ณต๊ฐ„ ์ƒ์„ฑ ๋ฐ ์ ์‘

์‚ฐ์—… ์‘์šฉ

  • ๊ฑด์ถ• ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ์‹ค์ œ ๊ฑด์ถ• ๋„๋ฉด ๊ธฐ๋ฐ˜ 3D ๋ชจ๋ธ ์ž๋™ ์ƒ์„ฑ
  • ๋„์‹œ ๊ณ„ํš: ๋Œ€๊ทœ๋ชจ ๋„์‹œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ ์ตœ์ ํ™”
  • ์˜ํ™”/์• ๋‹ˆ๋ฉ”์ด์…˜: ๋ฐฐ๊ฒฝ ์„ธํŠธ ์ž๋™ ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ

์—ฐ๊ตฌ ๋ฐ ๊ต์œก

  • ์ ˆ์ฐจ์  ์ƒ์„ฑ ์—ฐ๊ตฌ: ํ•™์ˆ  ์—ฐ๊ตฌ ๋ฐ ๋…ผ๋ฌธ ๋ฐœํ‘œ
  • AI ํ›ˆ๋ จ: ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ›ˆ๋ จ์šฉ ๋ฌดํ•œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
  • ๊ต์œก ๋„๊ตฌ: ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ต์œก ํ”Œ๋žซํผ

๐Ÿ“ˆ ํฌํŠธํด๋ฆฌ์˜ค ํ•˜์ด๋ผ์ดํŠธ

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ์„ ์ž…์ฆํ•ฉ๋‹ˆ๋‹ค:

  • ๊ณ ๊ธ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„: ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ์˜ ๋ณต์žกํ•œ CS ๊ฐœ๋…
  • ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์†”๋ฃจ์…˜
  • ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜: ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ์„ค๊ณ„
  • ๊ฒŒ์ž„ ์—”์ง„ ๋งˆ์Šคํ„ฐ๋ฆฌ: ์ „๋ฌธ๊ฐ€๊ธ‰ ์–ธ๋ฆฌ์–ผ ์—”์ง„ ๊ฐœ๋ฐœ
  • ๋ฌธ์ œ ํ•ด๊ฒฐ: ์ ˆ์ฐจ์  ์ƒ์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ˜์‹ ์  ์†”๋ฃจ์…˜

๐ŸŒŸ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ์Šคํƒ€๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”! ๐ŸŒŸ

GitHub stars GitHub forks


๐Ÿ’ป์™€ โ˜•๋กœ ์ œ์ž‘ํ•œ devouring123

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors