GhostBody / GhostHand — 설치본 (2026-11-01)

사용
1. VaM에서 CustomUnityAsset를 생성합니다.
2. Presets에서 Feel/Preset_GhostBody 또는 Feel/Preset_GhostHand를 불러옵니다.
3. 바디와 손은 각각 별도의 CustomUnityAsset 및 플러그인으로 사용합니다.
4. About 외에는 설명·상태·중복 제목 텍스트 필드를 표시하지 않습니다.
5. Body와 Hand의 About은 공통 FeelUtil.ShowAbout을 사용합니다. 오른쪽 안내 및 Go To Support 버튼은 About 탭에서만 표시합니다.

플러그인 직접 지정
- Custom/Scripts/Feel/GhostBody.cslist
- Custom/Scripts/Feel/GhostHand.cslist
개별 .cs 대신 위 .cslist를 선택하면 필요한 보조 코드가 함께 로드됩니다.

에셋
- Custom/Assets/Item/ghostbody_fullmask.assetbundle
  prefab: assets/ghostbodyhipv3/ghostbody.prefab
- Custom/Assets/Item/ghosthand_fullmask.assetbundle
  prefab: assets/ghosthand/ghosthand.prefab

폴더
- GhostBody*.cs: 바디 코드
- ghosthand/: 손 코드
- ../common/FeelUtil.cs: FeelWork의 공유 공통 코드. ShowAbout은 About 탭 등록용 세 번째 콜백 인자를 지원하며 기존 1~2인자 호출도 유지합니다.

Position
- Target Atom / Target Part를 선택하고 Target Tracking으로 1회 정렬합니다.
- 일반 객체: Root. [CameraRig]: CenterEye.
- 바디 Person 타겟 7개: Head, Mouth, Vagina, Anus, rNipple, lNipple, Chest.
- 손 Person 타겟 17개: 위 7개와 neck, pelvis, lThigh, rThigh, lKnee, rKnee, rHand, lHand, rCollar, lCollar. 무릎은 lShin/rShin 본의 관절 위치를 따릅니다.
- Body Angle Lock OFF에서는 Genitalia Rotation으로 정한 각도를 Body Depth 재정렬 시에도 유지합니다. Lock 전환 시 배치 기준도 즉시 갱신되어 전체 바디가 의도치 않게 반대 회전하지 않습니다.
- Body Y pos는 선택한 타겟의 로컬 Y축으로 이동합니다. 타겟의 기울기를 따르며 Body Rotation과 독립적으로 적용합니다. 일반 객체·CameraRig·Person 타겟에 공통 적용됩니다.
- 깊이/회전/Y 보정, On Load Tracking, SavePosition/LoadPosition을 사용합니다.

바디
- 2026-11-02: GlassBody의 몸통 54개 + 다리 20개 구조를 GhostBody 외형에 맞춰 이식했습니다. 기존 동적 체인 6개를 포함해 총 80개(이전 718개)입니다. 메시·관절 연결은 유지합니다.
- IsLegCollider는 다리 20개를 제어합니다. 콜라이더는 뼈에 직접 연결되며 기존 548개 혼합 스킨 위치 갱신은 새 번들에서 사용하지 않습니다.
- Collide Visible Only는 구체·캡슐의 표면 샘플을 사용합니다. 내부에 묻힌 큰 충돌체는 제한된 거리의 인접 표면으로 연결합니다. 큰 충돌체 한 개가 마스크 경계를 걸치면 일부 투명 영역까지 충돌이 이어질 수 있습니다.
- Shape Firmness 범위 0.05~0.25, 기본 0.15.
- 알파 마스크 ON: 앞쪽 표면 마스크와 허리/다리 그라데이션. 카메라 방향 페이드는 제거되어 있습니다.
- 알파 마스크 OFF: 모든 영역 마스크 해제. Body Alpha는 전체 투명도입니다.

