{ "_doc": "시뮬레이터(vkgs_viewer) 설정. nusim render view 가 --config 로 넘긴다. 빠진 항목은 viewer.cpp SimConfig 기본값. 명령줄 옵션이 이 파일보다 우선한다.", "weather": { "start": "clear", "defaults": { "daylight": 1.0, "cloud": 0.0, "rain": 0.0, "fog": 0.0, "wet": 0.0, "snow": 0.0, "snow_cover": 0.0, "headlights": -1 }, "presets": [ { "name": "clear", "label": "맑음", "values": {} }, { "name": "morning", "label": "아침", "values": { "daylight": 0.6, "cloud": 0.15, "fog": 0.15 } }, { "name": "overcast", "label": "흐림", "values": { "cloud": 0.8, "daylight": 0.85 } }, { "name": "dusk", "label": "해질녘", "values": { "daylight": 0.35, "cloud": 0.2 } }, { "name": "night", "label": "밤", "values": { "daylight": 0.0 } }, { "name": "rain", "label": "비", "values": { "rain": 0.5, "cloud": 0.8, "daylight": 0.75 } }, { "name": "heavy_rain", "label": "폭우", "values": { "rain": 1.0, "cloud": 1.0, "daylight": 0.6, "fog": 0.3 } }, { "name": "fog", "label": "안개", "values": { "fog": 0.7, "cloud": 0.6, "daylight": 0.8 } }, { "name": "night_rain", "label": "밤비", "values": { "rain": 0.7, "cloud": 0.9, "daylight": 0.0 } }, { "name": "snow", "label": "눈", "values": { "snow": 0.5, "daylight": 0.8 } }, { "name": "heavy_snow", "label": "폭설", "values": { "snow": 1.0, "daylight": 0.65, "fog": 0.35 } } ], "fx": { "_doc": "날씨 효과 조정값 (weather.comp, precip.vert). 입자 수는 세기 1 일 때 — 실제 수 = 세기 × 이 값. 상자 = 카메라 주변 입자 영역 (반폭). exposure_s = 빗줄기 모션 블러 노출, aperture_m = 가까운 입자의 초점 흐림. lens_drops·puddles 는 0~1 배율. volumetric_steps = 안개 속 전조등 빛줄기 적분 걸음 (0 = 끔)", "rain_particles": 80000, "snow_particles": 120000, "box_half_xy_m": 15, "box_half_z_m": 6, "exposure_s": 0.02, "aperture_m": 0.0025, "wind_mps": [1.0, 0.3], "lens_drops": 1.0, "puddles": 1.0, "fog_height_m": 20, "volumetric_steps": 12 }, "headlights": { "intensity": 0.9, "cone_deg": 28.0, "auto_below_daylight": 0.3, "height_m": 0.7, "pitch": -0.05, "inset_m": 0.25 } }, "sky": { "_doc": "mode: sim = Vulkan 시뮬레이션 하늘 (기본), learned = 학습된 하늘 큐브맵(sky.ktx2, 학습기 일치 검사용), ibl = 환경맵", "mode": "sim", "sun_azimuth_deg": 120.0, "cloud_speed": [ 0.012, 0.004 ] }, "chase_camera": { "back_m": 5.5, "back_per_mps": 0.15, "height_m": 1.7, "look_ahead_m": 8.0, "look_height_m": 1.25, "yaw_offset_deg": -10.0, "yaw_tau_s": 0.4, "dist_tau_s": 0.8, "_pose": "2026-11-05: 6.5 m · 1.9 m → 5.5 m · 1.7 m (5.0 m 는 차가 화면 가운데를 너무 가림) — 학습 카메라(지붕 약 1.5 m, 기록 궤적 위)에 가까울수록 3DGS 가 덜 깨진다 (recon.augfix chase_views 비교). 구간 출발점에서는 카메라가 기록 궤적 뒤라 여전히 깨진다", "_zoom": "휠 · 가운데 버튼 세로 드래그로 거리 배율 (1 = back_m). 휠 한 칸 = zoom_step 배, 높이 = height_m × 배율^zoom_height_exp. 멀리 올라갈수록 3DGS 가 못 본 각도라 노면이 깨져 보인다", "zoom_min": 0.4, "zoom_max": 5.0, "zoom_step": 1.15, "zoom_height_exp": 0.5 }, "drive": { "max_speed_kmh": 30.0, "autopilot_kmh": 20.0, "start_offset_m": 8.0, "_start_offset_m": "nusim render map 의 출발 위치 = 기록 궤적을 이만큼 들어간 프레임 (창 옵션 --frame 을 주면 그것). 0 번 프레임에서 출발하면 3인칭 카메라(chase_camera.back_m 뒤)가 아무 카메라도 지나가지 않은 곳에 있어 노면이 깨져 보였다 (2026-11-05)" }, "sensors": { "_doc": "레이캐스트 센서 (src/vkgs/src/sensors.hpp) — 카메라처럼 자차에 붙는다. 광선은 복셀 월드(정적 라이다 누적 0.2 m, nusim/sim/voxels.py)와 장면 객체 상자에 부딪힌다. pos = 자차(뒷바퀴 축 중앙, 지면) 기준 [x 앞, y 왼쪽, z 위] m, rpy_deg = [roll, pitch, yaw] (센서 좌표 x 앞·y 왼쪽·z 위). 기본값은 nuScenes 배치 근사 (LIDAR_TOP = Velodyne HDL-32E, RADAR_* = Continental ARS 408). 창의 '센서' 패널에서 보기를 켜고, O(6캠 관측 저장)에 <이름>.bin (nuScenes .pcd.bin 형식) · <이름>.txt (레이더 검출) 로 같이 저장한다.", "lidar": [ {"name": "LIDAR_TOP", "pos": [0.94, 0.0, 1.84], "rpy_deg": [0, 0, 0], "channels": 32, "vfov_deg": [-30.67, 10.67], "h_res_deg": 0.33, "range_m": 70.0, "noise_m": 0.02, "hz": 20} ], "radar": [ {"name": "RADAR_FRONT", "pos": [3.41, 0.0, 0.50], "rpy_deg": [0, 0, 0]}, {"name": "RADAR_FRONT_LEFT", "pos": [2.42, 0.80, 0.78], "rpy_deg": [0, 0, 90]}, {"name": "RADAR_FRONT_RIGHT", "pos": [2.41, -0.80, 0.78], "rpy_deg": [0, 0, -90]}, {"name": "RADAR_BACK_LEFT", "pos": [-0.56, 0.63, 0.53], "rpy_deg": [0, 0, 150]}, {"name": "RADAR_BACK_RIGHT", "pos": [-0.56, -0.62, 0.53], "rpy_deg": [0, 0, -150]} ] }, "collision": { "curb": true, "obstacle_tol_m": 0.1, "curb_tol_m": 0.15, "graze_samples": 2 }, "passes": { "_doc": "렌더 그래프(configs/render_graph.json) 패스 켜기·끄기 덮어쓰기. F2 창에서도 바꿀 수 있다", "fxaa": {"enabled": true} }, "shader_graphs": { "_doc": "셰이더 그래프(configs/shader_graphs/*.json)별 켜기와 매개변수 덮어쓰기 — 이름은 <노드>.<매개변수> (빌드 디렉터리 shaders/<그래프>.params.json 참고)", "camera_isp": {"enabled": false, "params": {}} }, "objects": { "_doc": "장면 객체(차량 에셋) 용량. 정렬·스플랫 버퍼가 배경 + max_gaussians 만큼 잡힌다 (--objects 를 줄 때만)", "max_gaussians": 1500000, "max_instances": 4096 }, "tools": { "_doc": "외부 도구 경로. 비우면 빌드 디렉터리 기본값 (build/tracy-profiler/tracy-profiler — scripts/build_tracy.sh)" }, "output": { "_doc": "PNG 저장 (오프스크린·--record·스크린샷). png_compression = zlib 수준 0~9 (stb 기본 8 은 장당 약 200 ms — Tracy 로 측정), png_writers = 백그라운드 인코딩 스레드, png_filter = 행 필터 고정 (-1 = 행마다 5종 시험, 느림)", "png_compression": 1, "png_writers": 8, "png_filter": 1 }, "ui": { "front_cams": false, "bev_pip": false, "bev_pip_height_m": 40, "_pip_strip": "전방 카메라 3대(V) · BEV(N) 미리보기는 화면 위쪽 한 줄에 같은 크기 칸으로 들어간다. 칸 높이 최대 = 화면 높이 × 이 값", "pip_strip_height_frac": 0.22, "render_graph": false }, "camera_modes": { "_doc": "뷰어 '카메라' 모드 (F3 · 날씨 패널): RGB / 깊이 / 시맨틱 / 흑백 (src/vkgs/shaders/camera_mode.comp). 깊이 = 표면 거리를 로그 눈금 turbo 색으로 (가까움 빨강, depth_max_m 넘으면 검정). 시맨틱 = 가우시안 라벨 색 — 모델 옆 semantic.rgba 가 있어야 한다 (nusim recon semantic, 없으면 검정). semantic = 클래스 색 파일 (이 파일 기준 경로)", "depth_max_m": 80, "semantic": "semantic.json" }, "ego": { "_doc": "자차 glTF (scripts/normalize_vehicle_gltf.py 또는 split_wheels_gltf.py 로 정리한 것, assets/gltf/README.md)와 실제 길이. 없으면 3DGS 에셋.", "gltf": "assets/gltf/GenesisGV80.glb", "length_m": 4.945, "fallback_3dgs_asset": "outputs/assets/ego_car.ply" } }