Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
브라우저에서 바로 즐기는 3D 카트 레이싱. 헬멧 액션캠 1인칭 시점, 실제 카트 물리, 서버 없는 P2P 온라인 대전.
Translation pending
GamesJavaScript · CSSGitHub @jeiel85OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
🏁 브라우저 3D 카트 레이싱 — 헬멧 액션캠 1인칭, 솔리드 액슬·후륜 브레이크 카트 물리, 서버 없는 WebRTC P2P 온라인 대전 (three.js, 에셋 100% 절차 생성)
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
액션캠으로 찍은 카트 주행을 그대로 옮겨 온 브라우저 3D 카트 레이싱 헬멧 액션캠 1인칭 시점 · 실제 렌탈 카트에 가까운 물리 · 서버 없는 P2P 온라인 대전 해 질 녘 놀이공원 옆 야외 카트장 Lumen Park의 코스 5개. 헬멧에 단 액션캠 시점으로 운전대와 장갑 낀 손을 내려다보며, 광각 렌즈 왜곡과 가장자리 모션 블러 속에서 AI나 친구와 3랩 레이스를 합니다. 설치도 회원가입도 없이 링크만 열면 됩니다. 🎥 액션캠 룩 • 헬멧 마운트 카메라: 횡G에 따라 고개가 기울고 코너 안쪽을 바라보며, 달리는 속도에 따라 노면·연석·충돌 진동이 전달됩니다(정지 중에는 흔들림 없음, 설정의 카메라 흔들림으로 조절·끄기) • 후처리 렌즈 셰이더: 배럴(어안) 왜곡, 속도에 비례하는 방사형 모션 블러(중앙은 선명), 가장자리 색수차, 비네트, 필름 그레인 • 2단 IK로 운전대를 따라 움직이는 팔과 장갑, 거울처럼 뒤집혀 보이는 앞 번호판까지Read the full README ↗
액션캠으로 찍은 카트 주행을 그대로 옮겨 온 브라우저 3D 카트 레이싱
헬멧 액션캠 1인칭 시점 · 실제 렌탈 카트에 가까운 물리 · 서버 없는 P2P 온라인 대전
해 질 녘 놀이공원 옆 야외 카트장 Lumen Park의 코스 8개. 헬멧에 단 액션캠 시점으로 운전대와 장갑 낀 손을 내려다보며, 광각 렌즈 왜곡과 가장자리 모션 블러 속에서 AI나 친구와 3랩 레이스를 합니다. 설치도 회원가입도 없이 링크만 열면 됩니다.
| 헬멧 액션캠 (1인칭) | 3인칭 체이스 | 3인칭 원거리 |
|---|---|---|
| 비 – 헬멧 액션캠 | 비 – 체이스 캠 | 코스·날씨 선택 |
|---|---|---|
🎥 액션캠 룩
🏎️ 카트다운 물리 – 게임용으로 단순화했지만 "카트만의 특징"은 살렸습니다
🌧️ 날씨 – 메인 메뉴에서 맑음 / 비 / 흐림 / 안개 / 밤 선택
🌐 서버 없는 온라인 대전
🗺️ 코스 8개 – 메인 메뉴에서 선택. 모두 같은 메인 스트레이트·스타트 게이트에서 출발합니다
| 코스 | 길이 | 성격 | 봇 평균 속도* |
|---|---|---|---|
| 미니 | 325 m | 가장 짧은 한 바퀴, 방향 전환이 빠르게 이어짐 | 50.7 km/h |
| 스프린트 | 471 m | 짧고 빠른 한 바퀴 | 54.2 km/h |
| 하버 | 569 m | 공원 서쪽을 도는 흐르는 듯한 중고속 코스 | 65.6 km/h |
| 오벌 | 694 m | 양끝이 둥근 오벌 – 제동 구간이 적어 평균 속도 최고 | 65.3 km/h |
| 클럽 | 864 m | 원래 코스, 촘촘한 인필드 코너 | 52.6 km/h |
| 테크니컬 | 786 m | S자·방향 전환이 이어지는 가장 느린 코스 | 50.1 km/h |
| GP | 1.03 km | 공원 북쪽·서쪽을 크게 도는 코스 | 55.9 km/h |
| 엔듀로 | 1.15 km | 공원 바깥을 도는 가장 긴 고속 코스 | 62.3 km/h |
* 맑은 날 봇(pace 0.97) 혼자 달린 플라잉 랩 기준 시뮬레이션 값. 온라인 대전은 호스트가 고른 코스로 방 전체가 맞춰집니다.
🧩 모드
🎨 살아 있는 트랙 시설 – 메인 스트레이트를 따라 볼거리
🎨 에셋 파일 0개 – 모든 모델·텍스처·사운드를 코드로 생성합니다
| 동작 | 키보드 | 게임패드 | 터치 |
|---|---|---|---|
| 가속 | W / ↑ | RT (또는 A) | GAS |
| 브레이크 / 정지 후 길게 = 후진 | S / ↓ / Space | LT (또는 X) | BRAKE |
| 조향 | A D / ← → | 왼쪽 스틱 | 화면 왼쪽 드래그 |
| 카메라 전환 | C | Y | 🎥 버튼 |
| 트랙 복귀 | R | Back | – |
| 일시정지 | Esc / P | Start | ❚❚ 버튼 |
| 음소거 | M | – | – |
| 키 안내 표시/숨기기 | H / F1 | – | – |
| 가로/세로 전환 | – | – | 🔄 버튼 |
레이스를 시작하면 출발 신호 동안 화면 아래에 지금 쓰는 입력 장치(키보드·게임패드·터치)에 맞는 키 안내가 뜨고, 출발 5초 뒤 사라집니다. 일시정지 메뉴의 조작법에서도 볼 수 있습니다.
카트가 너무 예민하게 느껴지면 설정의 조향 감도를 1.0 아래로 낮추세요 – 키보드로도 차분하게 라인을 잡을 수 있습니다. 코너 출발에서 뒷바퀴가 헛도는 느낌이 든다면 쉬움 난이도의 트랙션 컨트롤이 스로틀을 자동으로 줄여 줍니다.
휴대폰의 그래픽 품질은 기본이 자동입니다. '낮음'에서 시작해, 레이스 중 해상도를 낮추지 않고 20초 넘게 57fps 이상을 유지하면 다음 실행부터 한 단계 올리고, 버거우면 한 단계 내립니다(설정에서 직접 고르면 자동 조정이 꺼집니다).
휴대폰은 가로·세로 모두 지원합니다. 기본으로는 기기 방향을 따르고, 주행 중 🔄 버튼이나 설정의 화면 방향으로 가로/세로를 고정할 수 있습니다. 브라우저는 전체 화면에서만 방향 고정을 허용하므로 고정하면 전체 화면으로 바뀌고, 다음 레이스를 시작할 때 고정 방향을 다시 적용합니다(안드로이드 Chrome). iOS Safari처럼 고정을 지원하지 않는 브라우저에서는 기기를 직접 돌리면 화면 배치가 따라 바뀝니다.
화면 언어는 한국어와 영어를 지원합니다. 브라우저 언어를 따라 시작하고, 메인 메뉴의 English / 한국어 버튼(또는 ?lang=ko|en)으로 바꿀 수 있습니다.
웹 앱(PWA) 설치를 지원합니다. 메인 메뉴의 앱 설치 버튼이나 브라우저의 설치 메뉴(iOS Safari는 공유 → 홈 화면에 추가)로 설치하면 전체 화면 앱으로 실행되고, 퀵 레이스·타임 트라이얼은 오프라인에서도 플레이할 수 있습니다.
itch.io처럼 다른 사이트의 iframe 안에서 실행되면, 그 iframe 주소는 공유할 수 없으므로 초대 링크를 웹 버전(GitHub Pages) 주소로 만듭니다. 두 버전은 같은 방에서 함께 달릴 수 있습니다.
npm install
npm run dev # http://localhost:5173
npm test # 코스 8개 기하 · 물리 · AI 완주 · 랩 카운트 · 날씨(빗길 그립·신규 3종) · 어시스트(트랙션 컨트롤) · 네트워크 검증 · 설정 검증 · 번역 키 테스트
npm run smoke # 렌더 레이어 스모크 테스트 – 코스 8개 × 품질 2종 씬 빌드 + 날씨 5종 + 야간 룩 (Node, GPU 불요)
npm run build # dist/ 정적 파일 – 아무 정적 호스팅에 올리면 끝
npm run pack:itch # 빌드 후 itch.io 업로드용 release/dusk-kart-itch.zip 생성 (docs/itch/ 참고)
엄격한 NAT(회사망·일부 모바일망)에서는 WebRTC 직접 연결이 실패할 수 있습니다. 로비의 연결 상태 패널에서 릴레이 연결 수, 피어별 연결 상태·지연, 최근 오류를 볼 수 있고, 직접 연결이 실패하면 패널이 자동으로 열립니다. 상대가 같은 방에 있는데도 보이지 않으면 로비의 다시 연결로 방에 다시 들어갈 수 있고, 릴레이가 연결된 채 30초 넘게 혼자이면 자동으로 다시 들어갑니다(방마다 최대 2회). 이때는 빌드 시 TURN 서버를 지정하세요(기본값은 미설정 – TURN 서버는 운영 비용이 드는 중계라 기본 제공하지 않습니다).
VITE_TURN_URLS=turn:turn.example.com:3478 VITE_TURN_USERNAME=user VITE_TURN_CREDENTIAL=pass npm run build
src/
├─ sim/ # three.js 비의존 순수 시뮬레이션 (Node에서 테스트)
│ ├─ track.js # 코스 8개 정의, 스플라인 트랙, 투영, 노면·날씨 그립, 최소 곡률 레이싱 라인
│ ├─ kart.js # 카트 동역학, 배리어·카트 충돌
│ ├─ ai.js # 퓨어 퍼슛 + 속도 프로파일 봇
│ └─ race.js # 랩/순위 집계, 그리드
├─ render/ # three.js 장면: 트랙·놀이공원·하늘, 날씨(비·젖은 노면), 카트+드라이버 IK, 카메라, 렌즈 후처리, 스키드 마크
├─ net.js # Trystero P2P 세션, 시계 동기화, 스냅샷 보간 (온라인 진입 시 동적 로드)
├─ netcheck.js # 원격 스냅샷·진행도·완주 기록 타당성 검사 (Node에서 테스트)
├─ settings.js # 저장된 설정값 검증
├─ i18n.js # 한국어·영어 UI 문자열과 언어 선택(?lang=ko|en, 저장된 선택, 브라우저 언어)
├─ ghost.js # 타임 트라이얼 기록·고스트 저장 형식과 검증 (Node에서 테스트)
├─ perf.js # 프레임레이트 기반 동적 해상도
├─ audio.js # WebAudio 합성 엔진음·효과음
├─ input.js # 키보드·게임패드·터치
├─ orientation.js # 휴대폰 가로/세로 고정(전체 화면 + Screen Orientation API)
├─ pwa.js # PWA 서비스 워커 등록 및 설치 버튼/안내 제어 (Node에서 테스트)
└─ main.js # 모드/레이스 진행/UI
MIT – 코드·모델·텍스처·사운드 모두 이 저장소에서 생성됩니다. 런타임 의존성: three.js (MIT), Trystero (MIT).