diff --git a/gui/public/i18n/en-x-owo/translation.ftl b/gui/public/i18n/en-x-owo/translation.ftl index 495023b98..9bd25843c 100644 --- a/gui/public/i18n/en-x-owo/translation.ftl +++ b/gui/public/i18n/en-x-owo/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = weft wontwolew skeleton_bone-NONE = none skeleton_bone-HEAD = hed shyft skeleton_bone-NECK = nyeck wength -skeleton_bone-TORSO = towso wength -skeleton_bone-CHEST = chwest disyance -skeleton_bone-WAIST = weyst disyance +skeleton_bone-CHEST = chwest wength +skeleton_bone-CHEST_OFFSET = chwest awfset +skeleton_bone-WAIST = weyst wength +skeleton_bone-HIP = hip wength skeleton_bone-HIP_OFFSET = hyip awfset skeleton_bone-HIPS_WIDTH = hyips wiwdth -skeleton_bone-LEGS_LENGTH = wegs wength -skeleton_bone-KNEE_HEIGHT = knyee heiyt +skeleton_bone-UPPER_LEG = uppor weg wength +skeleton_bone-LOWER_LEG = lowur weg wength skeleton_bone-FOOT_LENGTH = pawsies wength skeleton_bone-FOOT_SHIFT = pawsies shyft skeleton_bone-SKELETON_OFFSET = skeweton awfset -skeleton_bone-CONTROLLER_DISTANCE_Z = cyontwowla disance z -skeleton_bone-CONTROLLER_DISTANCE_Y = cyontwowla disance y -skeleton_bone-FOREARM_LENGTH = fowewawm disyance skeleton_bone-SHOULDERS_DISTANCE = shouwdews disyance skeleton_bone-SHOULDERS_WIDTH = shouwdews wiwdth -skeleton_bone-UPPER_ARM_LENGTH = uppew awm wength -skeleton_bone-ELBOW_OFFSET = ewbow awfsewt +skeleton_bone-UPPER_ARM = uppew awm wength +skeleton_bone-LOWER_ARM = fowewawm disyance +skeleton_bone-CONTROLLER_Y = cyontwowla disance y +skeleton_bone-CONTROLLER_Z = cyontwowla disance z ## Tracker reset buttons reset-reset_all = weset aww pwopowtions~ diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index a3a449654..551128526 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Left controller skeleton_bone-NONE = None skeleton_bone-HEAD = Head Shift skeleton_bone-NECK = Neck Length -skeleton_bone-TORSO = Torso Length -skeleton_bone-CHEST = Chest Distance -skeleton_bone-WAIST = Waist Distance +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Hip Offset skeleton_bone-HIPS_WIDTH = Hips Width -skeleton_bone-LEGS_LENGTH = Legs Length -skeleton_bone-KNEE_HEIGHT = Knee Height +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Foot Length skeleton_bone-FOOT_SHIFT = Foot Shift skeleton_bone-SKELETON_OFFSET = Skeleton Offset -skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z -skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y -skeleton_bone-FOREARM_LENGTH = Forearm Distance skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance skeleton_bone-SHOULDERS_WIDTH = Shoulders Width -skeleton_bone-UPPER_ARM_LENGTH = Upper Arm Length -skeleton_bone-ELBOW_OFFSET = Elbow Offset +skeleton_bone-UPPER_ARM = Upper Arm Length +skeleton_bone-LOWER_ARM = Lower Arm Length +skeleton_bone-CONTROLLER_Y = Controller Distance Y +skeleton_bone-CONTROLLER_Z = Controller Distance Z ## Tracker reset buttons reset-reset_all = Reset all proportions diff --git a/gui/public/i18n/es-419/translation.ftl b/gui/public/i18n/es-419/translation.ftl index f5fd495d2..9bbe563bc 100644 --- a/gui/public/i18n/es-419/translation.ftl +++ b/gui/public/i18n/es-419/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Control izquierdo skeleton_bone-NONE = Nada skeleton_bone-HEAD = Inclinación de cabeza skeleton_bone-NECK = Largo del cuello -skeleton_bone-TORSO = Largo del torso -skeleton_bone-CHEST = Distancia del pecho -skeleton_bone-WAIST = Distancia de la cintura +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Desplazamiento de la cadera skeleton_bone-HIPS_WIDTH = Ancho de la cadera -skeleton_bone-LEGS_LENGTH = Largo de las piernas -skeleton_bone-KNEE_HEIGHT = Altura de las rodillas +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Largo de pies skeleton_bone-FOOT_SHIFT = Desplazamiento de pies skeleton_bone-SKELETON_OFFSET = Desplazamiento del esqueleto -skeleton_bone-CONTROLLER_DISTANCE_Z = Distancia Z del mando -skeleton_bone-CONTROLLER_DISTANCE_Y = Distancia Y del mando -skeleton_bone-FOREARM_LENGTH = Distancia del antebrazo skeleton_bone-SHOULDERS_DISTANCE = Distancia de los hombros skeleton_bone-SHOULDERS_WIDTH = Ancho de los hombros -skeleton_bone-UPPER_ARM_LENGTH = Largo del brazo superior -skeleton_bone-ELBOW_OFFSET = Desplazamiento del codo +skeleton_bone-UPPER_ARM = Largo del brazo superior +skeleton_bone-LOWER_ARM = Distancia del antebrazo +skeleton_bone-CONTROLLER_Y = Distancia Y del mando +skeleton_bone-CONTROLLER_Z = Distancia Z del mando ## Tracker reset buttons reset-reset_all = Reiniciar todas las proporciones diff --git a/gui/public/i18n/et/translation.ftl b/gui/public/i18n/et/translation.ftl index 881118700..0a0107120 100644 --- a/gui/public/i18n/et/translation.ftl +++ b/gui/public/i18n/et/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Vasak kontroller skeleton_bone-NONE = Mitte midagi skeleton_bone-HEAD = Pea Nihe skeleton_bone-NECK = Kaela Pikkus -skeleton_bone-TORSO = Torso Pikkus -skeleton_bone-CHEST = Rinna Vahemaa -skeleton_bone-WAIST = Vöökoha Vahemaa +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Lengthskeleton_bone-CHEST = Rinna Vahemaa skeleton_bone-HIP_OFFSET = Puusa Nihe skeleton_bone-HIPS_WIDTH = Puusa Laius -skeleton_bone-LEGS_LENGTH = Jalgade Pikkus -skeleton_bone-KNEE_HEIGHT = Põlve Kõrgus +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Jala Pikkus skeleton_bone-FOOT_SHIFT = Jala Nihe skeleton_bone-SKELETON_OFFSET = Skeletti Nihe -skeleton_bone-CONTROLLER_DISTANCE_Z = Kontrolleri Kaugus Z -skeleton_bone-CONTROLLER_DISTANCE_Y = Kontrolleri Kaugus Y -skeleton_bone-FOREARM_LENGTH = Käsivarre Kaugus skeleton_bone-SHOULDERS_DISTANCE = Õlgade Kaugus skeleton_bone-SHOULDERS_WIDTH = Õlgade Laius -skeleton_bone-UPPER_ARM_LENGTH = Õlavarre Pikkus -skeleton_bone-ELBOW_OFFSET = Küünarnuki Nihe +skeleton_bone-UPPER_ARM = Õlavarre Pikkus +skeleton_bone-LOWER_ARM = Käsivarre Kaugus +skeleton_bone-CONTROLLER_Y = Kontrolleri Kaugus Y +skeleton_bone-CONTROLLER_Z = Kontrolleri Kaugus Z ## Tracker reset buttons reset-reset_all = Lähtesta kõik proportsioonid diff --git a/gui/public/i18n/fr/translation.ftl b/gui/public/i18n/fr/translation.ftl index bf62d4729..1edcc6f01 100644 --- a/gui/public/i18n/fr/translation.ftl +++ b/gui/public/i18n/fr/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Left controller skeleton_bone-NONE = Aucun skeleton_bone-HEAD = Décalage de la tête skeleton_bone-NECK = Longueur du cou -skeleton_bone-TORSO = Longueur du torse -skeleton_bone-CHEST = Distance de la poitrine -skeleton_bone-WAIST = Distance de la taille +skeleton_bone-CHEST = Longueur de la poitrine +skeleton_bone-CHEST_OFFSET = Écart de la poitrine +skeleton_bone-WAIST = Longueur de la taille +skeleton_bone-HIP = Longueur des hanches skeleton_bone-HIP_OFFSET = Écart de la hanche skeleton_bone-HIPS_WIDTH = Largeur des hanches -skeleton_bone-LEGS_LENGTH = Longueur des jambes -skeleton_bone-KNEE_HEIGHT = Hauteur des genoux +skeleton_bone-UPPER_LEG = Longueur des jambes supérieures +skeleton_bone-LOWER_LEG = Longueur des jambes inférieures skeleton_bone-FOOT_LENGTH = Longueur des pieds skeleton_bone-FOOT_SHIFT = Décalage des pieds skeleton_bone-SKELETON_OFFSET = Écart du squelette -skeleton_bone-CONTROLLER_DISTANCE_Z = Distance Z des contrôleurs -skeleton_bone-CONTROLLER_DISTANCE_Y = Distance Y des contrôleurs -skeleton_bone-FOREARM_LENGTH = Longueur des avant-bras skeleton_bone-SHOULDERS_DISTANCE = Distance des épaules skeleton_bone-SHOULDERS_WIDTH = Largeur des épaules -skeleton_bone-UPPER_ARM_LENGTH = Longueur des bras supérieurs -skeleton_bone-ELBOW_OFFSET = Écart des coudes +skeleton_bone-UPPER_ARM = Longueur des bras supérieurs +skeleton_bone-LOWER_ARM = Longueur des avant-bras +skeleton_bone-CONTROLLER_Y = Distance Y des contrôleurs +skeleton_bone-CONTROLLER_Z = Distance Z des contrôleurs ## Tracker reset buttons reset-reset_all = Réinitialiser toutes les proportions diff --git a/gui/public/i18n/it/translation.ftl b/gui/public/i18n/it/translation.ftl index 8194b954e..aaefb552c 100644 --- a/gui/public/i18n/it/translation.ftl +++ b/gui/public/i18n/it/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Left controller skeleton_bone-NONE = Non assegnato skeleton_bone-HEAD = Correzione Testa skeleton_bone-NECK = Lunghezza Collo -skeleton_bone-TORSO = Torso Lunghezza -skeleton_bone-CHEST = Distanza Petto -skeleton_bone-WAIST = Distanza Girovita +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Correzione Fianchi skeleton_bone-HIPS_WIDTH = Larghezza Fianchi -skeleton_bone-LEGS_LENGTH = Lunghezza Gambe -skeleton_bone-KNEE_HEIGHT = Altezza Ginocchia +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Lunghezza Piedi skeleton_bone-FOOT_SHIFT = Correzione Piedi skeleton_bone-SKELETON_OFFSET = Compensazione scheletro -skeleton_bone-CONTROLLER_DISTANCE_Z = Distanza Z Controller -skeleton_bone-CONTROLLER_DISTANCE_Y = Distanza Y Controller -skeleton_bone-FOREARM_LENGTH = Distanza Avambracci skeleton_bone-SHOULDERS_DISTANCE = Distanza Spalle skeleton_bone-SHOULDERS_WIDTH = Larghezza Spalle -skeleton_bone-UPPER_ARM_LENGTH = Lunghezza Braccia -skeleton_bone-ELBOW_OFFSET = Correzione Gomito +skeleton_bone-UPPER_ARM = Lunghezza Braccia +skeleton_bone-LOWER_ARM = Distanza Avambracci +skeleton_bone-CONTROLLER_Y = Distanza Y Controller +skeleton_bone-CONTROLLER_Z = Distanza Z Controller ## Tracker reset buttons reset-reset_all = Ripristina tutte le proporzioni diff --git a/gui/public/i18n/ja/translation.ftl b/gui/public/i18n/ja/translation.ftl index ebefd06ef..e67a66dea 100644 --- a/gui/public/i18n/ja/translation.ftl +++ b/gui/public/i18n/ja/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = 左コントローラ skeleton_bone-NONE = 無し skeleton_bone-HEAD = ヘッドシフト skeleton_bone-NECK = 首長さ -skeleton_bone-TORSO = 胴長さ -skeleton_bone-CHEST = 胸部の距離 -skeleton_bone-WAIST = 腰部の距離 +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = ヒップオフセット skeleton_bone-HIPS_WIDTH = ヒップ幅 -skeleton_bone-LEGS_LENGTH = 脚長さ -skeleton_bone-KNEE_HEIGHT = 膝高さ +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = 足先長さ skeleton_bone-FOOT_SHIFT = 足先シフト skeleton_bone-SKELETON_OFFSET = スケルトンオフセット -skeleton_bone-CONTROLLER_DISTANCE_Z = コントローラ距離 Z -skeleton_bone-CONTROLLER_DISTANCE_Y = コントローラ距離 Y -skeleton_bone-FOREARM_LENGTH = 前腕長さ skeleton_bone-SHOULDERS_DISTANCE = 肩の距離 skeleton_bone-SHOULDERS_WIDTH = 肩幅 -skeleton_bone-UPPER_ARM_LENGTH = 上腕長さ -skeleton_bone-ELBOW_OFFSET = 肘オフセット +skeleton_bone-UPPER_ARM = 上腕長さ +skeleton_bone-LOWER_ARM = 前腕長さ +skeleton_bone-CONTROLLER_Y = コントローラ距離 Y +skeleton_bone-CONTROLLER_Z = コントローラ距離 Z ## Tracker reset buttons reset-reset_all = すべてのプロポーションをリセット diff --git a/gui/public/i18n/ko/translation.ftl b/gui/public/i18n/ko/translation.ftl index e6d2b3a45..5652b7f40 100644 --- a/gui/public/i18n/ko/translation.ftl +++ b/gui/public/i18n/ko/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Left controller skeleton_bone-NONE = None skeleton_bone-HEAD = 머리 밀림 skeleton_bone-NECK = 목 길이 -skeleton_bone-TORSO = 몸통 길이 -skeleton_bone-CHEST = 가슴 거리 -skeleton_bone-WAIST = 허리 거리 +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = 골반 오프셋 skeleton_bone-HIPS_WIDTH = 골반 너비 -skeleton_bone-LEGS_LENGTH = 다리 길이 -skeleton_bone-KNEE_HEIGHT = 무릎 높이 +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = 발 크기 skeleton_bone-FOOT_SHIFT = 발 밀림 skeleton_bone-SKELETON_OFFSET = 골격 오프셋 -skeleton_bone-CONTROLLER_DISTANCE_Z = 컨트롤러 Z축 거리 -skeleton_bone-CONTROLLER_DISTANCE_Y = 컨트롤러 Y축 거리 -skeleton_bone-FOREARM_LENGTH = 전완 길이 skeleton_bone-SHOULDERS_DISTANCE = 어깨 거리 skeleton_bone-SHOULDERS_WIDTH = 어깨 너비 -skeleton_bone-UPPER_ARM_LENGTH = 위팔 거리 -skeleton_bone-ELBOW_OFFSET = 팔꿈치 오프셋 +skeleton_bone-UPPER_ARM = 위팔 거리 +skeleton_bone-LOWER_ARM = 전완 길이 +skeleton_bone-CONTROLLER_Y = 컨트롤러 Y축 거리 +skeleton_bone-CONTROLLER_Z = 컨트롤러 Z축 거리 ## Tracker reset buttons reset-reset_all = 모든 신체 비율 리셋 diff --git a/gui/public/i18n/pl/translation.ftl b/gui/public/i18n/pl/translation.ftl index 1d8e62c38..bf7f7aff4 100644 --- a/gui/public/i18n/pl/translation.ftl +++ b/gui/public/i18n/pl/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Left controller skeleton_bone-NONE = Brak skeleton_bone-HEAD = Head Shift skeleton_bone-NECK = Długość Szyi -skeleton_bone-TORSO = Długość Tułowia -skeleton_bone-CHEST = Długość Klatki Piersiowej -skeleton_bone-WAIST = Waist Distance +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Offset Bioder skeleton_bone-HIPS_WIDTH = Szerokość Bioder -skeleton_bone-LEGS_LENGTH = Długość Nóg -skeleton_bone-KNEE_HEIGHT = Wysokość Kolana +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Długość Stopy skeleton_bone-FOOT_SHIFT = Foot Shift skeleton_bone-SKELETON_OFFSET = Skeleton Offset -skeleton_bone-CONTROLLER_DISTANCE_Z = Controller Distance Z -skeleton_bone-CONTROLLER_DISTANCE_Y = Controller Distance Y -skeleton_bone-FOREARM_LENGTH = Długość PrzedRamienia skeleton_bone-SHOULDERS_DISTANCE = Shoulders Distance skeleton_bone-SHOULDERS_WIDTH = Szerokość Ramion -skeleton_bone-UPPER_ARM_LENGTH = Długość Bicepsa -skeleton_bone-ELBOW_OFFSET = Offset Łokcia +skeleton_bone-UPPER_ARM = Długość Bicepsa +skeleton_bone-LOWER_ARM = Długość PrzedRamienia +skeleton_bone-CONTROLLER_Z = Controller Distance Z +skeleton_bone-CONTROLLER_Y = Controller Distance Y ## Tracker reset buttons reset-reset_all = Zresetuj wszystkie wymiary diff --git a/gui/public/i18n/pt-BR/translation.ftl b/gui/public/i18n/pt-BR/translation.ftl index c4ef6645b..2df8cd457 100644 --- a/gui/public/i18n/pt-BR/translation.ftl +++ b/gui/public/i18n/pt-BR/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Controle esquerdo skeleton_bone-NONE = Nada skeleton_bone-HEAD = Deslocamento da Cabeça skeleton_bone-NECK = Tamanho do Pescoço -skeleton_bone-TORSO = Tamanho do Torso -skeleton_bone-CHEST = Distância do Peito -skeleton_bone-WAIST = Distância da Cintura +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Compensação do Quadril skeleton_bone-HIPS_WIDTH = Largura do Quadril -skeleton_bone-LEGS_LENGTH = Tamanho das Perna -skeleton_bone-KNEE_HEIGHT = Altura dos Joelhos +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = Tamanho do Pé skeleton_bone-FOOT_SHIFT = Compensação do Pé skeleton_bone-SKELETON_OFFSET = Compensação do Esqueleto -skeleton_bone-CONTROLLER_DISTANCE_Z = Distância do Controle Z -skeleton_bone-CONTROLLER_DISTANCE_Y = Distância do Controle Y -skeleton_bone-FOREARM_LENGTH = Distância do Antebraço skeleton_bone-SHOULDERS_DISTANCE = Distância dos Ombros skeleton_bone-SHOULDERS_WIDTH = Largura dos Ombros -skeleton_bone-UPPER_ARM_LENGTH = Tamanho do Braço Superior -skeleton_bone-ELBOW_OFFSET = Compensação do Cotovelo +skeleton_bone-UPPER_ARM = Tamanho do Braço Superior +skeleton_bone-LOWER_ARM = Distância do Antebraço +skeleton_bone-CONTROLLER_Y = Distância do Controle Y +skeleton_bone-CONTROLLER_Z = Distância do Controle Z ## Tracker reset buttons reset-reset_all = Redefinir todas as proporções diff --git a/gui/public/i18n/vi/translation.ftl b/gui/public/i18n/vi/translation.ftl index cfabfbfe6..98d0f9d21 100644 --- a/gui/public/i18n/vi/translation.ftl +++ b/gui/public/i18n/vi/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = Tay cầm trái skeleton_bone-NONE = Chưa liên kết skeleton_bone-HEAD = Đầu ca skeleton_bone-NECK = Cổ dài -skeleton_bone-TORSO = Chiều dài thân -skeleton_bone-CHEST = Khoảng cách ngực -skeleton_bone-WAIST = Khoảng cách eo +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = Lệc đo hông skeleton_bone-HIPS_WIDTH = Chiều rộng hông -skeleton_bone-LEGS_LENGTH = Chiều dài chân -skeleton_bone-KNEE_HEIGHT = Chiều cao đầu gối +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = CHiều dài bàn chân skeleton_bone-FOOT_SHIFT = Lệch đo bàn chân skeleton_bone-SKELETON_OFFSET = Lệch đo thân -skeleton_bone-CONTROLLER_DISTANCE_Z = Khoảng cách tay cầm Z -skeleton_bone-CONTROLLER_DISTANCE_Y = Khoảng cách tay cầm Y -skeleton_bone-FOREARM_LENGTH = khoảng cách cánh tay skeleton_bone-SHOULDERS_DISTANCE = Khoảng cách vai skeleton_bone-SHOULDERS_WIDTH = Chiều rộng vai -skeleton_bone-UPPER_ARM_LENGTH = Chiều dài tay trên -skeleton_bone-ELBOW_OFFSET = Lệch đo khuỷu tay +skeleton_bone-UPPER_ARM = Chiều dài tay trên +skeleton_bone-LOWER_ARM = khoảng cách cánh tay +skeleton_bone-CONTROLLER_Y = Khoảng cách tay cầm Y +skeleton_bone-CONTROLLER_Z = Khoảng cách tay cầm Z ## Tracker reset buttons reset-reset_all = Reset tất cả bộ phận diff --git a/gui/public/i18n/zh-Hans/translation.ftl b/gui/public/i18n/zh-Hans/translation.ftl index 3842a9ce7..d8b6015b8 100644 --- a/gui/public/i18n/zh-Hans/translation.ftl +++ b/gui/public/i18n/zh-Hans/translation.ftl @@ -41,23 +41,23 @@ body_part-LEFT_CONTROLLER = 左控制器 skeleton_bone-NONE = 无 skeleton_bone-HEAD = 头部偏移 skeleton_bone-NECK = 颈部长度 -skeleton_bone-TORSO = 躯干长度 -skeleton_bone-CHEST = 胸部距离 -skeleton_bone-WAIST = 腰部距离 +skeleton_bone-CHEST = Chest Length +skeleton_bone-CHEST_OFFSET = Chest Offset +skeleton_bone-WAIST = Waist Length +skeleton_bone-HIP = Hip Length skeleton_bone-HIP_OFFSET = 髋部偏移 skeleton_bone-HIPS_WIDTH = 髋部宽度 -skeleton_bone-LEGS_LENGTH = 腿部长度 -skeleton_bone-KNEE_HEIGHT = 膝盖高度 +skeleton_bone-UPPER_LEG = Upper Leg Length +skeleton_bone-LOWER_LEG = Lower Leg Length skeleton_bone-FOOT_LENGTH = 脚部长度 skeleton_bone-FOOT_SHIFT = 脚部偏移 skeleton_bone-SKELETON_OFFSET = 骨骼偏移 -skeleton_bone-CONTROLLER_DISTANCE_Z = 控制器距离 Z -skeleton_bone-CONTROLLER_DISTANCE_Y = 控制器距离 Y -skeleton_bone-FOREARM_LENGTH = 前臂距离 skeleton_bone-SHOULDERS_DISTANCE = 肩膀距离 skeleton_bone-SHOULDERS_WIDTH = 肩膀宽度 -skeleton_bone-UPPER_ARM_LENGTH = 上臂长度 -skeleton_bone-ELBOW_OFFSET = 肘部偏移 +skeleton_bone-UPPER_ARM = 上臂长度 +skeleton_bone-LOWER_ARM = 前臂距离 +skeleton_bone-CONTROLLER_Y = 控制器距离 Y +skeleton_bone-CONTROLLER_Z = 控制器距离 Z ## Tracker reset buttons reset-reset_all = 重置所有比例 diff --git a/gui/src/components/onboarding/pages/body-proportions/autobone-steps/VerifyResults.tsx b/gui/src/components/onboarding/pages/body-proportions/autobone-steps/VerifyResults.tsx index d0f269d8a..d15912747 100644 --- a/gui/src/components/onboarding/pages/body-proportions/autobone-steps/VerifyResults.tsx +++ b/gui/src/components/onboarding/pages/body-proportions/autobone-steps/VerifyResults.tsx @@ -34,7 +34,7 @@ export function VerifyResultsStep({ return ( <> -
+
{l10n.getString( diff --git a/server/src/main/java/dev/slimevr/autobone/AutoBone.java b/server/src/main/java/dev/slimevr/autobone/AutoBone.java index b156be8cb..089dd1dc6 100644 --- a/server/src/main/java/dev/slimevr/autobone/AutoBone.java +++ b/server/src/main/java/dev/slimevr/autobone/AutoBone.java @@ -73,9 +73,11 @@ public class AutoBone { public final FastList legacyHeightConfigs = new FastList<>( new SkeletonConfigOffsets[] { SkeletonConfigOffsets.NECK, - SkeletonConfigOffsets.TORSO, - - SkeletonConfigOffsets.LEGS_LENGTH, + SkeletonConfigOffsets.CHEST, + SkeletonConfigOffsets.WAIST, + SkeletonConfigOffsets.HIP, + SkeletonConfigOffsets.UPPER_LEG, + SkeletonConfigOffsets.LOWER_LEG, } ); @@ -119,17 +121,14 @@ public class AutoBone { case HEAD -> skeletonConfig.getOffset(SkeletonConfigOffsets.HEAD); case NECK -> skeletonConfig.getOffset(SkeletonConfigOffsets.NECK); case CHEST -> skeletonConfig.getOffset(SkeletonConfigOffsets.CHEST); - case WAIST -> -skeletonConfig.getOffset(SkeletonConfigOffsets.CHEST) - + skeletonConfig.getOffset(SkeletonConfigOffsets.TORSO) - - skeletonConfig.getOffset(SkeletonConfigOffsets.WAIST); - case HIP -> skeletonConfig.getOffset(SkeletonConfigOffsets.WAIST); + case WAIST -> skeletonConfig.getOffset(SkeletonConfigOffsets.WAIST); + case HIP -> skeletonConfig.getOffset(SkeletonConfigOffsets.HIP); case LEFT_HIP, RIGHT_HIP -> skeletonConfig.getOffset(SkeletonConfigOffsets.HIPS_WIDTH) / 2f; case LEFT_UPPER_LEG, RIGHT_UPPER_LEG -> skeletonConfig - .getOffset(SkeletonConfigOffsets.LEGS_LENGTH) - - skeletonConfig.getOffset(SkeletonConfigOffsets.KNEE_HEIGHT); + .getOffset(SkeletonConfigOffsets.UPPER_LEG); case LEFT_LOWER_LEG, RIGHT_LOWER_LEG -> skeletonConfig - .getOffset(SkeletonConfigOffsets.KNEE_HEIGHT); + .getOffset(SkeletonConfigOffsets.LOWER_LEG); default -> -1f; }; @@ -236,26 +235,23 @@ public class AutoBone { if (headOffset != null) { configConsumer.accept(SkeletonConfigOffsets.HEAD, headOffset); } - Float neckOffset = offsets.get(BoneType.NECK); if (neckOffset != null) { configConsumer.accept(SkeletonConfigOffsets.NECK, neckOffset); } Float chestOffset = offsets.get(BoneType.CHEST); - Float hipOffset = offsets.get(BoneType.HIP); Float waistOffset = offsets.get(BoneType.WAIST); - if (chestOffset != null && hipOffset != null && waistOffset != null) { - configConsumer - .accept(SkeletonConfigOffsets.TORSO, chestOffset + hipOffset + waistOffset); - } - + Float hipOffset = offsets.get(BoneType.HIP); if (chestOffset != null) { - configConsumer.accept(SkeletonConfigOffsets.CHEST, chestOffset); + configConsumer + .accept(SkeletonConfigOffsets.CHEST, chestOffset); + } + if (waistOffset != null) { + configConsumer.accept(SkeletonConfigOffsets.WAIST, waistOffset); } - if (hipOffset != null) { - configConsumer.accept(SkeletonConfigOffsets.WAIST, hipOffset); + configConsumer.accept(SkeletonConfigOffsets.HIP, hipOffset); } Float hipWidthOffset = offsets.get(BoneType.LEFT_HIP); @@ -275,14 +271,15 @@ public class AutoBone { if (lowerLegOffset == null) { lowerLegOffset = offsets.get(BoneType.RIGHT_LOWER_LEG); } - if (upperLegOffset != null && lowerLegOffset != null) { + + if (upperLegOffset != null) { configConsumer - .accept(SkeletonConfigOffsets.LEGS_LENGTH, upperLegOffset + lowerLegOffset); + .accept(SkeletonConfigOffsets.UPPER_LEG, upperLegOffset); + } + if (lowerLegOffset != null) { + configConsumer.accept(SkeletonConfigOffsets.LOWER_LEG, lowerLegOffset); } - if (lowerLegOffset != null) { - configConsumer.accept(SkeletonConfigOffsets.KNEE_HEIGHT, lowerLegOffset); - } return true; } catch (Exception e) { return false; diff --git a/server/src/main/java/dev/slimevr/autobone/AutoBoneHandler.java b/server/src/main/java/dev/slimevr/autobone/AutoBoneHandler.java index e0a727b13..7540ca605 100644 --- a/server/src/main/java/dev/slimevr/autobone/AutoBoneHandler.java +++ b/server/src/main/java/dev/slimevr/autobone/AutoBoneHandler.java @@ -358,23 +358,28 @@ public class AutoBoneHandler { skeletonConfigBuffer.setOffsets(autoBoneResults.configValues); float neckLength = skeletonConfigBuffer.getOffset(SkeletonConfigOffsets.NECK); - float chestDistance = skeletonConfigBuffer + float chestLength = skeletonConfigBuffer .getOffset(SkeletonConfigOffsets.CHEST); - float torsoLength = skeletonConfigBuffer - .getOffset(SkeletonConfigOffsets.TORSO); + float waistLength = skeletonConfigBuffer + .getOffset(SkeletonConfigOffsets.WAIST); + float hipLength = skeletonConfigBuffer + .getOffset(SkeletonConfigOffsets.HIP); + float torsoLength = chestLength + waistLength + hipLength; float hipWidth = skeletonConfigBuffer .getOffset(SkeletonConfigOffsets.HIPS_WIDTH); - float legsLength = skeletonConfigBuffer - .getOffset(SkeletonConfigOffsets.LEGS_LENGTH); - float kneeHeight = skeletonConfigBuffer - .getOffset(SkeletonConfigOffsets.KNEE_HEIGHT); + float legLength = skeletonConfigBuffer + .getOffset(SkeletonConfigOffsets.UPPER_LEG) + + skeletonConfigBuffer + .getOffset(SkeletonConfigOffsets.LOWER_LEG); + float lowerLegLength = skeletonConfigBuffer + .getOffset(SkeletonConfigOffsets.LOWER_LEG); float neckTorso = neckLength / torsoLength; - float chestTorso = chestDistance / torsoLength; + float chestTorso = chestLength / torsoLength; float torsoWaist = hipWidth / torsoLength; - float legTorso = legsLength / torsoLength; - float legBody = legsLength / (torsoLength + neckLength); - float kneeLeg = kneeHeight / legsLength; + float legTorso = legLength / torsoLength; + float legBody = legLength / (torsoLength + neckLength); + float kneeLeg = lowerLegLength / legLength; LogManager .info( diff --git a/server/src/main/java/dev/slimevr/autobone/errors/BodyProportionError.java b/server/src/main/java/dev/slimevr/autobone/errors/BodyProportionError.java index d9a483d57..593e5e696 100644 --- a/server/src/main/java/dev/slimevr/autobone/errors/BodyProportionError.java +++ b/server/src/main/java/dev/slimevr/autobone/errors/BodyProportionError.java @@ -2,7 +2,6 @@ package dev.slimevr.autobone.errors; import com.jme3.math.FastMath; - import dev.slimevr.autobone.AutoBoneTrainingStep; import dev.slimevr.autobone.errors.proportions.ProportionLimiter; import dev.slimevr.autobone.errors.proportions.RangeProportionLimiter; @@ -18,7 +17,7 @@ public class BodyProportionError implements IAutoBoneError { // The headset height is not the full height! This value compensates for the // offset from the headset height to the user height - public float eyeHeightToHeightRatio = 0.936f; + public static float eyeHeightToHeightRatio = 0.936f; // Default config // Height: 1.58 @@ -37,65 +36,87 @@ public class BodyProportionError implements IAutoBoneError { public static final ProportionLimiter[] proportionLimits = new ProportionLimiter[] { // Head // Experimental: 0.059 - new RangeProportionLimiter(0.059f, config -> { - return config.getOffset(SkeletonConfigOffsets.HEAD); - }, 0.01f), + new RangeProportionLimiter( + 0.059f, + config -> config.getOffset(SkeletonConfigOffsets.HEAD), + 0.01f + ), // Neck // Expected: 0.052 // Experimental: 0.059 - new RangeProportionLimiter(0.054f, config -> { - return config.getOffset(SkeletonConfigOffsets.NECK); - }, 0.0015f), - - // Torso - // Expected: 0.288 (0.333 including hip, this shouldn't be right...) - new RangeProportionLimiter(0.333f, config -> { - return config.getOffset(SkeletonConfigOffsets.TORSO); - }, 0.015f), + new RangeProportionLimiter( + 0.054f, + config -> config.getOffset(SkeletonConfigOffsets.NECK), + 0.0015f + ), // Chest // Experimental: 0.189 - new RangeProportionLimiter(0.189f, config -> { - return config.getOffset(SkeletonConfigOffsets.CHEST); - }, 0.02f), + new RangeProportionLimiter( + 0.189f, + config -> config.getOffset(SkeletonConfigOffsets.CHEST), + 0.02f + ), // Waist // Experimental: 0.118 - new RangeProportionLimiter(0.118f, config -> { - return config.getOffset(SkeletonConfigOffsets.TORSO) - - config.getOffset(SkeletonConfigOffsets.CHEST) - - config.getOffset(SkeletonConfigOffsets.WAIST); - }, 0.05f), + new RangeProportionLimiter( + 0.118f, + config -> config.getOffset(SkeletonConfigOffsets.WAIST), + 0.05f + ), // Hip // Experimental: 0.0237 - new RangeProportionLimiter(0.0237f, config -> { - return config.getOffset(SkeletonConfigOffsets.WAIST); - }, 0.01f), + new RangeProportionLimiter( + 0.0237f, + config -> config.getOffset(SkeletonConfigOffsets.HIP), + 0.01f + ), // Hip Width // Expected: 0.191 // Experimental: 0.154 - new RangeProportionLimiter(0.184f, config -> { - return config.getOffset(SkeletonConfigOffsets.HIPS_WIDTH); - }, 0.04f), + new RangeProportionLimiter( + 0.184f, + config -> config.getOffset(SkeletonConfigOffsets.HIPS_WIDTH), + 0.04f + ), // Upper Leg // Expected: 0.245 - new RangeProportionLimiter(0.245f, config -> { - return config.getOffset(SkeletonConfigOffsets.LEGS_LENGTH) - - config.getOffset(SkeletonConfigOffsets.KNEE_HEIGHT); - }, 0.015f), + new RangeProportionLimiter( + 0.245f, + config -> config.getOffset(SkeletonConfigOffsets.UPPER_LEG), + 0.015f + ), // Lower Leg // Expected: 0.246 (0.285 including below ankle, could use a separate // offset?) - new RangeProportionLimiter(0.285f, config -> { - return config.getOffset(SkeletonConfigOffsets.KNEE_HEIGHT); - }, 0.02f), + new RangeProportionLimiter( + 0.285f, + config -> config.getOffset(SkeletonConfigOffsets.LOWER_LEG), + 0.02f + ), }; + public static ProportionLimiter getProportionLimitForOffset(SkeletonConfigOffsets offset) { + ProportionLimiter result = null; + switch (offset) { + case HEAD -> result = proportionLimits[0]; + case NECK -> result = proportionLimits[1]; + case CHEST -> result = proportionLimits[2]; + case WAIST -> result = proportionLimits[3]; + case HIP -> result = proportionLimits[4]; + case HIPS_WIDTH -> result = proportionLimits[5]; + case UPPER_LEG -> result = proportionLimits[6]; + case LOWER_LEG -> result = proportionLimits[7]; + } + return result; + } + @Override public float getStepError(AutoBoneTrainingStep trainingStep) throws AutoBoneException { return getBodyProportionError( diff --git a/server/src/main/java/dev/slimevr/autobone/errors/proportions/HardProportionLimiter.java b/server/src/main/java/dev/slimevr/autobone/errors/proportions/HardProportionLimiter.java index bd4aa6b4a..57943fe51 100644 --- a/server/src/main/java/dev/slimevr/autobone/errors/proportions/HardProportionLimiter.java +++ b/server/src/main/java/dev/slimevr/autobone/errors/proportions/HardProportionLimiter.java @@ -1,9 +1,9 @@ package dev.slimevr.autobone.errors.proportions; -import java.util.function.Function; - import dev.slimevr.vr.processor.skeleton.SkeletonConfig; +import java.util.function.Function; + public class HardProportionLimiter implements ProportionLimiter { @@ -28,4 +28,9 @@ public class HardProportionLimiter implements ProportionLimiter { float boneLength = boneLengthFunction.apply(config); return targetRatio - (boneLength / height); } + + @Override + public float getTargetRatio() { + return targetRatio; + } } diff --git a/server/src/main/java/dev/slimevr/autobone/errors/proportions/ProportionLimiter.java b/server/src/main/java/dev/slimevr/autobone/errors/proportions/ProportionLimiter.java index 7556ed965..69932552a 100644 --- a/server/src/main/java/dev/slimevr/autobone/errors/proportions/ProportionLimiter.java +++ b/server/src/main/java/dev/slimevr/autobone/errors/proportions/ProportionLimiter.java @@ -5,4 +5,6 @@ import dev.slimevr.vr.processor.skeleton.SkeletonConfig; public interface ProportionLimiter { public float getProportionError(SkeletonConfig config, float height); + + public float getTargetRatio(); } diff --git a/server/src/main/java/dev/slimevr/autobone/errors/proportions/RangeProportionLimiter.java b/server/src/main/java/dev/slimevr/autobone/errors/proportions/RangeProportionLimiter.java index e14d6e7ab..3955c8907 100644 --- a/server/src/main/java/dev/slimevr/autobone/errors/proportions/RangeProportionLimiter.java +++ b/server/src/main/java/dev/slimevr/autobone/errors/proportions/RangeProportionLimiter.java @@ -1,11 +1,10 @@ package dev.slimevr.autobone.errors.proportions; -import java.util.function.Function; - import com.jme3.math.FastMath; - import dev.slimevr.vr.processor.skeleton.SkeletonConfig; +import java.util.function.Function; + public class RangeProportionLimiter extends HardProportionLimiter { @@ -72,4 +71,9 @@ public class RangeProportionLimiter extends HardProportionLimiter { return 0f; } + + @Override + public float getTargetRatio() { + return targetRatio; + } } diff --git a/server/src/main/java/dev/slimevr/config/CurrentVRConfigConverter.java b/server/src/main/java/dev/slimevr/config/CurrentVRConfigConverter.java index f099d6533..e51133c90 100644 --- a/server/src/main/java/dev/slimevr/config/CurrentVRConfigConverter.java +++ b/server/src/main/java/dev/slimevr/config/CurrentVRConfigConverter.java @@ -102,6 +102,42 @@ public class CurrentVRConfigConverter implements VersionedModelConverter { modelData.set("trackers", trackersNode); } } + if (version < 5) { + // Migrate old skeleton offsets to new ones + ObjectNode skeletonNode = (ObjectNode) modelData.get("skeleton"); + if (skeletonNode != null) { + ObjectNode offsetsNode = (ObjectNode) skeletonNode.get("offsets"); + if (offsetsNode != null) { + // torsoLength, chestDistance and waistDistance become + // chestLength, waistLength and hipLength. + float torsoLength = offsetsNode.get("torsoLength").floatValue(); + float chestDistance = offsetsNode.get("chestDistance").floatValue(); + float waistDistance = offsetsNode.get("waistDistance").floatValue(); + offsetsNode.set("chestLength", offsetsNode.get("chestDistance")); + offsetsNode + .set( + "waistLength", + new FloatNode(torsoLength - chestDistance - waistDistance) + ); + offsetsNode.set("hipLength", offsetsNode.get("waistDistance")); + offsetsNode.remove("torsoLength"); + offsetsNode.remove("chestDistance"); + offsetsNode.remove("waistDistance"); + + // legsLength and kneeHeight become + // upperLegLength and lowerLegLength + float legsLength = offsetsNode.get("legsLength").floatValue(); + float kneeHeight = offsetsNode.get("kneeHeight").floatValue(); + offsetsNode.set("upperLegLength", new FloatNode(legsLength - kneeHeight)); + offsetsNode.set("lowerLegLength", offsetsNode.get("kneeHeight")); + offsetsNode.remove("legsLength"); + offsetsNode.remove("kneeHeight"); + + skeletonNode.set("offsets", offsetsNode); + modelData.set("skeleton", skeletonNode); + } + } + } return modelData; } diff --git a/server/src/main/java/dev/slimevr/config/VRConfig.java b/server/src/main/java/dev/slimevr/config/VRConfig.java index 69822ac00..694a23ecd 100644 --- a/server/src/main/java/dev/slimevr/config/VRConfig.java +++ b/server/src/main/java/dev/slimevr/config/VRConfig.java @@ -14,7 +14,7 @@ import java.util.Map; @JsonVersionedModel( - currentVersion = "4", defaultDeserializeToVersion = "4", toCurrentConverterClass = CurrentVRConfigConverter.class + currentVersion = "5", defaultDeserializeToVersion = "5", toCurrentConverterClass = CurrentVRConfigConverter.class ) public class VRConfig { diff --git a/server/src/main/java/dev/slimevr/vr/processor/skeleton/HumanSkeleton.java b/server/src/main/java/dev/slimevr/vr/processor/skeleton/HumanSkeleton.java index 28dfcb19f..f8599bc10 100644 --- a/server/src/main/java/dev/slimevr/vr/processor/skeleton/HumanSkeleton.java +++ b/server/src/main/java/dev/slimevr/vr/processor/skeleton/HumanSkeleton.java @@ -4,6 +4,7 @@ import com.jme3.math.FastMath; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import dev.slimevr.VRServer; +import dev.slimevr.autobone.errors.BodyProportionError; import dev.slimevr.util.ann.VRServerThread; import dev.slimevr.vr.processor.ComputedHumanPoseTracker; import dev.slimevr.vr.processor.ComputedHumanPoseTrackerPosition; @@ -78,7 +79,6 @@ public class HumanSkeleton extends Skeleton implements SkeletonConfigCallback { protected boolean hasRightArmTracker; static final Quaternion FORWARD_QUATERNION = new Quaternion() .fromAngles(FastMath.HALF_PI, 0, 0); - static final float FLOOR_OFFSET = 0.05f; // #region Tracker Input protected Tracker hmdTracker; protected Tracker neckTracker; @@ -245,7 +245,7 @@ public class HumanSkeleton extends Skeleton implements SkeletonConfigCallback { // #region Attach tracker nodes for tracker offsets neckNode.attachChild(trackerHeadNode); - chestNode.attachChild(trackerChestNode); + neckNode.attachChild(trackerChestNode); hipNode.attachChild(trackerWaistNode); leftKneeNode.attachChild(trackerLeftKneeNode); @@ -1135,13 +1135,17 @@ public class HumanSkeleton extends Skeleton implements SkeletonConfigCallback { .getFirstAvailableTracker(leftLowerArmTracker, leftUpperArmTracker) .getRotation(rotBuf1); leftElbowNode.localTransform.setRotation(rotBuf1); + } else { + neckNode.localTransform.getRotation(rotBuf1); + leftShoulderTailNode.localTransform.setRotation(rotBuf1); + trackerLeftElbowNode.localTransform.setRotation(rotBuf1); + leftElbowNode.localTransform.setRotation(rotBuf1); } - if (leftHandTracker != null) { + if (leftHandTracker != null) leftHandTracker.getRotation(rotBuf1); - leftWristNode.localTransform.setRotation(rotBuf1); - leftHandNode.localTransform.setRotation(rotBuf1); - trackerLeftHandNode.localTransform.setRotation(rotBuf1); - } + leftWristNode.localTransform.setRotation(rotBuf1); + leftHandNode.localTransform.setRotation(rotBuf1); + trackerLeftHandNode.localTransform.setRotation(rotBuf1); } // Right arm @@ -1184,13 +1188,17 @@ public class HumanSkeleton extends Skeleton implements SkeletonConfigCallback { .getFirstAvailableTracker(rightLowerArmTracker, rightUpperArmTracker) .getRotation(rotBuf1); rightElbowNode.localTransform.setRotation(rotBuf1); + } else { + neckNode.localTransform.getRotation(rotBuf1); + rightShoulderTailNode.localTransform.setRotation(rotBuf1); + trackerRightElbowNode.localTransform.setRotation(rotBuf1); + rightElbowNode.localTransform.setRotation(rotBuf1); } - if (rightHandTracker != null) { + if (rightHandTracker != null) rightHandTracker.getRotation(rotBuf1); - rightWristNode.localTransform.setRotation(rotBuf1); - rightHandNode.localTransform.setRotation(rotBuf1); - trackerRightHandNode.localTransform.setRotation(rotBuf1); - } + rightWristNode.localTransform.setRotation(rotBuf1); + rightHandNode.localTransform.setRotation(rotBuf1); + trackerRightHandNode.localTransform.setRotation(rotBuf1); } } @@ -1655,81 +1663,25 @@ public class HumanSkeleton extends Skeleton implements SkeletonConfigCallback { return; } - Vector3f vec; - float height; switch (config) { - case HEAD -> skeletonConfig.setOffset(SkeletonConfigOffsets.HEAD, null); - case NECK -> skeletonConfig.setOffset(SkeletonConfigOffsets.NECK, null); - case TORSO -> { // Distance from shoulders to hip (full torso - // length) - vec = new Vector3f(); + case CHEST, WAIST, HIP, UPPER_LEG, LOWER_LEG -> { + Vector3f vec = new Vector3f(); hmdTracker.getPosition(vec); - height = vec.y; + float height = vec.y / BodyProportionError.eyeHeightToHeightRatio; if (height > 0.5f) { // Reset only if floor level seems right, skeletonConfig .setOffset( - SkeletonConfigOffsets.TORSO, - ((height) * 0.42f) - - skeletonConfig.getOffset(SkeletonConfigOffsets.NECK) - ); - } else// if floor level is incorrect - { - skeletonConfig.setOffset(SkeletonConfigOffsets.TORSO, null); - } - } - case CHEST -> // Chest is 57% of the upper body by default - // (shoulders to chest) - skeletonConfig - .setOffset( - SkeletonConfigOffsets.CHEST, - skeletonConfig.getOffset(SkeletonConfigOffsets.TORSO) * 0.57f - ); - case WAIST -> // Waist length is from hip to waist - skeletonConfig.setOffset(SkeletonConfigOffsets.WAIST, null); - case HIP_OFFSET -> skeletonConfig.setOffset(SkeletonConfigOffsets.HIP_OFFSET, null); - case HIPS_WIDTH -> skeletonConfig.setOffset(SkeletonConfigOffsets.HIPS_WIDTH, null); - case FOOT_LENGTH -> skeletonConfig.setOffset(SkeletonConfigOffsets.FOOT_LENGTH, null); - case FOOT_SHIFT -> skeletonConfig.setOffset(SkeletonConfigOffsets.FOOT_SHIFT, null); - case SKELETON_OFFSET -> skeletonConfig - .setOffset(SkeletonConfigOffsets.SKELETON_OFFSET, null); - case LEGS_LENGTH -> { // Set legs length to be 5cm above floor level - vec = new Vector3f(); - hmdTracker.getPosition(vec); - height = vec.y; - if (height > 0.5f) { // Reset only if floor level seems right, - skeletonConfig - .setOffset( - SkeletonConfigOffsets.LEGS_LENGTH, + config, height - - skeletonConfig.getOffset(SkeletonConfigOffsets.NECK) - - skeletonConfig.getOffset(SkeletonConfigOffsets.TORSO) - - FLOOR_OFFSET + * BodyProportionError + .getProportionLimitForOffset(config) + .getTargetRatio() ); - } else // if floor level is incorrect - { - skeletonConfig.setOffset(SkeletonConfigOffsets.LEGS_LENGTH, null); + } else { // if floor level is incorrect + skeletonConfig.setOffset(config, null); } - resetSkeletonConfig(SkeletonConfigOffsets.KNEE_HEIGHT); } - case KNEE_HEIGHT -> // Knees are at 55% of the legs by default - skeletonConfig - .setOffset( - SkeletonConfigOffsets.KNEE_HEIGHT, - skeletonConfig.getOffset(SkeletonConfigOffsets.LEGS_LENGTH) * 0.55f - ); - case CONTROLLER_DISTANCE_Z -> skeletonConfig - .setOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Z, null); - case CONTROLLER_DISTANCE_Y -> skeletonConfig - .setOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Y, null); - case LOWER_ARM_LENGTH -> skeletonConfig - .setOffset(SkeletonConfigOffsets.LOWER_ARM_LENGTH, null); - case ELBOW_OFFSET -> skeletonConfig.setOffset(SkeletonConfigOffsets.ELBOW_OFFSET, null); - case SHOULDERS_DISTANCE -> skeletonConfig - .setOffset(SkeletonConfigOffsets.SHOULDERS_DISTANCE, null); - case SHOULDERS_WIDTH -> skeletonConfig - .setOffset(SkeletonConfigOffsets.SHOULDERS_WIDTH, null); - case UPPER_ARM_LENGTH -> skeletonConfig - .setOffset(SkeletonConfigOffsets.UPPER_ARM_LENGTH, null); + default -> skeletonConfig.setOffset(config, null); } } diff --git a/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfig.java b/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfig.java index 0bfc456e2..bbe792e7a 100644 --- a/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfig.java +++ b/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfig.java @@ -130,8 +130,11 @@ public class SkeletonConfig { // Re-calculate user height userHeight = getOffset(SkeletonConfigOffsets.NECK) - + getOffset(SkeletonConfigOffsets.TORSO) - + getOffset(SkeletonConfigOffsets.LEGS_LENGTH); + + getOffset(SkeletonConfigOffsets.CHEST) + + getOffset(SkeletonConfigOffsets.WAIST) + + getOffset(SkeletonConfigOffsets.HIP) + + getOffset(SkeletonConfigOffsets.UPPER_LEG) + + getOffset(SkeletonConfigOffsets.LOWER_LEG); } public void setOffset(SkeletonConfigOffsets config, Float newValue) { @@ -236,18 +239,12 @@ public class SkeletonConfig { case CHEST_TRACKER -> setNodeOffset( nodeOffset, 0, - 0, + getOffset(SkeletonConfigOffsets.CHEST_OFFSET) + - getOffset(SkeletonConfigOffsets.CHEST), -getOffset(SkeletonConfigOffsets.SKELETON_OFFSET) ); - case WAIST -> setNodeOffset( - nodeOffset, - 0, - (getOffset(SkeletonConfigOffsets.CHEST) - - getOffset(SkeletonConfigOffsets.TORSO) - + getOffset(SkeletonConfigOffsets.WAIST)), - 0 - ); - case HIP -> setNodeOffset(nodeOffset, 0, -getOffset(SkeletonConfigOffsets.WAIST), 0); + case WAIST -> setNodeOffset(nodeOffset, 0, -getOffset(SkeletonConfigOffsets.WAIST), 0); + case HIP -> setNodeOffset(nodeOffset, 0, -getOffset(SkeletonConfigOffsets.HIP), 0); case HIP_TRACKER -> setNodeOffset( nodeOffset, 0, @@ -269,8 +266,7 @@ public class SkeletonConfig { case LEFT_UPPER_LEG, RIGHT_UPPER_LEG -> setNodeOffset( nodeOffset, 0, - -(getOffset(SkeletonConfigOffsets.LEGS_LENGTH) - - getOffset(SkeletonConfigOffsets.KNEE_HEIGHT)), + -getOffset(SkeletonConfigOffsets.UPPER_LEG), 0 ); case LEFT_KNEE_TRACKER, RIGHT_KNEE_TRACKER -> setNodeOffset( @@ -282,7 +278,7 @@ public class SkeletonConfig { case LEFT_LOWER_LEG, RIGHT_LOWER_LEG -> setNodeOffset( nodeOffset, 0, - -getOffset(SkeletonConfigOffsets.KNEE_HEIGHT), + -getOffset(SkeletonConfigOffsets.LOWER_LEG), -getOffset(SkeletonConfigOffsets.FOOT_SHIFT) ); case LEFT_FOOT, RIGHT_FOOT -> setNodeOffset( @@ -297,36 +293,6 @@ public class SkeletonConfig { 0, -getOffset(SkeletonConfigOffsets.SKELETON_OFFSET) ); - case LEFT_CONTROLLER, RIGHT_CONTROLLER -> setNodeOffset( - nodeOffset, - 0, - getOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Y), - getOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Z) - ); - case LEFT_HAND, RIGHT_HAND -> setNodeOffset( - nodeOffset, - 0, - -getOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Y), - -getOffset(SkeletonConfigOffsets.CONTROLLER_DISTANCE_Z) - ); - case LEFT_LOWER_ARM, RIGHT_LOWER_ARM -> setNodeOffset( - nodeOffset, - 0, - getOffset(SkeletonConfigOffsets.LOWER_ARM_LENGTH), - 0 - ); - case LEFT_ELBOW_TRACKER, RIGHT_ELBOW_TRACKER -> setNodeOffset( - nodeOffset, - 0, - getOffset(SkeletonConfigOffsets.ELBOW_OFFSET), - 0 - ); - case LEFT_UPPER_ARM, RIGHT_UPPER_ARM -> setNodeOffset( - nodeOffset, - 0, - -getOffset(SkeletonConfigOffsets.UPPER_ARM_LENGTH), - 0 - ); case LEFT_SHOULDER -> setNodeOffset( nodeOffset, -getOffset(SkeletonConfigOffsets.SHOULDERS_WIDTH) / 2f, @@ -339,6 +305,30 @@ public class SkeletonConfig { -getOffset(SkeletonConfigOffsets.SHOULDERS_DISTANCE), 0 ); + case LEFT_UPPER_ARM, RIGHT_UPPER_ARM -> setNodeOffset( + nodeOffset, + 0, + -getOffset(SkeletonConfigOffsets.UPPER_ARM), + 0 + ); + case LEFT_LOWER_ARM, RIGHT_LOWER_ARM -> setNodeOffset( + nodeOffset, + 0, + getOffset(SkeletonConfigOffsets.LOWER_ARM), + 0 + ); + case LEFT_HAND, RIGHT_HAND -> setNodeOffset( + nodeOffset, + 0, + -getOffset(SkeletonConfigOffsets.CONTROLLER_Y), + -getOffset(SkeletonConfigOffsets.CONTROLLER_Z) + ); + case LEFT_CONTROLLER, RIGHT_CONTROLLER -> setNodeOffset( + nodeOffset, + 0, + getOffset(SkeletonConfigOffsets.CONTROLLER_Y), + getOffset(SkeletonConfigOffsets.CONTROLLER_Z) + ); } } diff --git a/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfigOffsets.java b/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfigOffsets.java index 0d290bb6c..2587b4027 100644 --- a/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfigOffsets.java +++ b/server/src/main/java/dev/slimevr/vr/processor/skeleton/SkeletonConfigOffsets.java @@ -7,193 +7,146 @@ import java.util.Map; public enum SkeletonConfigOffsets { HEAD( 1, - "Head", "headShift", - "Head shift", 0.1f, new BoneType[] { BoneType.HEAD } ), NECK( 2, - "Neck", "neckLength", - "Neck length", 0.1f, new BoneType[] { BoneType.NECK } ), - TORSO( - 3, - "Torso", - "torsoLength", - "Torso length", - 0.56f, - new BoneType[] { BoneType.WAIST } - ), CHEST( - 4, - "Chest", - "chestDistance", - "Chest distance", + 3, + "chestLength", 0.32f, - new BoneType[] { BoneType.CHEST, BoneType.WAIST, + new BoneType[] { BoneType.CHEST, BoneType.CHEST_TRACKER, BoneType.LEFT_SHOULDER, BoneType.RIGHT_SHOULDER } ), + CHEST_OFFSET( + 4, + "chestOffset", + 0.0f, + new BoneType[] { BoneType.CHEST_TRACKER } + ), WAIST( 5, - "Waist", - "waistDistance", - "Waist distance", + "waistLength", + 0.20f, + new BoneType[] { BoneType.WAIST } + ), + HIP( + 6, + "hipLength", 0.04f, - new BoneType[] { BoneType.WAIST, BoneType.HIP } + new BoneType[] { BoneType.HIP } ), HIP_OFFSET( - 6, - "Hip offset", + 7, "hipOffset", - "Hip offset", 0.0f, new BoneType[] { BoneType.HIP_TRACKER } ), HIPS_WIDTH( - 7, - "Hips width", + 8, "hipsWidth", - "Hips width", 0.26f, new BoneType[] { BoneType.LEFT_HIP, BoneType.RIGHT_HIP } ), - LEGS_LENGTH( - 8, - "Legs length", - "legsLength", - "Legs length", - 0.92f, + UPPER_LEG( + 9, + "upperLegLength", + 0.42f, new BoneType[] { BoneType.LEFT_UPPER_LEG, BoneType.RIGHT_UPPER_LEG } ), - KNEE_HEIGHT( - 9, - "Knee height", - "kneeHeight", - "Knee height", + LOWER_LEG( + 10, + "lowerLegLength", 0.50f, - new BoneType[] { BoneType.LEFT_UPPER_LEG, BoneType.RIGHT_UPPER_LEG, - BoneType.LEFT_LOWER_LEG, BoneType.RIGHT_LOWER_LEG } + new BoneType[] { BoneType.LEFT_LOWER_LEG, BoneType.RIGHT_LOWER_LEG } ), FOOT_LENGTH( - 10, - "Foot length", + 11, "footLength", - "Foot length", 0.05f, new BoneType[] { BoneType.LEFT_FOOT, BoneType.RIGHT_FOOT } ), FOOT_SHIFT( - 11, - "Foot shift", + 12, "footShift", - "Foot shift", -0.05f, new BoneType[] { BoneType.LEFT_LOWER_LEG, BoneType.RIGHT_LOWER_LEG } ), SKELETON_OFFSET( - 12, - "Skeleton offset", + 13, "skeletonOffset", - "Skeleton offset", 0.0f, new BoneType[] { BoneType.CHEST_TRACKER, BoneType.HIP_TRACKER, BoneType.LEFT_KNEE_TRACKER, BoneType.RIGHT_KNEE_TRACKER, BoneType.LEFT_FOOT_TRACKER, BoneType.RIGHT_KNEE_TRACKER } ), - CONTROLLER_DISTANCE_Z( - 13, - "Controller distance z", - "controllerDistanceZ", - "Controller distance z", - 0.13f, - new BoneType[] { BoneType.LEFT_CONTROLLER, BoneType.RIGHT_CONTROLLER, - BoneType.LEFT_HAND, BoneType.RIGHT_HAND } - ), - CONTROLLER_DISTANCE_Y( - 14, - "Controller distance y", - "controllerDistanceY", - "Controller distance y", - 0.035f, - new BoneType[] { BoneType.LEFT_CONTROLLER, BoneType.RIGHT_CONTROLLER, - BoneType.LEFT_HAND, BoneType.RIGHT_HAND } - ), - LOWER_ARM_LENGTH( - 15, - "Lower arm length", - "lowerArmLength", - "Lower arm length", - 0.25f, - new BoneType[] { BoneType.LEFT_LOWER_ARM, BoneType.RIGHT_LOWER_ARM } - ), SHOULDERS_DISTANCE( - 16, - "Shoulders distance", + 14, "shouldersDistance", - "Shoulders distance", 0.08f, new BoneType[] { BoneType.LEFT_SHOULDER, BoneType.RIGHT_SHOULDER } ), SHOULDERS_WIDTH( - 17, - "Shoulders width", + 15, "shouldersWidth", - "Shoulders width", 0.36f, new BoneType[] { BoneType.LEFT_SHOULDER, BoneType.RIGHT_SHOULDER } ), - UPPER_ARM_LENGTH( - 18, - "Upper arm length", + UPPER_ARM( + 16, "upperArmLength", - "Upper arm length", 0.25f, new BoneType[] { BoneType.LEFT_UPPER_ARM, BoneType.RIGHT_UPPER_ARM } ), - ELBOW_OFFSET( + LOWER_ARM( + 17, + "lowerArmLength", + 0.25f, + new BoneType[] { BoneType.LEFT_LOWER_ARM, BoneType.RIGHT_LOWER_ARM } + ), + CONTROLLER_Y( + 18, + "controllerDistanceY", + 0.035f, + new BoneType[] { BoneType.LEFT_CONTROLLER, BoneType.RIGHT_CONTROLLER, + BoneType.LEFT_HAND, BoneType.RIGHT_HAND } + ), + CONTROLLER_Z( 19, - "Elbow offset", - "elbowOffset", - "Elbow offset", - 0f, - new BoneType[] { BoneType.LEFT_ELBOW_TRACKER, BoneType.RIGHT_ELBOW_TRACKER } + "controllerDistanceZ", + 0.13f, + new BoneType[] { BoneType.LEFT_CONTROLLER, BoneType.RIGHT_CONTROLLER, + BoneType.LEFT_HAND, BoneType.RIGHT_HAND } ),; public static final SkeletonConfigOffsets[] values = values(); - private static final Map byStringVal = new HashMap<>(); private static final Map byIdVal = new HashMap<>(); static { for (SkeletonConfigOffsets configVal : values()) { byIdVal.put(configVal.id, configVal); - byStringVal.put(configVal.stringVal.toLowerCase(), configVal); } } public final int id; - public final String stringVal; public final String configKey; - public final String label; public final float defaultValue; public final BoneType[] affectedOffsets; SkeletonConfigOffsets( int id, - String stringVal, String configKey, - String label, float defaultValue, BoneType[] affectedOffsets ) { this.id = id; - this.stringVal = stringVal; this.configKey = configKey; - this.label = label; this.defaultValue = defaultValue; @@ -201,10 +154,6 @@ public enum SkeletonConfigOffsets { == null ? new BoneType[0] : affectedOffsets; } - public static SkeletonConfigOffsets getByStringValue(String stringVal) { - return stringVal == null ? null : byStringVal.get(stringVal.toLowerCase()); - } - public static SkeletonConfigOffsets getById(int id) { return byIdVal.get(id); } diff --git a/solarxr-protocol b/solarxr-protocol index 3cb3e7aee..e8f16f2a3 160000 --- a/solarxr-protocol +++ b/solarxr-protocol @@ -1 +1 @@ -Subproject commit 3cb3e7aeea751239d4e7508ad4abeae4dc612298 +Subproject commit e8f16f2a3d4a468f50e0960e14a31fe7edd50597