37g55555/Shadow-to-3D-Generator

1

stars

3

commits

Python

primary language

Jun 25, 2026

updated

README

Setup

기준 실행 환경: 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

Project Structure

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 프로젝트 열기

Unity Hub에서 UnityProject 폴더를 프로젝트로 연다.

모델 파일 확인

SF3D와 ControlNet 모델은 sf3d/app.py 실행 중 Hugging Face/diffusers를 통해 로드된다. 필요한 모델 접근 권한이나 Hugging Face 로그인이 필요한 경우, 먼저 해당 가상환경에서 인증을 마쳐야 한다.

Execution Flow

  1. 웹캠 2대를 PC에 연결
  2. conda activate artifact로 가상환경을 활성화
  3. Unity에서 UnityProject/Assets/Scenes/Main.unity를 열기
  4. Inspector 경로가 현재 PC 경로와 맞는지 확인
  5. Unity Play를 실행

Scripts Overview

Unity Scripts

Script역할
GameStateManager.cs파이프라인 상태 관리 및 상태 변경 로그 출력.
PipelineManager.cs전체 전시 파이프라인 제어. SF3D 서버 실행, ShadowMesh 실행, MediaPipe 실행, Enter 입력 기반 SF3D 요청을 담당.
ObjParser.csShadowMesh OBJ 파일을 Unity Mesh로 파싱.
ShadowMeshFileLoader.csoutput/shadowmesh/shadow_mesh.objshadow_metadata.json를 감지해 Unity 메쉬로 불러옴.
ShadowMeshRootController.csShadowMesh 루트 오브젝트의 기본 transform 제어를 담당.
ShadowMeshDeformer.cs그림자 메쉬 표시, 변형, 실루엣 PNG 추출을 담당.
ShadowMeshDeformationSlider.cs그림자 변형 반경을 조절하는 슬라이더 UI.
MediaPipeUdpReceiver.csPython MediaPipe 스크립트가 보내는 UDP 손 좌표를 수신.
MediaPipeMeshDeformationInput.csMediaPipe 손 좌표를 그림자 메쉬 변형 입력으로 변환.
MediaPipeInteractionVisualizer.cs손 입력, hover, grab 상태를 시각화.
SF3DGenerationClient.csSF3D FastAPI 서버에 texture/model 생성 요청을 보내고 GLB 결과를 저장.
HologramDisplayManager.cs홀로그램 출력 씬에서 표시 관련 제어를 담당.
HologramModelRecorder.cs생성된 GLB를 불러오고 회전/녹화 출력을 담당.

Python Scripts

Script역할
python/ShadowMesh.py웹캠으로 배경/그림자를 캡처해 2D shadow mesh를 생성.
python/MediaPipeTracking.py웹캠 손 추적 결과를 UDP로 Unity에 전송.
sf3d/app.pyFastAPI 서버. ControlNet 기반 texture 생성과 SF3D 기반 GLB 생성을 담당.

Unity Inspector Settings

현재 기본 경로는 아래 로컬 경로를 기준으로 한다.

D:\Unity-HandTracking

다른 PC나 다른 폴더에서 실행할 경우 아래 경로 값을 실제 설치 경로에 맞게 수정해야 한다.

Main.unity

PipelineManager

Field설명
pythonExecutablePathD:\anaconda3\envs\artifact\python.exePython 실행 파일 경로
sf3dWorkingDirectoryD:\Unity-HandTracking\sf3dSF3D 서버 실행 위치
captureWorkingDirectoryD:\Unity-HandTrackingShadowMesh 실행 기준 경로
handTrackingWorkingDirectoryD:\Unity-HandTrackingMediaPipe 실행 기준 경로

captureArguments를 아래처럼 바꾸면 웹캠 캡처 없이 기존 shadow mesh 파일을 사용한다.

--mode file

ShadowMeshFileLoader

Field현재 값설명
absoluteWatchDirectoryOverrideD:\Unity-HandTracking\output\shadowmeshShadowMesh 결과 파일을 읽는 폴더

hologramOut.unity

HologramModelRecorder

Field현재 값설명
inputDirectoryD:/Unity-HandTracking/output/sf3d불러올 GLB 폴더
outputDirectoryD:/Unity-HandTracking/output/recordings녹화 결과 저장 폴더

Pipeline States

상태는 GameStateManager.PipelineState에서 관리한다.

