Post

2026-05-11 TIL (54일차)

2026-05-11 TIL (54일차)

날씨 변화에 따른 차량 물리 제어의 설계 방향

오늘은 디지털 트윈 환경에서 눈이나 비가 올 때, 자율주행 차량(Agent)의 주행 물리를 어떻게 제어해야 하는가에 대해 강사님께 피드백을 받았다.


고민: 두 가지 접근 방식과 딜레마

처음에는 날씨에 따른 차량 제어를 위해 다음과 같은 두 가지 방식을 고안했다.

  1. 센서 인식 방식: 자동차의 센서가 비나 눈을 인식해서 스스로 내부 물리 값을 변경하는 방식.
    • 고민: 이 방식은 실제 자율주행 AI 수준의 너무 고차원적이고 전문적인 지식을 요구하는 것 같았다. 현재 우리가 구축하려는 시뮬레이션 환경에서는 구현 난이도가 너무 높고 복잡해질 것이라 우려되었다.
  2. 글로벌 상태(Game Mode) 스위치 방식: 게임 모드나 날씨 매니저에 눈/비 상태 스위치를 두고, 상태가 바뀔 때마다 매니저가 맵에 있는 자동차들의 마찰력, 속도 등 설정값을 강제로 직접 제어하는 방식.
    • 고민: 코드로 구현하기는 훨씬 쉽겠지만, “현실 세계를 최대한 똑같이 모사하자”는 디지털 트윈(Digital Twin)의 근본적인 의의에 정면으로 어긋난다는 생각이 들었다. 현실에서 비가 온다고 신(매니저)이 모든 자동차의 마찰력 스위치를 ‘딸깍’하고 낮춰버리지는 않기 때문이다.

이처럼 첫 번째 방식은 기술적으로 너무 무겁고, 두 번째 방식은 디지털 트윈의 본질에 맞지 않아 딜레마에 빠졌고, 이 방향성이 맞는지 튜터님(강사님)께 직접 질문을 드리게 되었다.

강사님 피드백”

튜터님께서는 나의 고민을 들으시고, 특히 두 번째(글로벌 스위치) 방식이 시뮬레이션 구조상 왜 좋지 않은 아키텍처인지 명확히 짚어주셨다.

  • 구조적 결함 (부자연스러운 제어 방식): 날씨를 관리하는 시스템이 스위치처럼 상태를 바꾸고, 그 상태를 받아와서 자동차의 내부 물리 설정값을 외부에서 직접 건드리는 방식은 좋은 설계가 아니다. 비가 온다고 날씨 매니저가 모든 자동차에 접근해서 “너 이제부터 마찰력 깎고 미끄러워져라!”라고 강제 명령을 내리는 것은 시뮬레이션 코드로서 억지스럽다.
  • 클라이언트 개발자(디지털 트윈)의 역할: 우리의 목표는 자동차를 외부에서 인위적으로 억누르는 가짜 로직을 짜는 것이 아니다. 이 도로 환경에서 자동차가 잘 돌아다닐 수 있는가?를 테스트하기 위한 현실적인 시뮬레이션 환경을 구축하는 것이 이번에 목표다.

올바른 설계 방향: “환경이 변하면, 머티리얼이 변한다”

강사님께서 제시해주신 정답은 환경과 에이전트를 철저히 분리하고, ‘피직스 머티리얼(Physics Material)’을 매개체로 사용하는 것이었다.

올바른 시뮬레이션 흐름 (Physics Material Architecture)

  1. 날씨의 변화: 시스템 상에 비나 눈이 내리기 시작한다.
  2. 시각적/물리적 환경 변화: * 비가 오면 도로가 젖는다. 즉, 도로 렌더링에 사용되는 머티리얼(Material)이 젖은 아스팔트로 교체된다.
    • [핵심] 이때 시각적인 머티리얼만 바뀌는 것이 아니라, 그 표면의 물리적 특성을 담당하는 피직스 머티리얼(Physics Material)도 젖은 상태(마찰력 감소 등)로 함께 교체된다.
  3. 에이전트(차량)의 자연스러운 반응:
    • 자동차 에이전트는 바뀐 날씨 상태값을 직접 받아오거나 자신의 설정을 강제로 변경하지 않는다.
    • 그저 바뀐 피직스 머티리얼 위를 평소처럼 달릴 뿐이다.
    • 바퀴가 닿고 있는 바닥의 피직스 머티리얼 마찰력이 낮아졌기 때문에, 물리 엔진에 의해 ‘자연스럽게’ 미끄러짐이 발생한다.

