Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions gui/public/i18n/en/translation.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,11 @@ widget-imu_visualizer-hide = Hide
widget-imu_visualizer-rotation_raw = Raw rotation
widget-imu_visualizer-rotation_preview = Preview rotation
widget-imu_visualizer-acceleration = Acceleration
widget-imu_visualizer-velocity = Velocity
widget-imu_visualizer-velocity_scaled = Scaled Velocity
widget-imu_visualizer-velocity_disabled_hmd = Supplied by HMD and its controllers
widget-imu_visualizer-velocity_disabled_settings = Velocity is disabled in Settings → General → Tracker Settings
widget-imu_visualizer-velocity_disabled_captured = This tracker's movement is captured by other body parts to reduce noise in calculations
widget-imu_visualizer-position = Position
widget-imu_visualizer-stay_aligned = Stay Aligned

Expand Down Expand Up @@ -666,6 +671,93 @@ settings-general-fk_settings-skeleton_settings-interp_knee_ankle = Average the k
settings-general-fk_settings-self_localization-title = Mocap mode
settings-general-fk_settings-self_localization-description = Mocap Mode allows the skeleton to roughly track its own position without a headset or other trackers. Note that this requires feet and head trackers to work and is still experimental.

## Tracker velocity settings
settings-general-tracker_velocity = Tracker Velocity Settings
settings-general-tracker_velocity-description = Enables derived velocity tracking for Natural Locomotion and similar systems.
settings-general-tracker_velocity-warning = <b>⚠️ WARNING:</b> Any tracker exposing velocity may cause jitter if desynced or overpredicting.
settings-general-tracker_velocity-enable = Enable Velocity Tracking

settings-general-tracker_velocity-preset = Velocity Tracking Preset
settings-general-tracker_velocity-preset-description = Choose which trackers send velocity data.
settings-general-tracker_velocity-preset-recommended = <b>HYBRID</b> is recommended for full-body tracking users who also use Natural Locomotion (e.g., VRChat).
settings-general-tracker_velocity-preset-all = All Trackers
settings-general-tracker_velocity-preset-all-description = All supported trackers send velocity (excludes HMD, controllers, and skeleton-constrained trackers)
settings-general-tracker_velocity-preset-hybrid = Hybrid
settings-general-tracker_velocity-preset-hybrid-description = Lower body + waist trackers (recommended for FBT users with Natural Locomotion)
settings-general-tracker_velocity-preset-custom = Custom
settings-general-tracker_velocity-preset-custom-description = Manually select which tracker groups send velocity

settings-general-tracker_velocity-custom_groups = Custom Tracker Groups
settings-general-tracker_velocity-custom_groups-description = Select which tracker role groups should send velocity data
settings-general-tracker_velocity-custom_groups-feet = Feet
settings-general-tracker_velocity-custom_groups-ankles = Ankles
settings-general-tracker_velocity-custom_groups-knees = Knees
settings-general-tracker_velocity-custom_groups-chest = Chest
settings-general-tracker_velocity-custom_groups-waist = Waist
settings-general-tracker_velocity-custom_groups-elbows = Elbows

settings-general-tracker_velocity-scaling = Velocity Scaling
settings-general-tracker_velocity-scaling-description = Scale velocity values.
settings-general-tracker_velocity-scaling-recommendation = Keep disabled for default behavior. Enable if Natural Locomotion or similar systems feel too sensitive or unresponsive.
settings-general-tracker_velocity-scaling-override = Override Scaling Preset

settings-general-tracker_velocity-scaling-preset-unscaled = Unscaled
settings-general-tracker_velocity-scaling-preset-unscaled-description = No scaling applied (1.0x)
settings-general-tracker_velocity-scaling-preset-hybrid = Hybrid
settings-general-tracker_velocity-scaling-preset-hybrid-description = Fine-tuned downscaling used for Hybrid role groups. Recommended for Natural Locomotion.
settings-general-tracker_velocity-scaling-preset-custom_unified = Custom Unified
settings-general-tracker_velocity-scaling-preset-custom_unified-description = Single scaling value for all axes
settings-general-tracker_velocity-scaling-preset-custom_per_axis = Custom Per-Axis
settings-general-tracker_velocity-scaling-preset-custom_per_axis-description = Individual scaling per axis (X, Y, Z)