Initial State위치입력 키동작Target State
IdleShadowMesh 웹캠 창Enter배경 캡처ShadowCapturing
ShadowCapturingShadowMesh 웹캠 창Enter그림자 캡처MediaPipeTracking
MediaPipeTrackingUnity Main 씬Enter그림자 메쉬 변형을 종료하고 메쉬 추출MeshExtracting
MeshExtractingUnity Main 씬-변형된 그림자 PNG 추출Reconstructing3D
Reconstructing3DUnity Main 씬-SF3D 3D 재구성 진행HologramOutput
HologramOutputUnity hologramOut 씬-GLB 생성 완료 및 홀로그램 출력Idle

Outputs

ShadowMesh 출력

위치:

output\shadowmesh
파일설명
shadow_contour.png추출된 그림자 윤곽 확인용 이미지 (실사용 X)
shadow_mesh.objUnity가 불러오는 2D 그림자 메쉬
shadow_metadata.jsonboundary index, scale, center offset 등 메쉬 보정 정보

SF3D 출력

위치:

output\sf3d
파일설명
deformed_shadow.pngUnity에서 추출한 변형 그림자 실루엣
last_texture.pngControlNet으로 생성된 texture preview
shadow_asteroid_*.glbSF3D로 생성된 3D 모델

Hologram Recording 출력

위치:

output\recordings
파일설명
n.mp4홀로그램 영상

Troubleshooting

웹캠이 열리지 않을 때

  • 웹캠 2대가 모두 연결되어 있는지 확인한다.
  • 다른 프로그램이 웹캠을 사용 중인지 확인한다.
  • ShadowMesh용 카메라 번호: captureArguments--camera 0
  • MediaPipe용 카메라 번호: handTrackingArguments--camera 1
  • 두 카메라가 반대로 잡히면 두 값을 서로 바꾼다.

예:

captureArguments: --mode live --camera 1
handTrackingArguments: --camera 0

SF3D 서버가 안 켜질 때

  • conda activate artifact가 되어 있는지 확인한다.
  • Hugging Face 모델 접근 권한이 필요한 경우 해당 환경에서 먼저 로그인한다.

GLB가 안 생성될 때

  • output\sf3d 폴더가 생성되는지 확인한다.
  • SF3D 서버 콘솔에서 texture/model generation 오류가 없는지 확인한다.
  • Unity Console에서 SF3DGenerationClient 경고를 확인한다.

Git Ignore / Generated Files

아래 파일과 폴더는 실행 중 생성되는 산출물이므로 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 등은 다시 생성됨

Contributors

37g55555

3 commits

37g55555/Shadow-to-3D-Generator

1

stars

3

commits

Python

primary language

Jun 25, 2026

updated

README

Setup

기준 실행 환경: 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

Project Structure

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 프로젝트 열기

Unity Hub에서 UnityProject 폴더를 프로젝트로 연다.

모델 파일 확인

SF3D와 ControlNet 모델은 sf3d/app.py 실행 중 Hugging Face/diffusers를 통해 로드된다. 필요한 모델 접근 권한이나 Hugging Face 로그인이 필요한 경우, 먼저 해당 가상환경에서 인증을 마쳐야 한다.

Execution Flow

  1. 웹캠 2대를 PC에 연결
  2. conda activate artifact로 가상환경을 활성화
  3. Unity에서 UnityProject/Assets/Scenes/Main.unity를 열기
  4. Inspector 경로가 현재 PC 경로와 맞는지 확인
  5. Unity Play를 실행

Scripts Overview

Unity Scripts

Script역할
GameStateManager.cs파이프라인 상태 관리 및 상태 변경 로그 출력.
PipelineManager.cs전체 전시 파이프라인 제어. SF3D 서버 실행, ShadowMesh 실행, MediaPipe 실행, Enter 입력 기반 SF3D 요청을 담당.
ObjParser.csShadowMesh OBJ 파일을 Unity Mesh로 파싱.
ShadowMeshFileLoader.csoutput/shadowmesh/shadow_mesh.objshadow_metadata.json를 감지해 Unity 메쉬로 불러옴.
ShadowMeshRootController.csShadowMesh 루트 오브젝트의 기본 transform 제어를 담당.
ShadowMeshDeformer.cs그림자 메쉬 표시, 변형, 실루엣 PNG 추출을 담당.
ShadowMeshDeformationSlider.cs그림자 변형 반경을 조절하는 슬라이더 UI.
MediaPipeUdpReceiver.csPython MediaPipe 스크립트가 보내는 UDP 손 좌표를 수신.
MediaPipeMeshDeformationInput.csMediaPipe 손 좌표를 그림자 메쉬 변형 입력으로 변환.
MediaPipeInteractionVisualizer.cs손 입력, hover, grab 상태를 시각화.
SF3DGenerationClient.csSF3D FastAPI 서버에 texture/model 생성 요청을 보내고 GLB 결과를 저장.
HologramDisplayManager.cs홀로그램 출력 씬에서 표시 관련 제어를 담당.
HologramModelRecorder.cs생성된 GLB를 불러오고 회전/녹화 출력을 담당.

