OSC parameter dictionary
简体中文 | English
Find a parameter, read its unit and direction, then choose a mapping or computation. The tables describe the paths used by OGB/SPS and Sensa tracking. Use the parameter explorer to search readings, move a target, map the range and export or send a simulated trajectory to WebSensa.
Node OSC services receive and discover parameters. The shared OscParameterStore retains source identity, ordering, receive time and content-change time. One TypeScript runtime processes scalar, tracking and spatial calculations; Electron and browser workbenches display its application snapshot.
Explore the values
The public explorer follows the browser’s language and remembers a manual choice in the current tab. Share its address directly. Application parameter details open the bundled page; keep its adjacent assets to open docs/parameter-geometry.html offline.
Choose parameters, then drag the orange target to see how approach, entry and contact regions change their readings. All eleven scenes have 3D, planar views and precise sliders. Blue shows receiver coverage, orange the target's signal shape, and gray profiles show the relative Socket/Plug arrangement. The orange handle is enlarged for dragging. SPS four-anchor tracking colors connect each measurement sphere to its label and parameter row.
The “OSC parameter meanings and sources” section below the controls explains every field in the selected group. Expand an actual parameter name to read what it measures, its range and units, linkage suggestions, and its official or project source. In the workbench, open OSC → Parameters and select a parameter name to read the same explanations in “Parameter meaning.” Confirm its complete path before adding a mapping draft.
Distances use complete XYZ coordinates. XZ projects space onto a plane; the green SPS four-anchor tracking region additionally shows measurable positions at the selected Y height. “Usable value” applies Close or validity conditions, helping you choose values for a mapping. Configure actual linkage through the workbench guide.
Parameters appear in dictionary order, with a shorter shared prefix first: PenOthers precedes PenOthersClose. A prefix's * represents an instance name: Sensa/SPS/Example/P0 has full address /avatar/parameters/Sensa/SPS/Example/P0. Shader IDs use the decimal form below.
Three.js/OrbitControls ship with the assets; unavailable WebGL2 falls back to SVG. The MIT notice is assets/parameter-geometry-3d.LICENSE.txt. Explorer operation
Where the explanations come from
“Measurement definition” explains how a value is produced; “Linkage use” helps you choose a mapping. The page labels the following sources and paraphrases official explanations in plain language:
| Source | What it defines | References |
|---|---|---|
| Official VRChat sources | Contact detection, native SDK position/velocity reports and Raycast hit/distance | Official Contacts guide, official SDK Beta.3, Raycast parameters |
| VRCFury/OGB implementation | Generated PenOthers, NewRoot, NewTip, Touch, Frot and Close names, detection shapes and pairing |
Pinned Socket generator, pinned Plug generator, OGB interoperability |
| Sensa protocol and application guidance | Four-anchor reconstruction, Sample/Radius, Shader Frame/Valid, and converting readings into motion targets |
Positioning and units, Contact route, computed signals |
The general Contacts guide explains detection behavior. The official beta package above establishes the specific advanced Proximity suffixes, coordinate frame and velocity meaning used here. The Contact guide retains the relevant methods and package hashes for verification.
Choose the information you need
| Parameter family | Information provided | Typical use |
|---|---|---|
OGB/Orf/<id>/…, OGB/Pen/<id>/… |
Socket/Plug depth trends, touch intensity and presence | Depth or vibration linkage |
VFH/Zone/Touch/<id>/Others / Self |
Approach intensity inside a selected touch zone | Zone-based touch linkage |
Sensa/<id>/Aux<index>/<role>_… |
Raycast hit state, normalized distance and distance in metres | Hit conditions and surface-distance linkage |
Sensa/Contact/<id>/Proximity…, Radius, Sample |
Selected root position in metres and relative velocity in m/s | Calibrated local movement or movement strength |
Sensa/SPS/<id>/P0…P3, Sample |
Selected root's three-dimensional position relative to the Avatar | Mapping left/right, up/down or forward/back movement |
Sensa/Shader/<id>/… |
Position, X/Z axes and Avatar world scale decoded from a screen block | Spatial mappings, orientation calculations and metre conversion |
Sensa/Diagnostics/Shader/0/… |
Pattern, capture and OSC transport diagnostics | Checking the capture chain |
SPS four-anchor tracking Unity components and desktop share the five fields and fixed geometry below. External OGB parameters come from the Avatar's generator; inspect complete paths in the parameter list.
To combine parameters, create a computed signal for a weighted average, difference, ratio or magnitude, then map its result to an axis. Tracking computations select solved coordinate or velocity metrics directly, retaining each input's source and validity conditions.
OGB and VRCFury parameters
Orf means Socket and Pen means Plug. Self filters matching targets on your own Avatar; Others filters matching targets on other Avatars. Sensa pairs by OSC source, complete instance path and category. SPS2 · PenOthersNewRoot / PenOthersNewTip and SPS1 · PenOthers / PenOthersClose identify the explorer's two parameter geometries.
| Parameter/path | Reading meaning | Sensa behavior |
|---|---|---|
FrotOthers |
Approach intensity as two matching shapes move close, meet or brush past | Plug uses FrotOthersClose; Socket reads the value directly |
FrotOthersClose |
Whether a matching target enters the Plug's effective nearby region: 0 away, 1 nearby | An additional condition for Plug Frot |
Orf/Pen PenOthers / PenSelf |
Continuous 0–1 proximity. The Socket SPS1 value follows an entering-depth trend; the Plug value changes as the Socket entrance approaches its root | Calibrate your intended shallow and deep endpoints; Socket uses it when the SPS2 pair is absent or both values are zero, while Plug reads it directly |
Orf PenOthersClose |
Whether a matching target enters the Socket's effective nearby region: 0 away, 1 nearby | When published, gates SPS1 depth; single-value sources retain their own path behavior |
Orf PenOthersNewRoot / PenSelfNewRoot |
SPS2 proximity from the small Plug-root sphere to the Socket Receiver, from 0 to 1 | Pairs with the same instance's NewTip for length estimation and depth conversion |
Orf PenOthersNewTip / PenSelfNewTip |
SPS2 proximity from a sphere centered on the Plug root whose radius equals Plug length, from 0 to 1 | Unsaturated pairs estimate length, then yield a depth trend |
TouchOthers / TouchSelf |
Continuous 0–1 intensity as a body or matching target approaches the touch region | Used with its corresponding Touch…Close |
TouchOthersClose / TouchSelfClose |
Whether a matching target enters that touch region: 0 away, 1 nearby | Close=1 admits Touch intensity; Close=0 yields zero |
VFH/Zone/Touch/<complete-id>/Others / Self |
Continuous proximity in a chosen zone, usually increasing toward its center | OgbTouch reads 0–1 directly |
VFH/Version/…, historical OGB Version paths |
Upstream capability flags | Identifying supported parameter features |
OGB_ENABLED |
Tells the Avatar that the receiving service is running | Sends true to the configured destination every five seconds and attempts false when stopped; off by default |
Depth readings follow distances between detection shapes. Movement aligned with the Socket corresponds most directly to entering depth; sideways movement, tilt and authored dimensions also affect readings. Calibrate your intended start and end positions when mapping. Close=1 means a matching target entered that Contact's effective region, making it useful as a condition for motion. Authored shapes determine how that region relates to the body's visible outline. SPS2 OgbDepth uses Receiver radius R=1 and root-sphere radius r=0.01; the explorer shows how its two values work together.
Use the parameters actually exposed by your Avatar. The OGB tables give complete generated paths, shapes and dimensions, based on the pinned generator and official OGB consumer.
Supplementary Raycast signals: hit and distance
Choose Raycast in SensaComponent supplementary signals to measure surface distance from an origin along its local +Z axis. An empty origin uses the component's own object. Configure a positive maximum range up to 1000 metres. This feature requires VRChat SDK 3.10.3+. Sensa explicitly disables ApplyTransformScale, keeping the range in metres.
The prefix is Sensa/<id>/Aux<index>/<role>: <index> is the supplementary signal's zero-based index, and <role> is its Inspector role identifier, such as Vibrate or GateEnable. The role distinguishes parameter names; choose the desired control use in the desktop mapping. For example, the first Vibrate signal on instance Body exposes:
| Path | Type and meaning | Use |
|---|---|---|
Sensa/Body/Aux0/Vibrate_Distance |
Float; world distance from origin to hit point, in metres | Calibrate the desired physical-distance range |
Sensa/Body/Aux0/Vibrate_Hit |
Bool; true when the ray currently hits | Use as a GateEnable condition to consume distance while hit |
Sensa/Body/Aux0/Vibrate_Ratio |
Float; hit distance normalized between zero and maximum range, 0–1 | 0 is the origin and 1 is the range end; invert when mapping approach intensity |
With a 0.3 m range and a hit 0.1 m away, _Distance is approximately 0.1 and _Ratio approximately 1/3. Check _Hit before reading distance: the generated component uses the SDK's default DoNothing miss behavior. On a miss, _Hit=false and both distances retain their latest hit values, initially zero before the first hit.
These are the native VRCRaycast report fields. The official Raycast parameter reference explains hit state, distance ratio, world distance and the available miss behaviors. Sensa declares local, unsynced Expression Parameters and matching FX types for all three. The APIs and bindings were also checked in the minimum supported version, 3.10.3. Unity configuration · Official SDK 3.10.3 package
Contact direct tracking (SDK Beta): twelve public fields
Use a dedicated spherical Sender on the selected own root and one Proximity Receiver at the Avatar root with zero offsets and aligned axes. The Receiver uses a unique collision channel with Self enabled. Sensa sets advancedParameters=true with SDK 3.10.6-beta.3, or advancedProximityParameters=true with Beta.2. Its coordinate frame is AvatarRootMeters: Avatar-root origin and rotated axes, in physical metres. Setup and verified SDK evidence
SDK Beta.3 advanced reports support any Receiver type and add _SenderLossyScaleX/Y/Z (the associated Sender Transform's world scale) and _PointSeparation (world-space distance between the nearest inner points of the Sender and Receiver, in metres). These describe native Contact shapes; Sensa Distance derives distance to the Avatar origin from root XYZ. Sensa generates the twelve public fields below for its position/velocity calculations and presets. To use the additional native reports, authors declare the matching Floats in the Animator and configure their OSC visibility. Official release notes · Additional report meanings and defaults
All paths start with Sensa/Contact/<id>/; <id> occupies one path segment. The table follows dictionary order, with the shorter shared prefix first. Proximity_SenderType is Int; the other eleven fields are Floats.
| Leaf | What it tells you | Linkage use |
|---|---|---|
Proximity |
Selected-target proximity, 0–1; usually increases as the target's signal shape approaches the Receiver center | Inspect entry into the detection range; Sensa root measurement uses positive values |
Proximity_ProximitySpeed |
How much proximity changes per second; positive means an increasing reading and negative a decreasing reading, in proximity units/s | Distinguish approach and withdrawal strength; calibrate the intended direction. Exit can produce a transient |
Proximity_SenderLocalPositionX |
Sender shape midpoint displacement from Receiver shape midpoint, X in metres | Map left/right displacement under Sensa's Avatar-root reference to one axis; signed values retain direction |
Proximity_SenderLocalPositionY |
The same position's Y component, in metres | Control motion with up/down displacement and calibrate the desired lower and upper endpoints |
Proximity_SenderLocalPositionZ |
The same position's Z component, in metres | Control forward/back movement or entering depth, calibrated to the intended shallow and deep endpoints |
Proximity_SenderType |
SDK-selected target category: 0 none, 1 own Avatar, 2 other Avatar, 3 world Sender | Identify the selected target category; Sensa's dedicated root route uses 1 |
Proximity_SenderVelocityMagnitude |
Relative speed near the contact point, in m/s, always ≥0; zero can describe rest | Map movement speed to vibration or another intensity, with rest at the calibrated zero-speed level |
Proximity_SenderVelocityX |
Relative contact-point velocity along Receiver X, in m/s, including angular-motion effects | Control the direction or strength of left/right movement; signs represent positive/negative axis motion |
Proximity_SenderVelocityY |
The same velocity's Y component, in m/s | Control the direction or strength of up/down movement |
Proximity_SenderVelocityZ |
The same velocity's Z component, in m/s | Control the direction or strength of back-and-forth movement |
Radius |
Sensa Receiver's current world radius, in metres, 0 < Radius ≤ 3, updated with ScaleFactor |
Inspect coverage and the measurement boundary after scaling |
Sample |
Sensa producer-activity counter; cycles through n/32 (n=1…32), with 0 disabled/invalid | Check continued measurement updates alongside complete-field validity |
For example, changing Z from 0.05 m to 0.15 m means 0.10 m of movement along the Receiver's Z axis; calibrate those endpoints to your desired motion range. A relative speed of 0.4 m/s describes movement speed at that moment. A Proximity change rate of 0.4/s describes proximity increasing by 0.4 per second. Choose position, velocity or proximity-change mapping according to these meanings.
The SDK selects the matching Sender with greatest strictly positive Proximity; Beta.3 resolves two Proximity values of 1 by choosing the lower PointSeparation. It rotates midpoint displacement by inverse Receiver shape rotation, retaining metres without scale/radius normalization. The reported velocity is relative velocity near the contact point, including angular terms. Rotating shapes can make it differ from the derivative of midpoint position. No selected Sender writes type 0 and zero XYZ/velocity. The SDK supplies no timestamp, sequence or stable Sender ID.
The desktop requires all twelve fields from one source and complete instance, Self type, positive Proximity, finite values, position within the Radius bound plus a small numeric tolerance and supported Radius. Sample advances nominally every 50 ms. Its changedAtMs age is capped at 1000 ms, shortened by a smaller positive osc.inputTimeoutMs; unchanged repeats do not renew it. Loss of contact, incomplete values, invalid Radius/coordinates or frozen/disabled activity stops the related spatial motion.
Contact direct tracking maps through SensaPoint using X/Y/Z/Distance or VelocityX/VelocityY/VelocityZ/Speed/ProximitySpeed. Endpoint calibration, curves, output limits, spatial activation and stopping use the existing flow. SPS four-anchor tracking Sensa/SPS/<id>/{P0,P1,P2,P3,Sample} and its authored-unit AvatarRootLocal frame retain their existing definition. Positioning · Workbench
SPS four-anchor tracking: four proximities and one activity sample
The producer places one dedicated spherical Sender at the explicitly selected Socket/Plug root center. Four spherical Receivers stay fixed in avatar-root coordinates and accept only their own dedicated collision channel. Each instance uses five Contacts to track the selected Transform root center. Producer
Five public measurement parameters
All values are Floats. Each <id> occupies one path segment; instance names and dedicated collision channels must be unique within the avatar.
| Full path | Meaning | Valid range |
|---|---|---|
Sensa/SPS/<id>/P0 |
Proximity from anchor P0 to the root-marker surface | Finite and strictly 0.001 < p < 0.999 |
Sensa/SPS/<id>/P1 |
The equivalent observation at anchor P1 | Same |
Sensa/SPS/<id>/P2 |
The equivalent observation at anchor P2 | Same |
Sensa/SPS/<id>/P3 |
The equivalent observation at anchor P3 | Same |
Sensa/SPS/<id>/Sample |
Counter for this instance’s current validity and sampling activity | 0 means invalid; active values are exactly n/32, integer n=1…32 |
Each FX sampling state targets 0.05 seconds: copy RawP0–RawP3 into P0–P3, then write Sample. Sample cycles from 1/32 through 1, targeting a 1.6-second cycle. Animation, Contact and OSC scheduling affect the update rhythm. Stationary roots reuse their latest P values while a changing Sample checks continued sampling. Shared constants, receiver checks
Sample lifetime uses changedAtMs, when its value last changed, with a 1000 ms default in normal operation. Runtime uses a positive configured osc.inputTimeoutMs or falls back to 1000 ms; the decoder then caps that value at 1250 ms. A smaller setting is stricter, while a setting above 1250 ms cannot extend the cap. Repeated receipt of the same Sample updates receipt time without extending that lifetime. Missing parameters, Sample=0, a non-n/32 value, freezing, timeout or a failed fit invalidate the coordinates. Runtime lifetime selection
Choose the measurement target from the menu
Alongside each object's five measurement Floats, Automatic's Exclusive strategy generates Sensa/Select/<group>, an Int defaulting to 0=Off, with 1…N selecting objects in Targets order. Dedicated has no such group selector. MA registers this Expression parameter with localOnly=true and saved=false. It starts from its default on loading, with visibility determined by VRChat OSC configuration. Selector implementation, MA parameter rules, VRChat OSC configuration
Fixed geometry, distance and coverage
Coordinates and radii use avatar-root local units: center c=(0,1,0), half-span h=0.35, Receiver radius R=2 and marker radius r=0.001.
| Anchor | Local coordinate |
|---|---|
| P0 | (-0.35, 0.65, -0.35) |
| P1 | (0.35, 0.65, 0.35) |
| P2 | (0.35, 1.35, -0.35) |
| P3 | (-0.35, 1.35, 0.35) |
For a spherical Sender and Receiver, the unsaturated proximity model and inverse are:
p = clamp(1 - max(0, d - r) / R, 0, 1)
d = R × (1 - p) + r
Here d is anchor-center to marker-center distance. The r correction accounts for Proximity measuring the Sender surface nearest the Receiver center. True distances to four known noncoplanar anchors uniquely determine this local XYZ. The implementation also requires RMS distance residual≤0.01 and X/Z=[-2,2], Y=[-1,3]. Residual measures agreement between the four distances and the calculated position. VRChat Contact definition, reconstruction
Usable space is the intersection of four spherical coverage regions, excluding saturation and boundary bands. A sphere centered at c with radius approximately 2 - √3×0.35 ≈ 1.394 provides an inscribed reference; proximity thresholds, saturation holes and numerical boundaries further define valid positions. The p<0.999 ceiling requires d>0.003, excluding approximately 0.003 local units around each anchor (3 mm in a local metre scale). The p>0.001 floor requires d<1.999. World dimensions follow the Avatar root scale.
Scaling, sampling and menu controls
Let s_author be the authored uniform avatar-root world scale and ScaleFactor the VRChat scaling factor. Receiver world radius is 2 × s_author × ScaleFactor. Contacts have a 3 m radius limit after scaling; the producer reserves 0.001 m and uses:
maxScale = (3 - 0.001) / (2 × s_author)
Beyond the gate, it disables Contacts, clears public samples and writes Sample=0. Builds reject unsupported nonuniform avatar-root scale, a root ScaleConstraint and root scale animation. Target bones may scale; the dedicated marker follows the root center without inheriting that target scale into its known sphere radius. One local unit equals one world metre only when s_author=1 and ScaleFactor=1. Gate implementation, VRChat scaled limits
RawP0–RawP3 serve internal FX sampling. ScaleFactor and IsLocal support scaling checks and local execution; Sensa/Select/<group> supports menu selection. Public root-position measurements are P0–P3 and Sample, with geometry and frame supplied by their shared definition.
Dedicated channels and AllowSelf select this Avatar’s root marker. Readings retain their Avatar-relative meaning as the whole Avatar walks or turns. See positioning for timing and error checks.
Shader: root position, axes and world scale
Native avatar render components apply the authored origin offset and axis rotation, sample the measurement origin and its local +X and +Z points through skinning, then encode a monochrome block. With both offsets at zero, the measurement frame matches the selected root. The desktop bridge decodes the selected region and Producer ID and delivers the same sample to Sensa. Encoder · Bridge
Twelve public measurement parameters
<id> is a decimal Producer ID from 1…65535 without leading zeros, such as Sensa/Shader/7/X. All fields below use the Sensa protocol and are sent as OSC Floats by the desktop bridge.
| Leaf | Meaning and validity |
|---|---|
Frame |
Integer encoder clock 0…65535; floor(_Time.y×60) wraps every approximately 18.2 minutes |
X / Y / Z |
Measurement position after the origin offset, in Avatar-root local coordinates; X/Z=[−2,2], Y=[−1,3] |
RightX / RightY / RightZ |
The configured measurement frame's +X axis expressed in Avatar-root coordinates; components in [−8,8], vector length retaining that axis's scale |
ForwardX / ForwardY / ForwardZ |
The same measurement frame's +Z axis, retaining direction and length; components in [−8,8] |
AvatarScale |
World metres per root-local unit, in (0,8]; multiply relative displacement by it for metres |
Valid |
1 commits a complete valid packet last; 0 immediately invalidates the measurement |
One triangle supplies all three sampling points. Each axis length must exceed 10⁻⁶ and their angle's sine must exceed 10⁻⁴ to exclude degenerate measurements. Use the vectors for orientation-related calculations, plane normals, angles and X/Z-axis scale. Independent Y-axis scale needs another measurement. For computed signals and output bindings, choose a tracking measurement (SensaPoint) in Flow, select Sensa/Shader/<id>/** and its metric, retaining complete-packet and freshness checks.
One valid bundle sends Frame → X → Y → Z → RightX → RightY → RightZ → ForwardX → ForwardY → ForwardZ → AvatarScale → Valid=1. Invalidation sends only Valid=0. Desktop requires twelve consecutive fields from one source and Producer path, checking completeness, finite values and ranges. Frame content-change age is capped at 500 ms, shortened by a stricter positive input timeout. Shared decoder
The bridge locates QR finder patterns, then applies Reed–Solomon correction, CRC32 and forward sequence checks. Any measurement changing under one Frame, reorder, identity changes or freezing invalidates the sample. Startup and recovery need two new advancing frames; default freezing is 350 ms. The 49×49-module tile contains a 33×33 QR symbol and eight white modules per side, requiring at least 196×196 physical pixels. The border combines a standard quiet zone with extra movement margin. Re-select the complete tile after resizing.
The separate menu control Sensa/Select/ShaderCapture_<ID> is an Int, default 0=Off; 1 enables capture. MA registers it as an Expression parameter with localOnly=true, saved=false. Internal Sensa/Internal/ShaderCapture_<ID>/Selected is FX Int state memory, default 0, written locally as 0/1. Generator · Selection state machine
Digital precision and integrity
Quantization steps are 4/65535≈6.10×10⁻⁵ root-local units for position, 8/32767≈2.44×10⁻⁴ for axis components with exact zero, and 8/65535≈1.22×10⁻⁴ metres per local unit for world scale. Ideal per-component rounding error is at most half a step; measure actual error against known positions and directions. The diagram follows HLSL round, rounding halfway cases to the nearest even integer.
The 32-byte packet retains Producer ID, coordinate flags, encoder clock, all measurements and CRC32. QR v4-H divides it into four blocks, each with 9 data and 16 parity bytes, supporting recovery within 2×wrong bytes + missing bytes≤16. Data comes from the same capture; integrity and freshness checks together determine availability. Full layout and recovery rules
Diagnostics and position-related information
Sensa/Diagnostics/Shader/0/Frame|X|Y|Z|Valid uses five fields with diagnostic XYZ in [-1,1]. Use it to check pattern generation, region capture and OSC transport. ID=0 stays in the diagnostic namespace; native root positions use object IDs 1…65535. Diagnostic handling
| Concept | Information and use |
|---|---|
| Root position | Three coordinates describing the measurement origin relative to the Avatar |
| Pose/orientation | Rotation calculated from independent direction information or multiple points with a known layout |
| World position | Scene position obtained with a world reference and coordinate transform |
| Final deformed surface | Surface points sampled according to the specific deformation algorithm |
| Device position/intensity | Motion targets produced through mapping, with actual response checked through the device's feedback |
Independent Point/Handle/Pose experiments use their own reference objects and complete field sets. To start spatial linkage, allow experimental spatial input, choose the source and mapping, then activate the current input. See positioning and the Shader research record for operating conditions and real-client verification methods.