앞으로 해야 할 작업

결국 날씨 스위치로 에이전트의 수치를 강제로 조작하는 하드코딩을 피하고, 도로 환경의 피직스 머티리얼과 에이전트의 물리 상호작용을 다듬는 데 집중해야 한다.

  • 피직스 머티리얼 세팅: 아스팔트, 빗길, 눈길 등에 맞는 정확한 물리값(Friction 등)을 피직스 머티리얼에 설정하고 도로에 적용해야 한다.
  • 에이전트 제어 로직 튜닝: 차가 빗길 피직스 머티리얼 위를 달릴 때 자연스러운 미끄러짐이 발생하면, 자율주행 알고리즘이 이를 어떻게 극복할 것인지 목표 설정 값(Target Speed)목표 회전 값(Target Steering/Yaw)을 보정하는 로직을 고민해야 한다.

느낀 점

“외부 시스템으로 에이전트의 물리값을 직접 뜯어고치지 마라. 환경의 물리적 기반(피직스 머티리얼)을 바꿔서 에이전트가 그 환경에 자연스럽게 반응하도록 설계하라.”

단순히 결과만 똑같이 보이게 만드는 가짜 코드가 아니라, 구조적으로 결합도를 낮추고 진짜 물리 상호작용을 구현하는 디지털 트윈의 뼈대를 배우게 된 피드백이었다.




언리얼 엔진: 피직스 머티리얼(Physics Material) 핵심 가이드

일반적인 3D 그래픽 작업에서 ‘머티리얼(Material)’이라고 하면 색상, 반사율, 질감 등 시각적인 껍데기를 떠올리기 쉽습니다. 하지만 자동차 시뮬레이션이나 물리 상호작용이 중요한 프로젝트에서는 눈에 보이는 것만큼이나 ‘물리적인 성질’이 중요합니다.

이때 사용하는 것이 바로 피직스 머티리얼(Physical Material)입니다.


피직스 머티리얼의 정의

피직스 머티리얼(Physics Material)은 언리얼 엔진의 물리 엔진(Chaos Physics)이 특정 표면을 어떻게 처리해야 하는지 알려주는 ‘물리적 성질 데이터 에셋’입니다.

  • 시각적 머티리얼 (Material): “이 바닥은 물에 젖은 아스팔트처럼 보여야 해.” (빛의 반사, 컬러 연산)
  • 피직스 머티리얼 (Physical Material): “이 바닥은 물에 젖은 아스팔트니까 타이어가 닿으면 잘 미끄러져야 해.” (마찰, 탄성 연산)

즉, 액터의 코드를 직접 수정하지 않고도 환경(바닥, 벽 등) 자체에 물리적인 특성을 부여하여, 에이전트(자동차, 캐릭터 등)가 그 위에서 자연스러운 물리 법칙을 따르도록 만드는 핵심 매개체입니다.


피직스 머티리얼의 핵심 속성

피직스 머티리얼을 열어보면 여러 세팅이 있지만, 가장 중요한 3가지는 다음과 같습니다.

① 마찰력 (Friction)

두 물체가 맞닿아 미끄러질 때 발생하는 저항력입니다.

  • 낮은 값 (예: 0.1): 얼음판처럼 아주 잘 미끄러집니다.
  • 높은 값 (예: 0.8 이상): 마른 아스팔트나 고무처럼 끈적하게 달라붙어 잘 미끄러지지 않습니다.

② 반발력 (Restitution)