Python Scripts

Script역할
python/ShadowMesh.py웹캠으로 배경/그림자를 캡처해 2D shadow mesh를 생성.
python/MediaPipeTracking.py웹캠 손 추적 결과를 UDP로 Unity에 전송.
sf3d/app.pyFastAPI 서버. ControlNet 기반 texture 생성과 SF3D 기반 GLB 생성을 담당.

Unity Inspector Settings

현재 기본 경로는 아래 로컬 경로를 기준으로 한다.

D:\Unity-HandTracking

다른 PC나 다른 폴더에서 실행할 경우 아래 경로 값을 실제 설치 경로에 맞게 수정해야 한다.

Main.unity

PipelineManager

Field설명
pythonExecutablePathD:\anaconda3\envs\artifact\python.exePython 실행 파일 경로
sf3dWorkingDirectoryD:\Unity-HandTracking\sf3dSF3D 서버 실행 위치
captureWorkingDirectoryD:\Unity-HandTrackingShadowMesh 실행 기준 경로
handTrackingWorkingDirectoryD:\Unity-HandTrackingMediaPipe 실행 기준 경로

captureArguments를 아래처럼 바꾸면 웹캠 캡처 없이 기존 shadow mesh 파일을 사용한다.

--mode file

ShadowMeshFileLoader

Field현재 값설명
absoluteWatchDirectoryOverrideD:\Unity-HandTracking\output\shadowmeshShadowMesh 결과 파일을 읽는 폴더

hologramOut.unity

HologramModelRecorder

Field현재 값설명
inputDirectoryD:/Unity-HandTracking/output/sf3d불러올 GLB 폴더
outputDirectoryD:/Unity-HandTracking/output/recordings녹화 결과 저장 폴더

Pipeline States

상태는 GameStateManager.PipelineState에서 관리한다.

Initial State위치입력 키동작Target State
IdleShadowMesh 웹캠 창Enter배경 캡처ShadowCapturing
ShadowCapturingShadowMesh 웹캠 창Enter그림자 캡처MediaPipeTracking
MediaPipeTrackingUnity Main 씬Enter그림자 메쉬 변형을 종료하고 메쉬 추출MeshExtracting
MeshExtractingUnity Main 씬-변형된 그림자 PNG 추출Reconstructing3D
Reconstructing3DUnity Main 씬-SF3D 3D 재구성 진행HologramOutput
HologramOutputUnity hologramOut 씬-GLB 생성 완료 및 홀로그램 출력Idle

Outputs

ShadowMesh 출력

위치:

output\shadowmesh
파일설명
shadow_contour.png추출된 그림자 윤곽 확인용 이미지 (실사용 X)
shadow_mesh.objUnity가 불러오는 2D 그림자 메쉬
shadow_metadata.jsonboundary index, scale, center offset 등 메쉬 보정 정보

SF3D 출력

위치:

output\sf3d
파일설명
deformed_shadow.pngUnity에서 추출한 변형 그림자 실루엣
last_texture.pngControlNet으로 생성된 texture preview
shadow_asteroid_*.glbSF3D로 생성된 3D 모델

Hologram Recording 출력

위치:

output\recordings
파일설명
n.mp4홀로그램 영상

Troubleshooting

웹캠이 열리지 않을 때

  • 웹캠 2대가 모두 연결되어 있는지 확인한다.
  • 다른 프로그램이 웹캠을 사용 중인지 확인한다.
  • ShadowMesh용 카메라 번호: captureArguments--camera 0
  • MediaPipe용 카메라 번호: handTrackingArguments--camera 1
  • 두 카메라가 반대로 잡히면 두 값을 서로 바꾼다.

예:

captureArguments: --mode live --camera 1
handTrackingArguments: --camera 0

SF3D 서버가 안 켜질 때

  • conda activate artifact가 되어 있는지 확인한다.
  • Hugging Face 모델 접근 권한이 필요한 경우 해당 환경에서 먼저 로그인한다.

GLB가 안 생성될 때

  • output\sf3d 폴더가 생성되는지 확인한다.
  • SF3D 서버 콘솔에서 texture/model generation 오류가 없는지 확인한다.
  • Unity Console에서 SF3DGenerationClient 경고를 확인한다.

Git Ignore / Generated Files

아래 파일과 폴더는 실행 중 생성되는 산출물이므로 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 등은 다시 생성됨

Contributors

37g55555

3 commits

Languages

Python

45.4%

C#

28.7%

C++

19.0%

Objective-C++

3.0%

Cuda

2.7%

Metal

1.4%