settings-general-tracker_velocity-advanced = Advanced Scaling
settings-general-tracker_velocity-advanced-description = Fine-tune velocity scaling with custom values within or beyond the standard 0.0-1.0 range.
settings-general-tracker_velocity-advanced-enable_upscaling = Allow Upscaling (>1.0x)
settings-general-tracker_velocity-advanced-upscaling_accessibility = This experimental feature allows boosting velocity input sensitivity and may assist users with limited mobility in achieving better Natural Locomotion response.
settings-general-tracker_velocity-advanced-upscaling_warning = <b>⚠️ WARNING:</b> May severely disrupt full-body tracking. Intended primarily for Natural Locomotion users without FBT.

settings-general-tracker_velocity-scale-unified = Unified Scale (All Axes)
settings-general-tracker_velocity-scale-x = Scale X
settings-general-tracker_velocity-scale-y = Scale Y
settings-general-tracker_velocity-scale-z = Scale Z

settings-general-tracker_velocity-info-box = Make sure to read setup instructions and familiarize yourself with common issues before using velocity
settings-general-tracker_velocity-info-button = Instructions

settings-general-tracker_velocity-instructions-title = Velocity Tracking Setup & Instructions
settings-general-tracker_velocity-instructions-close = OK

settings-general-tracker_velocity-instructions-section1-title = Before you start:
settings-general-tracker_velocity-instructions-section1-content = 1. Make sure your HMD has a proper room-scale boundary set up.
2. Ensure your floor level is accurately aligned with the actual floor.
3. It's recommended to use automated height detection from your HMD.
4. Perform a full SlimeVR calibration (Reset + Mounting).

settings-general-tracker_velocity-instructions-section2-title = Recommended settings for Natural Locomotion:
settings-general-tracker_velocity-instructions-section2-content = For games that support both FBT and NaLo:
• In Natural Locomotion: "Common Settings" > "When pressing armswing buttons:" set to "Enable walk-in-place"
• In the game's profile: "Configure buttons" > select your desired action to enable locomotion
Note: This setup is necessary because NaLo interprets any leg movement as "walking", which would trigger constant walking with full-body tracking enabled.
For games without FBT support:
• Feel free to experiment and find settings that are comfortable for you personally
• You can use the default game profiles provided within NaLo if they work well for you

settings-general-tracker_velocity-instructions-section3-title = Common Issues:
settings-general-tracker_velocity-instructions-section3-content = Occasional jitter in FBT avatars (VRChat, Beat Saber):
• Occurs when SteamVR overshoots position prediction based on velocity data
• Can be mitigated by downscaling velocity (makes prediction less aggressive)
• Note: Downscaling will impact NaLo's sensitivity, but can be compensated within NaLo's own settings
• The Hybrid preset is designed to balance jitter mitigation with Natural Locomotion functionality
• If not using Natural Locomotion, it's recommended to disable velocity tracking entirely
Feet trackers "disconnecting" or appearing only when moved in NaLo:
• Usually caused by improperly configured HMD Virtual Space
• Check: HMD height is set correctly
• Check: Floor level is not set above the actual floor (trackers fall out of virtual space)
• Check: Boundary is properly set up (not relying on dynamic safe space generation)
• Solution: Manually configure floor level and boundaries to a fixed state in your HMD settings
Body tracker not being found by NaLo or not moving:
• This is unusual but normal behavior and doesn't impact functionality