손
- Hand Collision 하나로 손가락과 손바닥의 충돌을 함께 켜고 끕니다. Finger Collision / Palm Collision 개별 설정은 제거했습니다.
- 손 Position > Position X/Y/Z: 타겟의 로컬 축 기준 거리(m), 기본 범위 -0.5~0.5. 0/0/0은 손바닥 중심을 타겟 위치에 놓습니다.
- 손 Position > Rotation X/Y/Z: 타겟 기준 회전(각 -180~180도). 위치 보정 방향은 이 회전값과 독립적입니다.
- Current Position Save: 선택한 타겟 기준으로 현재 손의 수동 위치·회전을 계산해 Position/Rotation XYZ에 반영합니다. Lock을 끄고 손을 배치한 뒤 누릅니다. 손을 이동시키지 않으며, 이후 Lock을 켜면 저장한 간격·각도로 추적합니다. 기존 SavePosition/LoadPosition 북마크와 별개입니다.
- Lock (Follow Target): 켜면 선택한 타겟의 이동·회전을 계속 따라갑니다. 끄면 추적을 중단합니다. 기본 OFF이며 씬·프리셋에 저장합니다. 로딩·VaM Freeze Physics 중에는 연속 추적을 쉬고 타겟이 없어지면 현재 위치를 유지합니다.
- Target Tracking은 1회 정렬, On Load Tracking은 로드 후 1회 정렬입니다. Lock은 이 설정과 독립적으로 계속 추적합니다.
- 기존 Hand Rotation / Hand Depth / Hand Y pos는 이전 배치를 보존하는 XYZ 좌표로 자동 변환됩니다. 손 길이·스케일과 이전 글로벌 Y 보정을 반영합니다.
- LoadPosition은 저장한 월드 위치·회전을 복원하고 Lock을 끕니다. SavePosition은 현재 월드 위치를 기록합니다.
- Pose > Hand Side: Right / Left. 메쉬, 뼈대, 회전축, 콜라이더를 함께 반전합니다.
- Curl: -0.4~1. Finger Spread: -1~1. 전체 및 개별 손가락 제어.
- Thumb Curl: 엄지 중간·끝마디의 비틀림을 제거한 굽힘. 0은 펼침, 1은 말아 쥠, 음수는 뒤로 젖힘입니다. 범위는 -0.4~1입니다.
- Pose > Thumb Lift: 0은 내린 위치, 1은 말린 엄지 전체를 접힌 검지 쪽으로 들어 올린 위치입니다. Thumb Curl과 독립적으로 조절하며 씬·프리셋에 저장합니다. 왼손도 같은 의미로 동작합니다.
- Pose > Thumb Spread: -1은 검지 쪽으로 모으기, 0은 기존 위치, +1은 바깥쪽으로 벌리기입니다. Thumb Lift와 90도인 회전축으로 엄지 뿌리부터 전체를 손바닥 면 안에서 회전합니다(±45도). Curl의 마디 굽힘은 유지하며 왼손도 같은 의미입니다. 값은 씬·프리셋에 저장됩니다.
- Thumb Lift는 이전 Thumb Up / Down을 대체합니다. 회전축이 달라졌으므로 이전 값은 새 슬라이더로 옮기지 않으며 새 값은 0에서 시작합니다.
- Full Open / Full Close / Relaxed Hand의 UI 버튼은 제거되어 있습니다.
- 손 전체와 손가락 마디의 물리 반응, 손가락별 1열 구형 콜라이더 및 알파 기반 충돌 제어. 구체 총 55개(엄지 9, 검지 7, 중지 8, 약지 8, 소지 7, 손바닥 16).
- 구형 콜라이더의 중심은 손가락 중심선을 따라 한 줄로 이어지며, 반지름은 위치별 메쉬 두께에 맞춥니다. 손바닥은 손목에서 각 손가락 뿌리로 이어지는 4열(16개)입니다. 각 구체는 뼈에 고정됩니다. 기존 충돌체는 복제본에서 제거하고 코드 Reload로 반영합니다.
- Reaction > Return Strength: 0.1~100, 기본 25. 기존 0.1~4의 반응은 유지하며, 4 초과에서는 버티는 힘의 상한과 감쇠도 함께 증가합니다.
- Reaction Damping: 0.1~10. 높일수록 흔들림을 억제합니다. 단단한 손은 Strength 20 / Damping 2부터 조절합니다.
- 완전 고정: Physical Reaction OFF. 손 위치와 손가락 포즈는 고정되며 Hand Collision 설정은 계속 적용됩니다.
- Max Displacement / Max Rotation은 손 전체의 이동·회전 제한이며 손가락의 유연성 제한은 아닙니다.
- 손바닥과 손등에서 표시하며 Ghost Fade OFF는 모든 손목 마스크를 해제합니다.

변경 적용
- 코드 변경: 해당 플러그인 Reload.
- 에셋번들 교체: 이미 VaM에 로드된 경우 VaM을 완전히 종료한 뒤 다시 실행합니다.

제작 기반
- Feel.GlassBody / Feel.common.ObjectPositionSaver를 참고한 GhostBody/GhostHand 확장.
- 손 기본 메쉬: Innerscene / MakeHuman (CC0). 리그, 뼈대 기준 구형 콜라이더 및 고스트 제어는 작업본에 맞게 구성.

- 2026-11-02 로드 복원 수정: 로딩 중 물리로 변형된 뼈 자세를 기준값으로 저장하지 않고, 메시 bind pose를 Genitalia_Base 기준으로 복원한 뒤 관절을 연결합니다. 크기 변경 및 저장값 복원 후 FixedJoint를 다시 연결합니다. 6개 체인/물성 범위/80개 콜라이더는 유지합니다. 스크립트 Reload로 적용하며 번들 교체는 필요 없습니다.
