기준 실행 환경: Windows PC 1대, 웹캠 2대
# 저장소 클론
git clone https://github.com/37g55555/Unity-HandTracking.git
cd Unity-HandTracking
# Conda 가상환경 생성
conda env create -f environment.yml
conda activate artifact
Unity-HandTracking
├─ UnityProject
│ ├─ Assets
│ │ ├─ Scenes
│ │ │ ├─ Main.unity
│ │ │ └─ hologramOut.unity
│ │ └─ Scripts
│ ├─ Packages
│ └─ ProjectSettings
├─ python
│ ├─ ShadowMesh.py
│ ├─ MediaPipeTracking.py
│ └─ MediaPipe.task
├─ sf3d
│ ├─ app.py
│ ├─ sf3d
│ ├─ texture_baker
│ └─ uv_unwrapper
└─ output
├─ shadowmesh
├─ sf3d
└─ recordings
output\sf3d, output\recordings 폴더는 실행 시 자동으로 생성된다.
Unity Hub에서 UnityProject 폴더를 프로젝트로 연다.
SF3D와 ControlNet 모델은 sf3d/app.py 실행 중 Hugging Face/diffusers를 통해 로드된다.
필요한 모델 접근 권한이나 Hugging Face 로그인이 필요한 경우, 먼저 해당 가상환경에서 인증을 마쳐야 한다.
conda activate artifact로 가상환경을 활성화UnityProject/Assets/Scenes/Main.unity를 열기| Script | 역할 |
|---|---|
GameStateManager.cs | 파이프라인 상태 관리 및 상태 변경 로그 출력. |
PipelineManager.cs | 전체 전시 파이프라인 제어. SF3D 서버 실행, ShadowMesh 실행, MediaPipe 실행, Enter 입력 기반 SF3D 요청을 담당. |
ObjParser.cs | ShadowMesh OBJ 파일을 Unity Mesh로 파싱. |
ShadowMeshFileLoader.cs | output/shadowmesh/shadow_mesh.obj와 shadow_metadata.json를 감지해 Unity 메쉬로 불러옴. |
ShadowMeshRootController.cs | ShadowMesh 루트 오브젝트의 기본 transform 제어를 담당. |
ShadowMeshDeformer.cs | 그림자 메쉬 표시, 변형, 실루엣 PNG 추출을 담당. |
ShadowMeshDeformationSlider.cs | 그림자 변형 반경을 조절하는 슬라이더 UI. |
MediaPipeUdpReceiver.cs | Python MediaPipe 스크립트가 보내는 UDP 손 좌표를 수신. |
MediaPipeMeshDeformationInput.cs | MediaPipe 손 좌표를 그림자 메쉬 변형 입력으로 변환. |
MediaPipeInteractionVisualizer.cs | 손 입력, hover, grab 상태를 시각화. |
SF3DGenerationClient.cs | SF3D FastAPI 서버에 texture/model 생성 요청을 보내고 GLB 결과를 저장. |
HologramDisplayManager.cs | 홀로그램 출력 씬에서 표시 관련 제어를 담당. |
HologramModelRecorder.cs | 생성된 GLB를 불러오고 회전/녹화 출력을 담당. |
| Script | 역할 |
|---|---|
python/ShadowMesh.py | 웹캠으로 배경/그림자를 캡처해 2D shadow mesh를 생성. |
python/MediaPipeTracking.py | 웹캠 손 추적 결과를 UDP로 Unity에 전송. |
sf3d/app.py | FastAPI 서버. ControlNet 기반 texture 생성과 SF3D 기반 GLB 생성을 담당. |
현재 기본 경로는 아래 로컬 경로를 기준으로 한다.
D:\Unity-HandTracking
다른 PC나 다른 폴더에서 실행할 경우 아래 경로 값을 실제 설치 경로에 맞게 수정해야 한다.
PipelineManager| Field | 값 | 설명 |
|---|---|---|
pythonExecutablePath | D:\anaconda3\envs\artifact\python.exe | Python 실행 파일 경로 |
sf3dWorkingDirectory | D:\Unity-HandTracking\sf3d | SF3D 서버 실행 위치 |
captureWorkingDirectory | D:\Unity-HandTracking | ShadowMesh 실행 기준 경로 |
handTrackingWorkingDirectory | D:\Unity-HandTracking | MediaPipe 실행 기준 경로 |
captureArguments를 아래처럼 바꾸면 웹캠 캡처 없이 기존 shadow mesh 파일을 사용한다.
--mode file
ShadowMeshFileLoader| Field | 현재 값 | 설명 |
|---|---|---|
absoluteWatchDirectoryOverride | D:\Unity-HandTracking\output\shadowmesh | ShadowMesh 결과 파일을 읽는 폴더 |
HologramModelRecorder| Field | 현재 값 | 설명 |
|---|---|---|
inputDirectory | D:/Unity-HandTracking/output/sf3d | 불러올 GLB 폴더 |
outputDirectory | D:/Unity-HandTracking/output/recordings | 녹화 결과 저장 폴더 |
상태는 GameStateManager.PipelineState에서 관리한다.
| Initial State | 위치 | 입력 키 | 동작 | Target State |
|---|---|---|---|---|
Idle | ShadowMesh 웹캠 창 | Enter | 배경 캡처 | ShadowCapturing |
ShadowCapturing | ShadowMesh 웹캠 창 | Enter | 그림자 캡처 | MediaPipeTracking |
MediaPipeTracking | Unity Main 씬 | Enter | 그림자 메쉬 변형을 종료하고 메쉬 추출 | MeshExtracting |
MeshExtracting | Unity Main 씬 | - | 변형된 그림자 PNG 추출 | Reconstructing3D |
Reconstructing3D | Unity Main 씬 | - | SF3D 3D 재구성 진행 | HologramOutput |
HologramOutput | Unity hologramOut 씬 | - | GLB 생성 완료 및 홀로그램 출력 | Idle |
위치:
output\shadowmesh
| 파일 | 설명 |
|---|---|
shadow_contour.png | 추출된 그림자 윤곽 확인용 이미지 (실사용 X) |
shadow_mesh.obj | Unity가 불러오는 2D 그림자 메쉬 |
shadow_metadata.json | boundary index, scale, center offset 등 메쉬 보정 정보 |
위치:
output\sf3d
| 파일 | 설명 |
|---|---|
deformed_shadow.png | Unity에서 추출한 변형 그림자 실루엣 |
last_texture.png | ControlNet으로 생성된 texture preview |
shadow_asteroid_*.glb | SF3D로 생성된 3D 모델 |
위치:
output\recordings
| 파일 | 설명 |
|---|---|
n.mp4 | 홀로그램 영상 |
captureArguments의 --camera 0handTrackingArguments의 --camera 1예:
captureArguments: --mode live --camera 1
handTrackingArguments: --camera 0
conda activate artifact가 되어 있는지 확인한다.output\sf3d 폴더가 생성되는지 확인한다.SF3DGenerationClient 경고를 확인한다.아래 파일과 폴더는 실행 중 생성되는 산출물이므로 git에 올리지 않도록 한다.
UnityProject/Library/
UnityProject/Temp/
UnityProject/Logs/
UnityProject/UserSettings/
UnityProject/obj/
UnityProject/.vs/
UnityProject/.vsconfig
UnityProject/*.csproj
UnityProject/*.sln
output/sf3d/
output/recordings/
__pycache__/
*.pyc
Unity 프로젝트를 열면 .csproj, .sln, Library, Temp 등은 다시 생성됨
3 commits
Python
45.4%
C#
28.7%
C++
19.0%
Objective-C++
3.0%
Cuda
2.7%
Metal
1.4%
기준 실행 환경: Windows PC 1대, 웹캠 2대
# 저장소 클론
git clone https://github.com/37g55555/Unity-HandTracking.git
cd Unity-HandTracking
# Conda 가상환경 생성
conda env create -f environment.yml
conda activate artifact
Unity-HandTracking
├─ UnityProject
│ ├─ Assets
│ │ ├─ Scenes
│ │ │ ├─ Main.unity
│ │ │ └─ hologramOut.unity
│ │ └─ Scripts
│ ├─ Packages
│ └─ ProjectSettings
├─ python
│ ├─ ShadowMesh.py
│ ├─ MediaPipeTracking.py
│ └─ MediaPipe.task
├─ sf3d
│ ├─ app.py
│ ├─ sf3d
│ ├─ texture_baker
│ └─ uv_unwrapper
└─ output
├─ shadowmesh
├─ sf3d
└─ recordings
output\sf3d, output\recordings 폴더는 실행 시 자동으로 생성된다.
Unity Hub에서 UnityProject 폴더를 프로젝트로 연다.
SF3D와 ControlNet 모델은 sf3d/app.py 실행 중 Hugging Face/diffusers를 통해 로드된다.
필요한 모델 접근 권한이나 Hugging Face 로그인이 필요한 경우, 먼저 해당 가상환경에서 인증을 마쳐야 한다.
conda activate artifact로 가상환경을 활성화UnityProject/Assets/Scenes/Main.unity를 열기| Script | 역할 |
|---|---|
GameStateManager.cs | 파이프라인 상태 관리 및 상태 변경 로그 출력. |
PipelineManager.cs | 전체 전시 파이프라인 제어. SF3D 서버 실행, ShadowMesh 실행, MediaPipe 실행, Enter 입력 기반 SF3D 요청을 담당. |
ObjParser.cs | ShadowMesh OBJ 파일을 Unity Mesh로 파싱. |
ShadowMeshFileLoader.cs | output/shadowmesh/shadow_mesh.obj와 shadow_metadata.json를 감지해 Unity 메쉬로 불러옴. |
ShadowMeshRootController.cs | ShadowMesh 루트 오브젝트의 기본 transform 제어를 담당. |
ShadowMeshDeformer.cs | 그림자 메쉬 표시, 변형, 실루엣 PNG 추출을 담당. |
ShadowMeshDeformationSlider.cs | 그림자 변형 반경을 조절하는 슬라이더 UI. |
MediaPipeUdpReceiver.cs | Python MediaPipe 스크립트가 보내는 UDP 손 좌표를 수신. |
MediaPipeMeshDeformationInput.cs | MediaPipe 손 좌표를 그림자 메쉬 변형 입력으로 변환. |
MediaPipeInteractionVisualizer.cs | 손 입력, hover, grab 상태를 시각화. |
SF3DGenerationClient.cs | SF3D FastAPI 서버에 texture/model 생성 요청을 보내고 GLB 결과를 저장. |
HologramDisplayManager.cs | 홀로그램 출력 씬에서 표시 관련 제어를 담당. |
HologramModelRecorder.cs | 생성된 GLB를 불러오고 회전/녹화 출력을 담당. |
| Script | 역할 |
|---|---|
python/ShadowMesh.py | 웹캠으로 배경/그림자를 캡처해 2D shadow mesh를 생성. |
python/MediaPipeTracking.py | 웹캠 손 추적 결과를 UDP로 Unity에 전송. |
sf3d/app.py | FastAPI 서버. ControlNet 기반 texture 생성과 SF3D 기반 GLB 생성을 담당. |
현재 기본 경로는 아래 로컬 경로를 기준으로 한다.
D:\Unity-HandTracking
다른 PC나 다른 폴더에서 실행할 경우 아래 경로 값을 실제 설치 경로에 맞게 수정해야 한다.
PipelineManager| Field | 값 | 설명 |
|---|---|---|
pythonExecutablePath | D:\anaconda3\envs\artifact\python.exe | Python 실행 파일 경로 |
sf3dWorkingDirectory | D:\Unity-HandTracking\sf3d | SF3D 서버 실행 위치 |
captureWorkingDirectory | D:\Unity-HandTracking | ShadowMesh 실행 기준 경로 |
handTrackingWorkingDirectory | D:\Unity-HandTracking | MediaPipe 실행 기준 경로 |
captureArguments를 아래처럼 바꾸면 웹캠 캡처 없이 기존 shadow mesh 파일을 사용한다.
--mode file
ShadowMeshFileLoader| Field | 현재 값 | 설명 |
|---|---|---|
absoluteWatchDirectoryOverride | D:\Unity-HandTracking\output\shadowmesh | ShadowMesh 결과 파일을 읽는 폴더 |
HologramModelRecorder| Field | 현재 값 | 설명 |
|---|---|---|
inputDirectory | D:/Unity-HandTracking/output/sf3d | 불러올 GLB 폴더 |
outputDirectory | D:/Unity-HandTracking/output/recordings | 녹화 결과 저장 폴더 |
상태는 GameStateManager.PipelineState에서 관리한다.
| Initial State | 위치 | 입력 키 | 동작 | Target State |
|---|---|---|---|---|
Idle | ShadowMesh 웹캠 창 | Enter | 배경 캡처 | ShadowCapturing |
ShadowCapturing | ShadowMesh 웹캠 창 | Enter | 그림자 캡처 | MediaPipeTracking |
MediaPipeTracking | Unity Main 씬 | Enter | 그림자 메쉬 변형을 종료하고 메쉬 추출 | MeshExtracting |
MeshExtracting | Unity Main 씬 | - | 변형된 그림자 PNG 추출 | Reconstructing3D |
Reconstructing3D | Unity Main 씬 | - | SF3D 3D 재구성 진행 | HologramOutput |
HologramOutput | Unity hologramOut 씬 | - | GLB 생성 완료 및 홀로그램 출력 | Idle |
위치:
output\shadowmesh
| 파일 | 설명 |
|---|---|
shadow_contour.png | 추출된 그림자 윤곽 확인용 이미지 (실사용 X) |
shadow_mesh.obj | Unity가 불러오는 2D 그림자 메쉬 |
shadow_metadata.json | boundary index, scale, center offset 등 메쉬 보정 정보 |
위치:
output\sf3d
| 파일 | 설명 |
|---|---|
deformed_shadow.png | Unity에서 추출한 변형 그림자 실루엣 |
last_texture.png | ControlNet으로 생성된 texture preview |
shadow_asteroid_*.glb | SF3D로 생성된 3D 모델 |
위치:
output\recordings
| 파일 | 설명 |
|---|---|
n.mp4 | 홀로그램 영상 |
captureArguments의 --camera 0handTrackingArguments의 --camera 1예:
captureArguments: --mode live --camera 1
handTrackingArguments: --camera 0
conda activate artifact가 되어 있는지 확인한다.output\sf3d 폴더가 생성되는지 확인한다.SF3DGenerationClient 경고를 확인한다.아래 파일과 폴더는 실행 중 생성되는 산출물이므로 git에 올리지 않도록 한다.
UnityProject/Library/
UnityProject/Temp/
UnityProject/Logs/
UnityProject/UserSettings/
UnityProject/obj/
UnityProject/.vs/
UnityProject/.vsconfig
UnityProject/*.csproj
UnityProject/*.sln
output/sf3d/
output/recordings/
__pycache__/
*.pyc
Unity 프로젝트를 열면 .csproj, .sln, Library, Temp 등은 다시 생성됨
3 commits
Python
45.4%
C#
28.7%
C++
19.0%
Objective-C++
3.0%
Cuda
2.7%
Metal
1.4%