물체가 표면에 부딪혔을 때 얼마나 튀어 오를지(탄성)를 결정합니다.

  • 0.0: 찰흙처럼 부딪히는 순간 에너지를 잃고 바닥에 찰싹 달라붙습니다.
  • 1.0: 탱탱볼처럼 부딪힌 힘을 그대로 유지하며 높게 튀어 오릅니다.

③ 결합 모드 (Combine Mode)

물리 상호작용은 항상 두 물체(예: 타이어와 도로)가 만날 때 발생합니다. 두 물체가 각각 다른 마찰력/반발력을 가지고 있을 때, 최종 값을 어떻게 계산할지 결정합니다.

  • Average: 두 값의 평균을 냅니다.
  • Min / Max: 두 값 중 더 작거나 큰 값을 사용합니다. (예: 얼음판(Min)을 달리면 타이어 마찰력이 아무리 높아도 쭈욱 미끄러지게 만들 때 사용)
  • Multiply: 두 값을 곱합니다.

기초 사용 방법

피직스 머티리얼을 생성하고 적용하는 방법은 매우 간단합니다.

Step 1. 에셋 생성하기

  1. 콘텐츠 브라우저의 빈 공간을 우클릭합니다.
  2. Physics (피직스) 카테고리로 이동하여 Physical Material (피지컬 머티리얼)을 선택합니다.
  3. 부모 클래스 선택 창이 뜨면 PhysicalMaterial을 선택합니다.
  4. 알아보기 쉽게 이름을 짓습니다. (예: PM_Asphalt_Wet, PM_Ice, PM_Mud)

Step 2. 물리 수치 조절하기

  1. 생성된 에셋을 더블클릭하여 엽니다.
  2. 디테일 패널에서 상황에 맞게 FrictionRestitution 값을 조절합니다. (예: 빗길 아스팔트라면 마찰력을 0.4 정도로 낮게 설정합니다.)

Step 3. 표면에 적용하기 (2가지 방법)

피직스 머티리얼을 실제 게임 환경에 적용하는 방법은 크게 두 가지가 있습니다. 프로젝트 구조에 맞게 선택하세요.

방법 A: 시각 머티리얼에 종속시키기 (권장) 가장 효율적인 방법입니다. 눈에 보이는 재질과 물리적 재질을 하나로 묶습니다.

  1. 도로에 발라줄 시각 머티리얼(예: M_WetAsphalt)을 엽니다.
  2. 노드 그래프의 빈 공간을 클릭하고 좌측 디테일 패널을 봅니다.
  3. Phys Material 항목을 찾아, 방금 만든 PM_Asphalt_Wet을 넣고 저장합니다.

    효과: 이제 이 시각 머티리얼이 적용된 모든 도로는 자동으로 빗길 물리 판정을 받습니다!

방법 B: 콜리전(Collision)에 직접 덮어씌우기 (Override) 특정 액터나 컴포넌트에만 예외적으로 물리 특성을 주고 싶을 때 사용합니다.

  1. 레벨에 배치된 3D 모델(Static Mesh)이나 액터를 클릭합니다.
  2. 디테일 패널에서 Collision (콜리전) 탭을 찾습니다.
  3. Phys Material Override 항목에 피직스 머티리얼을 넣어줍니다.

    효과: 시각적인 머티리얼과 상관없이, 해당 액터의 충돌체(Collision)는 지정된 물리적 성질을 갖게 됩니다.


정리: 왜 시뮬레이션에서 필수적인가?

디지털 트윈이나 자율주행 시뮬레이션에서는 환경(날씨, 도로 상태)과 에이전트(자동차)의 논리적 분리(Decoupling)가 생명입니다.

피직스 머티리얼을 활용하면, 비가 올 때 자동차의 코드를 열어 Speed = Speed * 0.5; 처럼 하드코딩할 필요가 없습니다. 그저 도로의 머티리얼을 빗길로 교체해주기만 하면, 물리 엔진이 알아서 마찰력을 줄이고 자동차를 자연스럽게 미끄러뜨립니다. 이것이 현실을 가장 완벽하게 모사하는 진정한 물리 시뮬레이션의 구조입니다.

This post is licensed under CC BY 4.0 by the author.