## Gesture control settings (tracker tapping)
settings-general-gesture_control = Gesture control
settings-general-gesture_control-subtitle = Tap based resets
Expand Down
124 changes: 124 additions & 0 deletions gui/src/components/settings/VelocityInstructionsModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import { useLocalization } from '@fluent/react';
import { BaseModal } from '@/components/commons/BaseModal';
import { Button } from '@/components/commons/Button';
import { Typography } from '@/components/commons/Typography';
interface VelocityInstructionsModalProps {
isOpen: boolean;
onClose: () => void;
}
export function VelocityInstructionsModal({
isOpen,
onClose,
}: VelocityInstructionsModalProps) {
const { l10n } = useLocalization();
return (
<BaseModal
isOpen={isOpen}
onRequestClose={onClose}
className="w-full max-w-2xl min-w-[450px] h-[80vh] min-h-[600px] bg-background-60 p-6 rounded-lg text-background-10 focus:outline-none"
shouldCloseOnOverlayClick
shouldCloseOnEsc
>
<div className="flex flex-col h-full gap-2">
{/* Title section - 5% */}
<div className="h-[5%] min-h-[40px]">
<Typography variant="main-title">
{l10n.getString('settings-general-tracker_velocity-instructions-title')}
</Typography>
</div>

{/* Content section - 85% */}
<div className="h-[85%] overflow-y-auto relative scrollbar-thin scrollbar-thumb-background-60 scrollbar-track-transparent">
{/* Top shadow gradient */}
<div className="sticky top-0 h-6 bg-gradient-to-b from-background-60 via-background-60/80 to-transparent pointer-events-none z-10" />

<div className="px-2 pb-12 space-y-6">
{/* Section 1: Before you start */}
<div>
<Typography variant="section-title" className="pb-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section1-title')}
</Typography>
<div className="space-y-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section1-content')
.split('\n')
.filter(line => line.trim())
.map((line, index) => (
<Typography
key={index}
color="secondary"
className="leading-relaxed"
>
{line.trim()}
</Typography>
))}
</div>
</div>

{/* Section 2: Recommended settings */}
<div>
<Typography variant="section-title" className="pb-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section2-title')}
</Typography>
<div className="space-y-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section2-content')
.split('\n')
.filter(line => line.trim())
.map((line, index) => {
const trimmedLine = line.trim();
const isKeyPoint = !trimmedLine.startsWith('•') && !trimmedLine.startsWith('Note:');
return (
<Typography
key={index}
color={isKeyPoint ? "primary" : "secondary"}
className={`leading-relaxed ${isKeyPoint ? "text-base font-medium" : ""}`}
>
{trimmedLine}
</Typography>
);
})}
</div>
</div>

{/* Section 3: Common Issues */}
<div>
<Typography variant="section-title" className="pb-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section3-title')}
</Typography>
<div className="space-y-2">
{l10n.getString('settings-general-tracker_velocity-instructions-section3-content')
.split('\n')
.filter(line => line.trim())
.map((line, index) => {
const trimmedLine = line.trim();
const isKeyPoint = !trimmedLine.startsWith('•') &&
!trimmedLine.startsWith('Note:') &&
!trimmedLine.startsWith('Check:') &&
!trimmedLine.startsWith('Solution:');
return (
<Typography
key={index}
color={isKeyPoint ? "primary" : "secondary"}
className={`leading-relaxed ${isKeyPoint ? "text-base font-medium" : ""}`}
>
{trimmedLine}
</Typography>
);
})}
</div>
</div>
</div>

{/* Bottom shadow gradient */}
<div className="sticky bottom-0 h-6 bg-gradient-to-t from-background-60 via-background-60/80 to-transparent pointer-events-none z-10 -mt-6" />
</div>

{/* Button section - 10% */}
<div className="h-[10%] min-h-[60px] flex items-center justify-center border-t border-background-50 pt-2">
<Button variant="primary" onClick={onClose}>
{l10n.getString('settings-general-tracker_velocity-instructions-close')}
</Button>
</div>
</div>
</BaseModal>
);
}
Loading
Loading