OSC: Difference between revisions

From VRChat Wiki
Hackebein (talk | contribs)
added some more libs
Hackebein (talk | contribs)
OSC
 
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Noticebox/Official}}
{{Noticebox/Official}}
[[File:OSC_Keyart.png|thumb|300x300px]]
{{Infobox/Feature
|name=OSC
|image=OSC_Keyart.png
|platforms= PC, Android, iOS
|branch_live_date = February 24, 2022
|branch_live_version = 2022.1.1 Build 1169
|branch_live_releasenote = [https://docs.vrchat.com/docs/vrchat-202211 2022.1.1]
|branch_openbeta_date = February 16, 2022
|branch_openbeta_version = 2022.1.1 Build 1166
|branch_openbeta_releasenote = [https://discord.com/channels/189511567539306508/503009489486872583/943711618783662101 2022.1.1 Open Beta]
}}
 
[https://opensoundcontrol.stanford.edu/index.html '''OSC''' (Open Sound Control)] is a protocol originally designed for communication between audio devices and controllers, but its flexibility has made it popular for a wide variety of real-time control applications<ref>https://opensoundcontrol.stanford.edu/spec-1_0.html</ref>. VRChat announced OSC support for avatars on February 16, 2022<ref>https://hello.vrchat.com/blog/vrchat-osc-for-avatars</ref>, and the feature shipped in the 2022.1.1<ref>[https://docs.vrchat.com/docs/vrchat-202211 "VRChat 2022.1.1"] (Build 1169) on ''[[docs.vrchat.com]]''. Dated February 24, 2022.</ref> update on February 24, 2022. OSC is commonly used by body-, eye- and face trackers to communicate with [[Special:MyLanguage/VRChat|VRChat]], as well as by other applications that automate [[Special:MyLanguage/Avatars|Avatar]] parameters.
[https://opensoundcontrol.stanford.edu/index.html '''OSC''' (Open Sound Control)] is a protocol originally designed for communication between audio devices and controllers, but its flexibility has made it popular for a wide variety of real-time control applications<ref>https://opensoundcontrol.stanford.edu/spec-1_0.html</ref>. VRChat announced OSC support for avatars on February 16, 2022<ref>https://hello.vrchat.com/blog/vrchat-osc-for-avatars</ref>, and the feature shipped in the 2022.1.1<ref>[https://docs.vrchat.com/docs/vrchat-202211 "VRChat 2022.1.1"] (Build 1169) on ''[[docs.vrchat.com]]''. Dated February 24, 2022.</ref> update on February 24, 2022. OSC is commonly used by body-, eye- and face trackers to communicate with [[Special:MyLanguage/VRChat|VRChat]], as well as by other applications that automate [[Special:MyLanguage/Avatars|Avatar]] parameters.


Line 10: Line 21:
==OSCQuery==
==OSCQuery==
[https://github.com/Vidvox/OSCQueryProposal OSCQuery] is a protocol to connect OSC applications together more easily. Information on how to connect with VRChat with OSCQuery is available on the [https://github.com/vrchat-community/osc/wiki/OSCQuery VRChat OSCQuery GitHub Wiki].
[https://github.com/Vidvox/OSCQueryProposal OSCQuery] is a protocol to connect OSC applications together more easily. Information on how to connect with VRChat with OSCQuery is available on the [https://github.com/vrchat-community/osc/wiki/OSCQuery VRChat OSCQuery GitHub Wiki].
== OSC Tools ==
* [https://hexler.net/touchosc TouchOSC] — Standalone OSC sender
* [https://hexler.net/protokol Protokol] — Standalone OSC receiver
== Library comparison ==
{| class="wikitable" style="text-align:center"
|-
!
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/radarsat1/liblo liblo]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/stella3d/OscCore OscCore]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/vrchat-community/vrc-oscquery-lib vrc-oscquery-lib]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/hypebeast/go-osc go-osc]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/hoijui/JavaOSC JavaOSC]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/colinbdclark/osc.js osc.js]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/jangxx/node-oscquery node-oscquery]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/attwad/python-osc python-osc]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/theepicsnail/vrchat_oscquery vrchat_oscquery]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/fraklein/python-oscquery python-oscquery]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/cyberkitsune/tinyoscquery tinyoscquery]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/klingtnet/rosc rosc]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://lib.rs/crates/oscquery oscquery]
! style="writing-mode: vertical-rl; transform: rotate(180deg); white-space: nowrap;" | [https://github.com/orchetect/OSCKit OSCKit]
|-
! style="text-align:left" | Language
| C
| C#
| C#
| Go
| Java
| JavaScript
| TypeScript
| Python
| Python
| Python
| Python
| Rust
| Rust
| Swift
|-
! style="text-align:left" | License
| LGPL-2.1+
| MIT
| MIT
| MIT
| BSD-3-Clause
| MIT / GPL-2.0
| MIT
| Unlicense
| None
| MIT
| MIT
| MIT / Apache-2.0
| MIT / Apache-2.0
| MIT
|-
! colspan="15" style="text-align:left; background:#9AA0AA; color:#fff" | OSC transport
|-
! style="text-align:left" | Send messages
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes<ref group="osc" name="python-osc-dep">Via bundled [https://pypi.org/project/python-osc/ python-osc] dependency; bundle support requires using python-osc's API directly.</ref>
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
|-
! style="text-align:left" | Receive messages
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes<ref group="osc" name="python-osc-dep" />
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
|-
! style="text-align:left" | Bundle support
| style="background:#22A84A; color:#fff" | Yes
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="osccore-bundle">Receive fully supported including nested bundles; send requires low-level <code>OscWriter</code> API.</ref>
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes<ref group="osc" name="python-osc-dep" />
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
|-
! style="text-align:left" | VRChat types
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code><ref group="osc" name="python-osc-dep" />
| <code>i f s T</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
| <code>i f s T F</code>
|-
! style="text-align:left" | Optional types
| <code>b h d t S c m N I</code>
| <code>b h d t S c r m N I []</code>
| <code>b h d c u []</code>
| <code>b h d t N</code>
| <code>b h d t S c r m N I []</code>
| <code>b h d t S c r m N I []</code>
| <code>b h d t S c r m N I []</code>
| <code>b h d r m N []</code><ref group="osc" name="pyosc-missing"><code>t</code> (timetag) is receive-only.</ref>
| <code>b h d t r m N []</code><ref group="osc" name="python-osc-dep" />
|
| <code>h d t</code><ref group="osc" name="toq-lossy"><code>h</code>, <code>d</code>, <code>t</code> with lossy type mapping to Python float.</ref>
| <code>b h d t c r m N I []</code>
| <code>b h d t S c r m N I []</code>
| <code>b h d t S c m N I []</code>
|-
! colspan="15" style="text-align:left; background:#9AA0AA; color:#fff" | OSCQuery server — VRChat attributes
|-
! style="text-align:left" | HTTP server
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="vq-minimal">Minimal VRChat-specific subset; only serves <code>/</code> and <code>/?HOST_INFO</code>.</ref>
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | HOST_INFO
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="vq-hostinfo">Returns <code>OSC_PORT</code> only; missing <code>NAME</code>, <code>EXTENSIONS</code>, <code>OSC_IP</code>, <code>OSC_TRANSPORT</code>.</ref>
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | FULL_PATH
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="vq-hardcoded">Hardcoded to <code>/avatar</code> and <code>/tracking</code> paths; not a dynamic OSC address tree.</ref>
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | CONTENTS
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="vq-hardcoded" />
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | TYPE
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | ACCESS
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | VALUE
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | RANGE
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="range-adv">Advertised as supported in HOST_INFO extensions but not implemented at the node level.</ref>
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="range-adv" />
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | DESCRIPTION
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="desc-adv">Supported on the node level but not advertised in HOST_INFO extensions.</ref>
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#D4890B; color:#fff" | Partial<ref group="osc" name="desc-adv" />
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! colspan="15" style="text-align:left; background:#9AA0AA; color:#fff" | OSCQuery server — additional OSCQuery attributes
|-
! style="text-align:left" | TAGS
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | EXTENDED_TYPE
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | UNIT
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | CRITICAL
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | CLIPMODE
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | OVERLOADS
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
|-
! colspan="15" style="text-align:left; background:#9AA0AA; color:#fff" | OSCQuery client
|-
! style="text-align:left" | HTTP client
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
|-
! colspan="15" style="text-align:left; background:#9AA0AA; color:#fff" | Service discovery
|-
! style="text-align:left" | mDNS advertisement
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
|-
! style="text-align:left" | mDNS discovery
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#22A84A; color:#fff" | Yes
| style="background:#22A84A; color:#fff" | Yes
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
| style="background:#C03030; color:#fff" | No
|}
{{reflist|group=osc}}


== OSC feature set ==
== OSC feature set ==
Line 498: Line 72:
Parameters are accessed through <code>/avatar/parameters/<ParameterName></code> addresses and support integer, float, and boolean data types.
Parameters are accessed through <code>/avatar/parameters/<ParameterName></code> addresses and support integer, float, and boolean data types.
Custom Avatar parameter names and behaviors are defined by individual avatar creators, but there are a number of [https://creators.vrchat.com/avatars/animator-parameters/#built-in-parameters reserved parameters].
Custom Avatar parameter names and behaviors are defined by individual avatar creators, but there are a number of [https://creators.vrchat.com/avatars/animator-parameters/#built-in-parameters reserved parameters].
All Avatar '''custom''' OSC endpoints are read-write, but all Avatar '''reserved''' OSC endpoints are read-only unless otherwise specified.
All Avatar '''custom''' OSC endpoints are read-write, but '''reserved''' endpoints are mostly read-only.


When an avatar is loaded with OSC enabled, VRChat sends a message to <code>/avatar/change</code> with the avatar's ID, and auto-generates a JSON config file at <code>%AppData%\..\LocalLow\VRChat\VRChat\OSC\{userId}\Avatars\{avatarId}.json</code>. This config maps parameter names to input and output OSC addresses and types, and can be edited to reroute data to other applications or convert between types.
When an avatar is loaded with OSC enabled, VRChat sends a message to <code>/avatar/change</code> with the avatar's ID, and auto-generates a JSON config file at <code>%AppData%\..\LocalLow\VRChat\VRChat\OSC\{userId}\Avatars\{avatarId}.json</code>. This config maps parameter names to input and output OSC addresses and types, and can be edited to reroute data to other applications or convert between types.
Line 508: Line 82:
| <code>/avatar/change</code>
| <code>/avatar/change</code>
| <code>,s</code>
| <code>,s</code>
| '''read-write''' Current user avatar id
| Current user avatar id
|-
|-
| <code>/avatar/parameters/VRCEmote</code>
| <code>/avatar/parameters/VRCEmote</code>
| <code>,i</code>
| <code>,i</code>
| '''read-write''' Default animation (1 to 16) [[Open_Sound_Control#parameter-common|&ast;]]
| Default animation (1 to 16) [[OSC#parameter-common|&ast;]]
|-
|-
| <code>/avatar/parameters/VRCFaceBlendV</code>
| <code>/avatar/parameters/VRCFaceBlendV</code>
| <code>,f</code>
| <code>,f</code>
| '''read-write''' [[Open_Sound_Control#parameter-common|&ast;]]
| [[OSC#parameter-common|&ast;]]
|-
|-
| <code>/avatar/parameters/VRCFaceBlendH</code>
| <code>/avatar/parameters/VRCFaceBlendH</code>
| <code>,f</code>
| <code>,f</code>
| '''read-write''' [[Open_Sound_Control#parameter-common|&ast;]]
| [[OSC#parameter-common|&ast;]]
|-
|-
| <code>/avatar/parameters/PreviewMode</code>
| <code>/avatar/parameters/PreviewMode</code>
| <code>,i</code>
| <code>,i</code>
| 1: Avatar in menu preview, otherwise 0 (OSC: '''always 0''')
| '''read-only''' 1: Avatar in menu preview, otherwise 0 (OSC: '''always 0''')
|-
|-
| <code>/avatar/parameters/IsOnFriendsList</code>
| <code>/avatar/parameters/IsOnFriendsList</code>
| <code>,T</code>
| <code>,T</code>
| Whether the local user is friends with the remote user with this avatar (OSC: '''always false''')
| '''read-only''' Whether the local user is friends with the remote user with this avatar (OSC: '''always false''')
|-
|-
| <code>/avatar/parameters/IsAnimatorEnabled</code>
| <code>/avatar/parameters/IsAnimatorEnabled</code>
| <code>,T</code>
| <code>,T</code>
| Whether the animator is enabled
| '''read-only''' Whether the animator is enabled
|-
|-
| <code>/avatar/parameters/AvatarVersion</code>
| <code>/avatar/parameters/AvatarVersion</code>
| <code>,i</code>
| <code>,i</code>
| 3 if the avatar was built using SDK3, otherwise 0
| '''read-only''' 3 if the avatar was built using SDK3, otherwise 0
|-
|-
| '''Gesture'''
| '''Gesture'''
Line 544: Line 118:
| <code>/avatar/parameters/GestureRightWeight</code>
| <code>/avatar/parameters/GestureRightWeight</code>
| <code>,f</code>
| <code>,f</code>
| Weight for right hand gesture
| '''read-only''' Weight for right hand gesture
|-
|-
| <code>/avatar/parameters/GestureLeftWeight</code>
| <code>/avatar/parameters/GestureLeftWeight</code>
| <code>,f</code>
| <code>,f</code>
| Weight for left hand gesture
| '''read-only''' Weight for left hand gesture
|-
|-
| <code>/avatar/parameters/GestureRight</code>
| <code>/avatar/parameters/GestureRight</code>
| <code>,i</code>
| <code>,i</code>
| Right hand gesture<ref>https://creators.vrchat.com/avatars/animator-parameters#gestureleft-and-gestureright-values</ref>
| '''read-only''' Right hand gesture<ref>https://creators.vrchat.com/avatars/animator-parameters#gestureleft-and-gestureright-values</ref>
|-
|-
| <code>/avatar/parameters/GestureLeft</code>
| <code>/avatar/parameters/GestureLeft</code>
| <code>,i</code>
| <code>,i</code>
| Left hand gesture
| '''read-only''' Left hand gesture
|-
|-
| '''Scaling'''
| '''Scaling'''
Line 564: Line 138:
| <code>/avatar/parameters/ScaleModified</code>
| <code>/avatar/parameters/ScaleModified</code>
| <code>,T</code>
| <code>,T</code>
| Whether the avatar scale has been changed from the default height
| '''read-only''' Whether the avatar scale has been changed from the default height
|-
|-
| <code>/avatar/parameters/ScaleFactor</code>
| <code>/avatar/parameters/ScaleFactor</code>
| <code>,f</code>
| <code>,f</code>
| Avatar current height / default height
| '''read-only''' Avatar current height / default height
|-
|-
| <code>/avatar/parameters/ScaleFactorInverse</code>
| <code>/avatar/parameters/ScaleFactorInverse</code>
| <code>,f</code>
| <code>,f</code>
| Reciprocal of above (default height / current height)
| '''read-only''' Reciprocal of above (default height / current height)
|-
|-
| <code>/avatar/parameters/EyeHeightAsMeters</code>
| <code>/avatar/parameters/EyeHeightAsMeters</code>
| <code>,f</code>
| <code>,f</code>
| Avatar current eye height in meters
| '''read-only''' Avatar current eye height in meters
|-
|-
| <code>/avatar/parameters/EyeHeightAsPercent</code>
| <code>/avatar/parameters/EyeHeightAsPercent</code>
| <code>,f</code>
| <code>,f</code>
| Linear interpolation of avatar current eye height between default limits (e.g., 0.0: 0.2 meters, 0.5: 2.6 meters, 1.0: 5.0 meters)
| '''read-only''' Linear interpolation of avatar current eye height between default limits (e.g., 0.0: 0.2 meters, 0.5: 2.6 meters, 1.0: 5.0 meters)
|-
| <code>/avatar/eyeheight</code>
| <code>,f</code>
| Avatar current eye height in meters. Settable in the range 0.01 (1 cm) to 10000 (10 km); only values between 0.1 and 100 are officially supported, and values outside that range trigger a warning on the user's HUD; when [[Special:MyLanguage/Udon|Udon]] enforces a scale, a write is first echoed back as the requested value, then followed by an event with the Udon-enforced eye height the user actually sees
|-
| <code>/avatar/eyeheightmin</code>
| <code>,f</code>
| '''read-only''' Minimum user-selectable eye height configured by Udon (defaults to <code>0.2</code>); does not affect the range settable via <code>/avatar/eyeheight</code>
|-
| <code>/avatar/eyeheightmax</code>
| <code>,f</code>
| '''read-only''' Maximum user-selectable eye height configured by Udon (defaults to <code>5.0</code>); does not affect the range settable via <code>/avatar/eyeheight</code>
|-
| <code>/avatar/eyeheightscalingallowed</code>
| <code>,T</code>
| '''read-only''' Whether OSC eye-height scaling is permitted; when disabled by Udon or by a world tag (configured via the website), writes to <code>/avatar/eyeheight</code> are ignored
|-
|-
| '''Sound'''
| '''Sound'''
Line 588: Line 178:
| <code>/avatar/parameters/Viseme</code>
| <code>/avatar/parameters/Viseme</code>
| <code>,i</code>
| <code>,i</code>
| The [[Visemes|viseme]] currently shown<ref>https://creators.vrchat.com/avatars/animator-parameters#viseme-values</ref>
| '''read-only''' The [[Visemes|viseme]] currently shown<ref>https://creators.vrchat.com/avatars/animator-parameters#viseme-values</ref>
|-
|-
| <code>/avatar/parameters/Voice</code>
| <code>/avatar/parameters/Voice</code>
| <code>,f</code>
| <code>,f</code>
| Microphone volume (0.0: silent, 1.0: loudest)
| '''read-only''' Microphone volume (0.0: silent, 1.0: loudest)
|-
|-
| <code>/avatar/parameters/Earmuffs</code>
| <code>/avatar/parameters/Earmuffs</code>
| <code>,T</code>
| <code>,T</code>
| Whether the user has Earmuff Mode enabled
| '''read-only''' Whether the user has Earmuff Mode enabled
|-
|-
| <code>/avatar/parameters/MuteSelf</code>
| <code>/avatar/parameters/MuteSelf</code>
| <code>,T</code>
| <code>,T</code>
| Whether the user has muted themselves
| '''read-only''' Whether the user has muted themselves
|-
|-
| '''Player'''
| '''Player'''
Line 608: Line 198:
| <code>/avatar/parameters/AFK</code>
| <code>/avatar/parameters/AFK</code>
| <code>,T</code>
| <code>,T</code>
| Whether the user is AFK
| '''read-only''' Whether the user is AFK
|-
|-
| <code>/avatar/parameters/InStation</code>
| <code>/avatar/parameters/InStation</code>
| <code>,T</code>
| <code>,T</code>
| Whether the user is in a station
| '''read-only''' Whether the user is in a station
|-
|-
| <code>/avatar/parameters/Seated</code>
| <code>/avatar/parameters/Seated</code>
| <code>,T</code>
| <code>,T</code>
| Duplicate of above, '''not''' "seated mode" vs. "standing mode"
| '''read-only''' Duplicate of above, '''not''' "seated mode" vs. "standing mode"
|-
|-
| <code>/avatar/parameters/VRMode</code>
| <code>/avatar/parameters/VRMode</code>
| <code>,i</code>
| <code>,i</code>
| 1: VR mode, otherwise 0
| '''read-only''' 1: VR mode, otherwise 0
|-
|-
| <code>/avatar/parameters/TrackingType</code>
| <code>/avatar/parameters/TrackingType</code>
| <code>,i</code>
| <code>,i</code>
| Number of currently tracked points<ref>https://creators.vrchat.com/avatars/animator-parameters#trackingtype-parameter</ref>
| '''read-only''' Number of currently tracked points<ref>https://creators.vrchat.com/avatars/animator-parameters#trackingtype-parameter</ref>
|-
|-
| '''Positioning'''
| '''Positioning'''
Line 632: Line 222:
| <code>/avatar/parameters/Grounded</code>
| <code>/avatar/parameters/Grounded</code>
| <code>,T</code>
| <code>,T</code>
| Whether the user is touching the floor in the world
| '''read-only''' Whether the user is touching the floor in the world
|-
|-
| <code>/avatar/parameters/Upright</code>
| <code>/avatar/parameters/Upright</code>
| <code>,f</code>
| <code>,f</code>
| Heuristic for how "upright" you are (0.0: prone, 1.0: standing straight up)
| '''read-only''' Heuristic for how "upright" you are (0.0: prone, 1.0: standing straight up)
|-
|-
| <code>/avatar/parameters/AngularY</code>
| <code>/avatar/parameters/AngularY</code>
| <code>,f</code>
| <code>,f</code>
| Rightward angular velocity
| '''read-only''' Rightward angular velocity
|-
|-
| <code>/avatar/parameters/VelocityX</code>
| <code>/avatar/parameters/VelocityX</code>
| <code>,f</code>
| <code>,f</code>
| Rightward velocity in m/s
| '''read-only''' Rightward velocity in m/s
|-
|-
| <code>/avatar/parameters/VelocityY</code>
| <code>/avatar/parameters/VelocityY</code>
| <code>,f</code>
| <code>,f</code>
| Upward velocity in m/s
| '''read-only''' Upward velocity in m/s
|-
|-
| <code>/avatar/parameters/VelocityZ</code>
| <code>/avatar/parameters/VelocityZ</code>
| <code>,f</code>
| <code>,f</code>
| Forward velocity in m/s
| '''read-only''' Forward velocity in m/s
|-
|-
| <code>/avatar/parameters/VelocityMagnitude</code>
| <code>/avatar/parameters/VelocityMagnitude</code>
| <code>,f</code>
| <code>,f</code>
| Total magnitude of velocity: &radic;( VelocityX &sup2; + VelocityY &sup2; + VelocityZ &sup2; )
| '''read-only''' Total magnitude of velocity: &radic;( VelocityX &sup2; + VelocityY &sup2; + VelocityZ &sup2; )
|}
|}
<span id="parameter-common">'''&ast;'''</span> ''technically not required/built-in, but these parameters are in the default animator and are almost always present''
<span id="parameter-common">'''&ast;'''</span> ''technically not required/built-in, but these parameters are in the default animator and are almost always present''
Line 677: Line 267:
| <code>/input/Horizontal</code>
| <code>/input/Horizontal</code>
| <code>,f</code>
| <code>,f</code>
| Player movement
| '''write-only''' Player movement
| right
| right
| left
| left
Line 683: Line 273:
| <code>/input/Vertical</code>
| <code>/input/Vertical</code>
| <code>,f</code>
| <code>,f</code>
| Player movement
| '''write-only''' Player movement
| forward
| forward
| backward
| backward
Line 689: Line 279:
| <code>/input/LookHorizontal</code>
| <code>/input/LookHorizontal</code>
| <code>,f</code>
| <code>,f</code>
| Player rotation [[Open_Sound_Control#input-smooth|&ast;]]
| '''write-only''' Player rotation [[OSC#input-smooth|&ast;]]
| right
| right
| left
| left
|-
|-
| <code>/input/LookVertical</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/input/LookVertical</code> [[OSC#osc-defacto|&dagger;]]
| <code>,f</code>
| <code>,f</code>
| Player rotation
| '''write-only''' Player rotation
| up
| up
| down
| down
Line 701: Line 291:
| <code>/input/SpinHoldCwCcw</code>
| <code>/input/SpinHoldCwCcw</code>
| <code>,f</code>
| <code>,f</code>
| Held item rotation
| '''write-only''' Held item rotation
| clockwise
| clockwise
| counter-clockwise
| counter-clockwise
Line 707: Line 297:
| <code>/input/SpinHoldUD</code>
| <code>/input/SpinHoldUD</code>
| <code>,f</code>
| <code>,f</code>
| Held item rotation
| '''write-only''' Held item rotation
| up
| up
| down
| down
Line 713: Line 303:
| <code>/input/SpinHoldLR</code>
| <code>/input/SpinHoldLR</code>
| <code>,f</code>
| <code>,f</code>
| Held item rotation
| '''write-only''' Held item rotation
| left
| left
| right
| right
Line 719: Line 309:
| <code>/input/MoveHoldFB</code>
| <code>/input/MoveHoldFB</code>
| <code>,f</code>
| <code>,f</code>
| Held item movement
| '''write-only''' Held item movement
| forward
| forward
| backward
| backward
|-
|-
| <code>/input/UseAxisRight</code> [[Open_Sound_Control#osc-limbo|&Dagger;]]
| <code>/input/UseAxisRight</code> [[OSC#osc-limbo|&Dagger;]]
| <code>,f</code>
| <code>,f</code>
| Held item use
| '''write-only''' Held item use
|
|
|
|
|-
|-
| <code>/input/GrabAxisRight</code> [[Open_Sound_Control#osc-limbo|&Dagger;]]
| <code>/input/GrabAxisRight</code> [[OSC#osc-limbo|&Dagger;]]
| <code>,f</code>
| <code>,f</code>
| Held item grab
| '''write-only''' Held item grab
|
|
|
|
Line 747: Line 337:
| <code>/input/MoveForward</code>
| <code>/input/MoveForward</code>
| <code>,T</code>
| <code>,T</code>
| Move forward
| '''write-only''' Move forward
|-
|-
| <code>/input/MoveBackward</code>
| <code>/input/MoveBackward</code>
| <code>,T</code>
| <code>,T</code>
| Move backward
| '''write-only''' Move backward
|-
|-
| <code>/input/MoveLeft</code>
| <code>/input/MoveLeft</code>
| <code>,T</code>
| <code>,T</code>
| Move left
| '''write-only''' Move left
|-
|-
| <code>/input/MoveRight</code>
| <code>/input/MoveRight</code>
| <code>,T</code>
| <code>,T</code>
| Move right
| '''write-only''' Move right
|-
|-
| <code>/input/LookLeft</code>
| <code>/input/LookLeft</code>
| <code>,T</code>
| <code>,T</code>
| Turn left [[Open_Sound_Control#input-smooth|&ast;]]
| '''write-only''' Turn left [[OSC#input-smooth|&ast;]]
|-
|-
| <code>/input/LookRight</code>
| <code>/input/LookRight</code>
| <code>,T</code>
| <code>,T</code>
| Turn right [[Open_Sound_Control#input-smooth|&ast;]]
| '''write-only''' Turn right [[OSC#input-smooth|&ast;]]
|-
|-
| <code>/input/Jump</code>
| <code>/input/Jump</code>
| <code>,T</code>
| <code>,T</code>
| Jump (if supported by the world)
| '''write-only''' Jump (if supported by the world)
|-
|-
| <code>/input/Run</code>
| <code>/input/Run</code>
| <code>,T</code>
| <code>,T</code>
| Run (if supported by the world)
| '''write-only''' Run (if supported by the world)
|-
|-
| <code>/input/ComfortLeft</code>
| <code>/input/ComfortLeft</code>
| <code>,T</code>
| <code>,T</code>
| Snap-Turn to the left (VR only)
| '''write-only''' Snap-Turn to the left (VR only)
|-
|-
| <code>/input/ComfortRight</code>
| <code>/input/ComfortRight</code>
| <code>,T</code>
| <code>,T</code>
| Snap-Turn to the right (VR only)
| '''write-only''' Snap-Turn to the right (VR only)
|-
|-
| <code>/input/GrabRight</code>
| <code>/input/GrabRight</code>
| <code>,T</code>
| <code>,T</code>
| Grab item highlighted by right hand
| '''write-only''' Grab item highlighted by right hand
|-
|-
| <code>/input/UseRight</code>
| <code>/input/UseRight</code>
| <code>,T</code>
| <code>,T</code>
| Use item held in right hand
| '''write-only''' Use item held in right hand
|-
|-
| <code>/input/DropRight</code>
| <code>/input/DropRight</code>
| <code>,T</code>
| <code>,T</code>
| Drop item held in right hand
| '''write-only''' Drop item held in right hand
|-
|-
| <code>/input/GrabLeft</code>
| <code>/input/GrabLeft</code>
| <code>,T</code>
| <code>,T</code>
| Grab item highlighted by left hand
| '''write-only''' Grab item highlighted by left hand
|-
|-
| <code>/input/UseLeft</code>
| <code>/input/UseLeft</code>
| <code>,T</code>
| <code>,T</code>
| Use item held in left hand
| '''write-only''' Use item held in left hand
|-
|-
| <code>/input/DropLeft</code>
| <code>/input/DropLeft</code>
| <code>,T</code>
| <code>,T</code>
| Drop item held in left hand
| '''write-only''' Drop item held in left hand
|-
|-
| <code>/input/PanicButton</code>
| <code>/input/PanicButton</code>
| <code>,T</code>
| <code>,T</code>
| Enable Safe Mode
| '''write-only''' Enable Safe Mode
|-
|-
| <code>/input/QuickMenuToggleLeft</code>
| <code>/input/QuickMenuToggleLeft</code>
| <code>,T</code>
| <code>,T</code>
| Toggle Quick Menu for left hand
| '''write-only''' Toggle Quick Menu for left hand
|-
|-
| <code>/input/QuickMenuToggleRight</code>
| <code>/input/QuickMenuToggleRight</code>
| <code>,T</code>
| <code>,T</code>
| Toggle Quick Menu for right hand
| '''write-only''' Toggle Quick Menu for right hand
|-
|-
| <code>/input/ToggleSitStand</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/input/ToggleSitStand</code> [[OSC#osc-defacto|&dagger;]]
| <code>,T</code>
| <code>,T</code>
| Toggle between Sitting and Standing
| '''write-only''' Toggle between Sitting and Standing
|-
|-
| <code>/input/AFKToggle</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/input/AFKToggle</code> [[OSC#osc-defacto|&dagger;]]
| <code>,T</code>
| <code>,T</code>
| Toggle AFK mode
| '''write-only''' Toggle AFK mode
|-
|-
| <code>/input/Voice</code>
| <code>/input/Voice</code>
| <code>,T</code>
| <code>,T</code>
| Microphone control. Behavior depends on the [[Settings#Microphone|"Microphone Behaviour" setting]]. When on, changing from false to true toggles the mute state; while true, controller/keyboard mute is blocked; when off, acts as push-to-talk (false = muted, true = unmuted)
| '''write-only''' Microphone control. Behavior depends on the [[Settings#Microphone|"Microphone Behaviour" setting]]. When on, changing from false to true toggles the mute state; while true, controller/keyboard mute is blocked; when off, acts as push-to-talk (false = muted, true = unmuted)
|-
|-
| <code>/input/ShowDebugInfo0</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/input/ShowDebugInfo0</code> [[OSC#osc-defacto|&dagger;]]
| <code>,T</code>
| <code>,T</code>
| Displays some debugging visualizations for VRC_UiShapes (interactable UIs) [[Open_Sound_Control#input-dbgauthor|&#x2051;]]
| '''write-only''' Displays some debugging visualizations for VRC_UiShapes (interactable UIs) [[OSC#input-dbgauthor|&#x2051;]]
|-
|-
| <code>/input/ShowDebugInfo1</code>
| <code>/input/ShowDebugInfo1</code>
| <code>,T</code>
| <code>,T</code>
| Displays information about loaded asset bundles (mostly irrelevant to world development)
| '''write-only''' Displays information about loaded asset bundles (mostly irrelevant to world development)
|-
|-
| <code>/input/ShowDebugInfo2</code>
| <code>/input/ShowDebugInfo2</code>
| <code>,T</code>
| <code>,T</code>
| Displays the current build of VRChat that you are using, along with your FPS
| '''write-only''' Displays the current build of VRChat that you are using, along with your FPS
|-
|-
| <code>/input/ShowDebugInfo3</code>
| <code>/input/ShowDebugInfo3</code>
| <code>,T</code>
| <code>,T</code>
| Displays your output log
| '''write-only''' Displays your output log
|-
|-
| <code>/input/ShowDebugInfo4</code>
| <code>/input/ShowDebugInfo4</code>
| <code>,T</code>
| <code>,T</code>
| Displays various stats about other users
| '''write-only''' Displays various stats about other users
|-
|-
| <code>/input/ShowDebugInfo5</code>
| <code>/input/ShowDebugInfo5</code>
| <code>,T</code>
| <code>,T</code>
| Displays some graphs related to networking
| '''write-only''' Displays some graphs related to networking
|-
|-
| <code>/input/ShowDebugInfo6</code>
| <code>/input/ShowDebugInfo6</code>
| <code>,T</code>
| <code>,T</code>
| Displays all the networked objects in your world, along with various stats [[Open_Sound_Control#input-dbgauthor|&#x2051;]]
| '''write-only''' Displays all the networked objects in your world, along with various stats [[OSC#input-dbgauthor|&#x2051;]]
|-
|-
| <code>/input/ShowDebugInfo7</code>
| <code>/input/ShowDebugInfo7</code>
| <code>,T</code>
| <code>,T</code>
| Overlays visual representations of every PhysBone and Contact in the world near the local player [[Open_Sound_Control#input-dbgauthor|&#x2051;]]
| '''write-only''' Overlays visual representations of every PhysBone and Contact in the world near the local player [[OSC#input-dbgauthor|&#x2051;]]
|-
|-
| <code>/input/ShowDebugInfo8</code>
| <code>/input/ShowDebugInfo8</code>
| <code>,T</code>
| <code>,T</code>
| Overlays a panel on top of every synced object in the world; Each panel displays various stats about that specific object [[Open_Sound_Control#input-dbgauthor|&#x2051;]]
| '''write-only''' Overlays a panel on top of every synced object in the world; each panel displays various stats about that specific object [[OSC#input-dbgauthor|&#x2051;]]
|-
|-
| <code>/input/ShowDebugInfo9</code>
| <code>/input/ShowDebugInfo9</code>
| <code>,T</code>
| <code>,T</code>
| Displays debug stats for every player in the instance at their feet [[Open_Sound_Control#input-dbgauthor|&#x2051;]]
| '''write-only''' Displays debug stats for every player in the instance at their feet [[OSC#input-dbgauthor|&#x2051;]]
|}
|}
The <code>/input/ShowDebugInfo[0-9]</code> endpoints are for [https://creators.vrchat.com/worlds/udon/world-debug-views/ World Debug Views]
The <code>/input/ShowDebugInfo[0-9]</code> endpoints are for [https://creators.vrchat.com/worlds/udon/world-debug-views/ World Debug Views]
Line 886: Line 476:
| <code>/chatbox/input</code>
| <code>/chatbox/input</code>
| <code>,sTT</code>
| <code>,sTT</code>
| Set Chatbox content
| '''write-only''' Set Chatbox content
|-
|-
|
|
Line 902: Line 492:
| <code>/chatbox/typing</code>
| <code>/chatbox/typing</code>
| <code>,T</code>
| <code>,T</code>
| Set Chatbox typing indicator visibility (the <code>...</code>)
| '''write-only''' Set Chatbox typing indicator visibility (the <code>...</code>)
|}
|}


=== Tracking ===
=== Tracking ===
All [https://docs.vrchat.com/docs/osc-trackers Tracking] and [https://docs.vrchat.com/docs/osc-eye-tracking Eye Tracking] OSC endpoints are write-only unless otherwise specified.
Most [https://docs.vrchat.com/docs/osc-trackers Tracking] and [https://docs.vrchat.com/docs/osc-eye-tracking Eye Tracking] OSC endpoints are write-only, as their purpose is to supply VRChat with custom tracking data.
Up to 8 trackers are supported (hip, chest, 2 feet, 2 knees, 2 elbows), though sending fewer trackers (e.g. only feet and hips) may produce better results because VRChat's IK can better compensate for tracking discrepancies<ref>[https://docs.vrchat.com/docs/osc-trackers "OSC Trackers"] on ''docs.vrchat.com''.</ref>.
Up to 8 trackers are supported (hip, chest, 2 feet, 2 knees, 2 elbows), though sending fewer trackers (e.g. only feet and hips) may produce better results because VRChat's IK can better compensate for tracking discrepancies<ref>[https://docs.vrchat.com/docs/osc-trackers "OSC Trackers"] on ''docs.vrchat.com''.</ref>.
Sending the <code>/tracking/trackers/head/...</code> values is optional; if supplied, VRChat will use them as the frame of reference for the other OSC trackers. The head position aligns per frame with no interpolation, while head rotation yaw alignment slowly lerps toward the provided value. A single head rotation message (no follow-up within 300 ms) triggers a one-time instant yaw alignment instead.
Sending the <code>/tracking/trackers/head/...</code> values is optional; if supplied, VRChat will use them as the frame of reference for the other OSC trackers. The head position aligns per frame with no interpolation, while head rotation yaw alignment slowly lerps toward the provided value. A single head rotation message (no follow-up within 300 ms) triggers a one-time instant yaw alignment instead.
Line 917: Line 507:
| <code>/tracking/trackers/[1-8]/position</code>
| <code>/tracking/trackers/[1-8]/position</code>
| <code>,fff</code>
| <code>,fff</code>
| The position of the tracker
| '''write-only''' Position of the tracker
|-
|-
|  
|  
Line 933: Line 523:
| <code>/tracking/trackers/[1-8]/rotation</code>
| <code>/tracking/trackers/[1-8]/rotation</code>
| <code>,fff</code>
| <code>,fff</code>
| The rotation of the tracker
| '''write-only''' Rotation of the tracker
|-
|-
|  
|  
Line 949: Line 539:
| <code>/tracking/trackers/head/position</code>
| <code>/tracking/trackers/head/position</code>
| <code>,fff</code>
| <code>,fff</code>
| The position of the headset (see <code>.../position</code> above)
| '''write-only''' Position of the headset (see <code>.../position</code> above)
|-
|-
| <code>/tracking/trackers/head/rotation</code>
| <code>/tracking/trackers/head/rotation</code>
| <code>,fff</code>
| <code>,fff</code>
| The rotation of the headset (see <code>.../rotation</code> above)
| '''write-only''' Rotation of the headset (see <code>.../rotation</code> above)
|-
|-
| <code>/tracking/eye/EyesClosedAmount</code>
| <code>/tracking/eye/EyesClosedAmount</code>
| <code>,f</code>
| <code>,f</code>
| How closed the eyes are (0.0: fully open, 1.0: fully closed). Controls both eyes simultaneously.
| '''write-only''' How closed the eyes are (0.0: fully open, 1.0: fully closed); controls both eyes simultaneously
|-
|-
| <code>/tracking/eye/CenterPitchYaw</code>
| <code>/tracking/eye/CenterPitchYaw</code>
| <code>,ff</code>
| <code>,ff</code>
| Pitch and yaw for automatic raycast (eyes look at hit location). Should not be used at the same time as <code>/tracking/eye/CenterPitchYawDist</code>.
| '''write-only''' Pitch and yaw for automatic raycast (eyes look at hit location); should not be used at the same time as <code>/tracking/eye/CenterPitchYawDist</code>
|-
|-
|  
|  
Line 973: Line 563:
| <code>/tracking/eye/CenterPitchYawDist</code>
| <code>/tracking/eye/CenterPitchYawDist</code>
| <code>,fff</code>
| <code>,fff</code>
| Pitch, yaw, and distance for raycast (eyes look at vector position). Should not be used at the same time as <code>/tracking/eye/CenterPitchYaw</code>.
| '''write-only''' Pitch, yaw, and distance for raycast (eyes look at vector position); should not be used at the same time as <code>/tracking/eye/CenterPitchYaw</code>
|-
|-
|  
|  
Line 989: Line 579:
| <code>/tracking/eye/CenterVec</code>
| <code>/tracking/eye/CenterVec</code>
| <code>,fff</code>
| <code>,fff</code>
| Headset-local '''normalized''' vector for automatic raycast (eyes look at hit location)
| '''write-only''' Headset-local '''normalized''' vector for automatic raycast (eyes look at hit location)
|-
|-
|  
|  
Line 1,005: Line 595:
| <code>/tracking/eye/CenterVecFull</code>
| <code>/tracking/eye/CenterVecFull</code>
| <code>,fff</code>
| <code>,fff</code>
| Headset-local vector for raycast (eyes look at vector position)
| '''write-only''' Headset-local vector for raycast (eyes look at vector position)
|-
|-
|  
|  
Line 1,021: Line 611:
| <code>/tracking/eye/LeftRightPitchYaw</code>
| <code>/tracking/eye/LeftRightPitchYaw</code>
| <code>,ffff</code>
| <code>,ffff</code>
| Pitch and yaw for each eye individually
| '''write-only''' Pitch and yaw for each eye individually
|-
|-
|  
|  
Line 1,041: Line 631:
| <code>/tracking/eye/LeftRightVec</code>
| <code>/tracking/eye/LeftRightVec</code>
| <code>,ffffff</code>
| <code>,ffffff</code>
| Headset-local '''normalized''' vectors for each eye individually
| '''write-only''' Headset-local '''normalized''' vectors for each eye individually
|-
|-
|  
|  
Line 1,067: Line 657:
| Cartesian Z coordinate for right eye
| Cartesian Z coordinate for right eye
|-
|-
| <code>/tracking/vrsystem/head/pose</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/tracking/vrsystem/head/pose</code> [[OSC#osc-defacto|&dagger;]]
| <code>,ffffff</code>
| <code>,ffffff</code>
| The '''read-only''' system pose for the headset
| '''read-only''' System pose for the headset
|-
|-
|  
|  
Line 1,095: Line 685:
| Euler Z angle
| Euler Z angle
|-
|-
| <code>/tracking/vrsystem/leftwrist/pose</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/tracking/vrsystem/leftwrist/pose</code> [[OSC#osc-defacto|&dagger;]]
| <code>,ffffff</code>
| <code>,ffffff</code>
| The '''read-only''' system pose for the left wrist (see <code>.../head/pose</code> above)
| '''read-only''' System pose for the left wrist (see <code>.../head/pose</code> above)
|-
|-
| <code>/tracking/vrsystem/rightwrist/pose</code> [[Open_Sound_Control#osc-defacto|&dagger;]]
| <code>/tracking/vrsystem/rightwrist/pose</code> [[OSC#osc-defacto|&dagger;]]
| <code>,ffffff</code>
| <code>,ffffff</code>
| The '''read-only''' system pose for the right wrist (see <code>.../head/pose</code> above)
| '''read-only''' System pose for the right wrist (see <code>.../head/pose</code> above)
|}
|}
==== Coordinates ====
==== Coordinates ====
Line 1,144: Line 734:
| <code>,T</code>
| <code>,T</code>
| Close camera <br> Equivalent to <code>/usercamera/Mode ,i 0</code>
| Close camera <br> Equivalent to <code>/usercamera/Mode ,i 0</code>
| '''write-only''' see [[Open_Sound_Control#Buttons|buttons]]
| '''write-only''' see [[OSC#Buttons|buttons]]
|-
|-
| <code>/usercamera/Capture</code>
| <code>/usercamera/Capture</code>
| <code>,T</code>
| <code>,T</code>
| Take a photo
| Take a photo
| '''write-only''' see [[Open_Sound_Control#Buttons|buttons]]
| '''write-only''' see [[OSC#Buttons|buttons]]
|-
|-
| <code>/usercamera/CaptureDelayed</code>
| <code>/usercamera/CaptureDelayed</code>
| <code>,T</code>
| <code>,T</code>
| Take a timed photo
| Take a timed photo
| '''write-only''' see [[Open_Sound_Control#Buttons|buttons]]
| '''write-only''' see [[OSC#Buttons|buttons]]
|}
|}
==== Toggles ====
==== Toggles ====
Line 1,343: Line 933:


=== Dolly ===
=== Dolly ===
All [[Camera Dolly#OSC integration|Dolly]] OSC endpoints are write-only unless otherwise specified.
All [[Camera Dolly#OSC integration|Dolly]] OSC endpoints are read-write unless otherwise specified.
{| class="wikitable"
{| class="wikitable"
! Address
! Address
! Type
! Type
! Description
! Description
!
|-
|-
| <code>/dolly/Import</code>
| <code>/dolly/Import</code>
| <code>,s</code>
| <code>,s</code>
| Import dolly path from a JSON file
| '''write-only''' Import dolly path from a JSON file
|
|-
|-
| <code>/dolly/Export</code>
| <code>/dolly/Export</code>
| <code>,s</code>
| <code>,s</code>
| Export current dolly path to a JSON file<br>Emits an OSC message when export is complete
| '''write-only''' Export current dolly path to a JSON file<br>Emits an OSC message when export is complete
|
|-
|-
| <code>/dolly/ExportLocal</code>
| <code>/dolly/ExportLocal</code>
| <code>,s</code>
| <code>,s</code>
| As above, but exports all points as local
| '''write-only''' As above, but exports all points as local
|
|-
|-
| <code>/dolly/PlayDelayed</code>
| <code>/dolly/PlayDelayed</code>
| <code>,f</code>
| <code>,f</code>
| Play an animation after a delay (in seconds)
| '''write-only''' Play an animation after a delay (in seconds)
|
|-
|-
| <code>/dolly/Play</code>
| <code>/dolly/Play</code>
| <code>,T</code>
| <code>,T</code>
| Play or stop an animation<br>Skip delay or cancel a delayed animation<br>Emits an OSC message when animation state changes
| Play or stop an animation<br>Skip delay or cancel a delayed animation<br>Emits an OSC message when animation state changes
| '''read-write'''
|}
|}


Line 1,403: Line 987:
| UDP '''5353'''
| UDP '''5353'''
| mDNS ↔ VRChat
| mDNS ↔ VRChat
| multicastDNS Service Discovery<ref>https://www.rfc-editor.org/info/rfc6763</ref>
| multicastDNS Service Discovery<ref>https://www.rfc-editor.org/info/rfc6763</ref><ref>https://ccrma.stanford.edu/groups/osc/files/2009-NIME-OSC-1.1.pdf</ref>
|}
|}
The UDP ports can be overridden with a command line argument: <code>--osc=inPort:senderIP:outPort</code>. For example, <code>--osc=9000:127.0.0.1:9001</code> replicates the defaults, and <code>--osc=9000:192.168.1.42:9001</code> would send data to another device on the local network.
The UDP ports can be overridden with a command line argument: <code>--osc=inPort:senderIP:outPort</code>. For example, <code>--osc=9000:127.0.0.1:9001</code> replicates the defaults, and <code>--osc=9000:192.168.1.42:9001</code> would send data to another device on the local network.


You can manually find the port numbers for these features by searching the current log file for a line that looks like <br><code>2025.01.02 03:04:05 Debug      -  Advertising Service VRChat-Client-A1B2C3 of type OSCQuery on 42069</code> or <br><code>2025.01.02 03:04:05 Debug      -  Advertising Service VRChat-Client-A1B2C3 of type OSC on 9000</code>
You can manually find the port numbers for these features by searching the current log file for a line that looks like <br><code>2025.01.02 03:04:05 Debug      -  Advertising Service VRChat-Client-A1B2C3 of type OSCQuery on 42069</code> or <br><code>2025.01.02 03:04:05 Debug      -  Advertising Service VRChat-Client-A1B2C3 of type OSC on 9000</code>
== Community resources ==
{{Noticebox/Community}}
''See also [[Special:MyLanguage/Community:OSC Resources|Community:OSC Resources]] for more detailed information.''
The community has made useful resources for using OSC and developing OSC, such as tools and libraries. See [[Special:MyLanguage/Community:OSC Resources|here]].


== Resources ==
== Resources ==
* [https://docs.vrchat.com/docs/osc-overview OSC Overview] on the VRChat Documentation
* [https://docs.vrchat.com/docs/osc-overview OSC Overview] on the VRChat Documentation
* [https://docs.vrchat.com/docs/osc-avatar-scaling OSC Avatar Scaling] on the VRChat Documentation
* [https://github.com/vrchat-community/osc/discussions GitHub] discussions for VRChat OSC
* [https://github.com/vrchat-community/osc/discussions GitHub] discussions for VRChat OSC
* [https://github.com/vrchat-community/osc/issues GitHub] bug reports for VRChat OSC
* [https://github.com/vrchat-community/osc/issues GitHub] bug reports for VRChat OSC
Line 1,419: Line 1,010:
==References==
==References==
{{reflist}}
{{reflist}}
[[Category:Features]]
[[Category:Features{{#translation:}}]]
[[Category:Needs images]]

Latest revision as of 03:03, 2 May 2026

V · EThis is an official VRChat information page!
It is reviewed and approved by the VRCWiki Team. Learn how to contribute to this page by reading the Contribution Guide.

OSC (Open Sound Control) is a protocol originally designed for communication between audio devices and controllers, but its flexibility has made it popular for a wide variety of real-time control applications[1]. VRChat announced OSC support for avatars on February 16, 2022[2], and the feature shipped in the 2022.1.1[3] update on February 24, 2022. OSC is commonly used by body-, eye- and face trackers to communicate with VRChat, as well as by other applications that automate Avatar parameters.

Enabling OSC

OSC can be enabled from the Action Menu under OSC > Enabled. Once enabled, VRChat begins listening for incoming OSC messages and sending outgoing parameter data.

An OSC Debug screen is also available in the Action Menu under OSC > OSC Debug. It floats in front of the user and visualizes all incoming OSC messages, showing their addresses and values in real time. Opening this screen also enables OSC if it was previously disabled.

OSCQuery

OSCQuery is a protocol to connect OSC applications together more easily. Information on how to connect with VRChat with OSCQuery is available on the VRChat OSCQuery GitHub Wiki.

OSC feature set

OSC enables control and monitoring of multiple systems within VRChat, including input controls, avatar parameters, chatbox functionality, and camera systems such as the Camera Dolly.

OSC messages

Many of VRChat's OSC endpoints can accept multiple values in one message, and each value must be one of certain types:

Name Type Description
int i 32-bit signed integer (big-endian)
float f 32-bit IEEE 754 single-precision float (big-endian)
boolean T or F Boolean true or false, respectively
string s ASCII text (some endpoints explicitly accept UTF-8 encoded text)

In an OSC message, the string specifying the types of the message's values begins with a , followed by one character for each type[4], and in the following tables, the type of the whole message is listed.

Sometimes, when an OSC message has only one parameter, VRChat may accept an equivalent value of a different type:

boolean int float
false 0 0.0
true 1 1.0

For example, if the Avatar parameter /avatar/parameters/TurboEncabulator is a boolean, sending any of
/avatar/parameters/TurboEncabulator ,T,
/avatar/parameters/TurboEncabulator ,i 1, or
/avatar/parameters/TurboEncabulator ,f 1.0 as a message will set the parameter to true.

VRChat accepts and processes messages sent inside of OSC bundles, but does not itself send any bundles.

Avatar

OSC provides read and write access to avatar parameters, enabling real-time control of avatar expressions, animations, and custom behaviors. Parameters are accessed through /avatar/parameters/<ParameterName> addresses and support integer, float, and boolean data types. Custom Avatar parameter names and behaviors are defined by individual avatar creators, but there are a number of reserved parameters. All Avatar custom OSC endpoints are read-write, but reserved endpoints are mostly read-only.

When an avatar is loaded with OSC enabled, VRChat sends a message to /avatar/change with the avatar's ID, and auto-generates a JSON config file at %AppData%\..\LocalLow\VRChat\VRChat\OSC\{userId}\Avatars\{avatarId}.json. This config maps parameter names to input and output OSC addresses and types, and can be edited to reroute data to other applications or convert between types.

Address Type Description
/avatar/change ,s Current user avatar id
/avatar/parameters/VRCEmote ,i Default animation (1 to 16) *
/avatar/parameters/VRCFaceBlendV ,f *
/avatar/parameters/VRCFaceBlendH ,f *
/avatar/parameters/PreviewMode ,i read-only 1: Avatar in menu preview, otherwise 0 (OSC: always 0)
/avatar/parameters/IsOnFriendsList ,T read-only Whether the local user is friends with the remote user with this avatar (OSC: always false)
/avatar/parameters/IsAnimatorEnabled ,T read-only Whether the animator is enabled
/avatar/parameters/AvatarVersion ,i read-only 3 if the avatar was built using SDK3, otherwise 0
Gesture
/avatar/parameters/GestureRightWeight ,f read-only Weight for right hand gesture
/avatar/parameters/GestureLeftWeight ,f read-only Weight for left hand gesture
/avatar/parameters/GestureRight ,i read-only Right hand gesture[5]
/avatar/parameters/GestureLeft ,i read-only Left hand gesture
Scaling
/avatar/parameters/ScaleModified ,T read-only Whether the avatar scale has been changed from the default height
/avatar/parameters/ScaleFactor ,f read-only Avatar current height / default height
/avatar/parameters/ScaleFactorInverse ,f read-only Reciprocal of above (default height / current height)
/avatar/parameters/EyeHeightAsMeters ,f read-only Avatar current eye height in meters
/avatar/parameters/EyeHeightAsPercent ,f read-only Linear interpolation of avatar current eye height between default limits (e.g., 0.0: 0.2 meters, 0.5: 2.6 meters, 1.0: 5.0 meters)
/avatar/eyeheight ,f Avatar current eye height in meters. Settable in the range 0.01 (1 cm) to 10000 (10 km); only values between 0.1 and 100 are officially supported, and values outside that range trigger a warning on the user's HUD; when Udon enforces a scale, a write is first echoed back as the requested value, then followed by an event with the Udon-enforced eye height the user actually sees
/avatar/eyeheightmin ,f read-only Minimum user-selectable eye height configured by Udon (defaults to 0.2); does not affect the range settable via /avatar/eyeheight
/avatar/eyeheightmax ,f read-only Maximum user-selectable eye height configured by Udon (defaults to 5.0); does not affect the range settable via /avatar/eyeheight
/avatar/eyeheightscalingallowed ,T read-only Whether OSC eye-height scaling is permitted; when disabled by Udon or by a world tag (configured via the website), writes to /avatar/eyeheight are ignored
Sound
/avatar/parameters/Viseme ,i read-only The viseme currently shown[6]
/avatar/parameters/Voice ,f read-only Microphone volume (0.0: silent, 1.0: loudest)
/avatar/parameters/Earmuffs ,T read-only Whether the user has Earmuff Mode enabled
/avatar/parameters/MuteSelf ,T read-only Whether the user has muted themselves
Player
/avatar/parameters/AFK ,T read-only Whether the user is AFK
/avatar/parameters/InStation ,T read-only Whether the user is in a station
/avatar/parameters/Seated ,T read-only Duplicate of above, not "seated mode" vs. "standing mode"
/avatar/parameters/VRMode ,i read-only 1: VR mode, otherwise 0
/avatar/parameters/TrackingType ,i read-only Number of currently tracked points[7]
Positioning
/avatar/parameters/Grounded ,T read-only Whether the user is touching the floor in the world
/avatar/parameters/Upright ,f read-only Heuristic for how "upright" you are (0.0: prone, 1.0: standing straight up)
/avatar/parameters/AngularY ,f read-only Rightward angular velocity
/avatar/parameters/VelocityX ,f read-only Rightward velocity in m/s
/avatar/parameters/VelocityY ,f read-only Upward velocity in m/s
/avatar/parameters/VelocityZ ,f read-only Forward velocity in m/s
/avatar/parameters/VelocityMagnitude ,f read-only Total magnitude of velocity: √( VelocityX ² + VelocityY ² + VelocityZ ² )

* technically not required/built-in, but these parameters are in the default animator and are almost always present

Input

OSC can trigger VRChat input actions by sending messages to /input/* addresses. This includes movement controls, view rotation, jumping, voice toggling, and VR-specific interactions. All Input OSC endpoints are write-only.

Axes

These expect a float from -1 to 1 to control things like movement. They must be reset to 0 when not in use: a /input/Vertical ,f 1 message without a corresponding /input/Vertical ,f 0 will continue to move you forward forever.

Address Type Description +1 -1
/input/Horizontal ,f write-only Player movement right left
/input/Vertical ,f write-only Player movement forward backward
/input/LookHorizontal ,f write-only Player rotation * right left
/input/LookVertical ,f write-only Player rotation up down
/input/SpinHoldCwCcw ,f write-only Held item rotation clockwise counter-clockwise
/input/SpinHoldUD ,f write-only Held item rotation up down
/input/SpinHoldLR ,f write-only Held item rotation left right
/input/MoveHoldFB ,f write-only Held item movement forward backward
/input/UseAxisRight ,f write-only Held item use
/input/GrabAxisRight ,f write-only Held item grab

Buttons

These expect a boolean of true for "pressed" and false for "released". For compatibility, they also accept ints of 0 and 1, equivalent to false/"released" and true/"pressed" respectively. They must be reset to false when not in use: a /input/MoveForward ,T message without a corresponding /input/MoveForward ,F will continue to move you forward forever. They must also be reset to false before they can be used again: sending a /input/Jump ,T and then another /input/Jump ,T without a /input/Jump ,F between them will only result in a single jump.

Address Type Description
/input/MoveForward ,T write-only Move forward
/input/MoveBackward ,T write-only Move backward
/input/MoveLeft ,T write-only Move left
/input/MoveRight ,T write-only Move right
/input/LookLeft ,T write-only Turn left *
/input/LookRight ,T write-only Turn right *
/input/Jump ,T write-only Jump (if supported by the world)
/input/Run ,T write-only Run (if supported by the world)
/input/ComfortLeft ,T write-only Snap-Turn to the left (VR only)
/input/ComfortRight ,T write-only Snap-Turn to the right (VR only)
/input/GrabRight ,T write-only Grab item highlighted by right hand
/input/UseRight ,T write-only Use item held in right hand
/input/DropRight ,T write-only Drop item held in right hand
/input/GrabLeft ,T write-only Grab item highlighted by left hand
/input/UseLeft ,T write-only Use item held in left hand
/input/DropLeft ,T write-only Drop item held in left hand
/input/PanicButton ,T write-only Enable Safe Mode
/input/QuickMenuToggleLeft ,T write-only Toggle Quick Menu for left hand
/input/QuickMenuToggleRight ,T write-only Toggle Quick Menu for right hand
/input/ToggleSitStand ,T write-only Toggle between Sitting and Standing
/input/AFKToggle ,T write-only Toggle AFK mode
/input/Voice ,T write-only Microphone control. Behavior depends on the "Microphone Behaviour" setting. When on, changing from false to true toggles the mute state; while true, controller/keyboard mute is blocked; when off, acts as push-to-talk (false = muted, true = unmuted)
/input/ShowDebugInfo0 ,T write-only Displays some debugging visualizations for VRC_UiShapes (interactable UIs)
/input/ShowDebugInfo1 ,T write-only Displays information about loaded asset bundles (mostly irrelevant to world development)
/input/ShowDebugInfo2 ,T write-only Displays the current build of VRChat that you are using, along with your FPS
/input/ShowDebugInfo3 ,T write-only Displays your output log
/input/ShowDebugInfo4 ,T write-only Displays various stats about other users
/input/ShowDebugInfo5 ,T write-only Displays some graphs related to networking
/input/ShowDebugInfo6 ,T write-only Displays all the networked objects in your world, along with various stats
/input/ShowDebugInfo7 ,T write-only Overlays visual representations of every PhysBone and Contact in the world near the local player
/input/ShowDebugInfo8 ,T write-only Overlays a panel on top of every synced object in the world; each panel displays various stats about that specific object
/input/ShowDebugInfo9 ,T write-only Displays debug stats for every player in the instance at their feet

The /input/ShowDebugInfo[0-9] endpoints are for World Debug Views

* smooth-turn in Desktop; will snap-turn in VR when value 1 or true if Comfort Turning is on

only accessible to the world creator unless they have turned on "World Debugging" via the website

Chatbox

Address Type Description
/chatbox/input ,sTT write-only Set Chatbox content
1st parameter s Text to input/send (144 character, 9 line maximum; supports UTF-8 text)
2nd parameter T Whether to send immediately, otherwise open the keyboard and populate the text
3rd parameter T Whether to trigger the notification SFX (optional, defaults to true; only applicable if text is sent immediately)
/chatbox/typing ,T write-only Set Chatbox typing indicator visibility (the ...)

Tracking

Most Tracking and Eye Tracking OSC endpoints are write-only, as their purpose is to supply VRChat with custom tracking data. Up to 8 trackers are supported (hip, chest, 2 feet, 2 knees, 2 elbows), though sending fewer trackers (e.g. only feet and hips) may produce better results because VRChat's IK can better compensate for tracking discrepancies[8]. Sending the /tracking/trackers/head/... values is optional; if supplied, VRChat will use them as the frame of reference for the other OSC trackers. The head position aligns per frame with no interpolation, while head rotation yaw alignment slowly lerps toward the provided value. A single head rotation message (no follow-up within 300 ms) triggers a one-time instant yaw alignment instead. After 10 seconds without receiving data, eye tracking behavior will revert to default (auto look / auto blink). This timeout is separate for eyelids and eye-look.

Address Type Description
/tracking/trackers/[1-8]/position ,fff write-only Position of the tracker
1st parameter f Cartesian X coordinate
2nd parameter f Cartesian Y coordinate
3rd parameter f Cartesian Z coordinate
/tracking/trackers/[1-8]/rotation ,fff write-only Rotation of the tracker
1st parameter f Euler X angle
2nd parameter f Euler Y angle
3rd parameter f Euler Z angle
/tracking/trackers/head/position ,fff write-only Position of the headset (see .../position above)
/tracking/trackers/head/rotation ,fff write-only Rotation of the headset (see .../rotation above)
/tracking/eye/EyesClosedAmount ,f write-only How closed the eyes are (0.0: fully open, 1.0: fully closed); controls both eyes simultaneously
/tracking/eye/CenterPitchYaw ,ff write-only Pitch and yaw for automatic raycast (eyes look at hit location); should not be used at the same time as /tracking/eye/CenterPitchYawDist
1st parameter f Euler X angle
2nd parameter f Euler Y angle
/tracking/eye/CenterPitchYawDist ,fff write-only Pitch, yaw, and distance for raycast (eyes look at vector position); should not be used at the same time as /tracking/eye/CenterPitchYaw
1st parameter f Euler X angle
2nd parameter f Euler Y angle
3rd parameter f Raycast distance
/tracking/eye/CenterVec ,fff write-only Headset-local normalized vector for automatic raycast (eyes look at hit location)
1st parameter f Cartesian X coordinate
2nd parameter f Cartesian Y coordinate
3rd parameter f Cartesian Z coordinate
/tracking/eye/CenterVecFull ,fff write-only Headset-local vector for raycast (eyes look at vector position)
1st parameter f Cartesian X coordinate
2nd parameter f Cartesian Y coordinate
3rd parameter f Cartesian Z coordinate
/tracking/eye/LeftRightPitchYaw ,ffff write-only Pitch and yaw for each eye individually
1st parameter f Euler X angle for left eye
2nd parameter f Euler Y angle for left eye
3rd parameter f Euler X angle for right eye
4th parameter f Euler Y angle right eye
/tracking/eye/LeftRightVec ,ffffff write-only Headset-local normalized vectors for each eye individually
1st parameter f Cartesian X coordinate for left eye
2nd parameter f Cartesian Y coordinate for left eye
3rd parameter f Cartesian Z coordinate for left eye
4th parameter f Cartesian X coordinate for right eye
5th parameter f Cartesian Y coordinate for right eye
6th parameter f Cartesian Z coordinate for right eye
/tracking/vrsystem/head/pose ,ffffff read-only System pose for the headset
1st parameter f Cartesian X coordinate
2nd parameter f Cartesian Y coordinate
3rd parameter f Cartesian Z coordinate
4th parameter f Euler X angle
5th parameter f Euler Y angle
6th parameter f Euler Z angle
/tracking/vrsystem/leftwrist/pose ,ffffff read-only System pose for the left wrist (see .../head/pose above)
/tracking/vrsystem/rightwrist/pose ,ffffff read-only System pose for the right wrist (see .../head/pose above)

Coordinates

The coordinate system used is generally the same as the left-handed Unity coordinate system.

For Cartesian coordinate vectors, distances are in meters of real-world space.

  • +X is right, -X is left
  • +Y is up, -Y is down
  • +Z is forward, -Z is backward

For Euler angle vectors, angles are in degrees and are applied in (ZXY) order internally when converting to a quaternion.

  • +X is pitch down, -X is pitch up
  • +Y is yaw right, -Y is yaw left
  • +Z is roll left/counter-clockwise, -Z is roll right/clockwise

User Camera

All User Camera OSC endpoints are read-write unless otherwise specified.

Address Type Description
/usercamera/Mode ,i Camera mode 0: Off
1: Photo
2: Stream
3: Emoji
4: Multilayer
5: Print
6: Drone
/usercamera/Pose ,ffffff Camera position & rotation read-only see /tracking/vrsystem/head/pos above

Actions

Address Type Description
/usercamera/Close ,T Close camera
Equivalent to /usercamera/Mode ,i 0
write-only see buttons
/usercamera/Capture ,T Take a photo write-only see buttons
/usercamera/CaptureDelayed ,T Take a timed photo write-only see buttons

Toggles

Address Type Description
/usercamera/ShowUIInCamera ,T UI mask
/usercamera/LocalPlayer ,T Local Player mask
/usercamera/RemotePlayer ,T Remote Players mask
/usercamera/Environment ,T Environment mask
/usercamera/GreenScreen ,T Greenscreen
/usercamera/Lock ,T Camera lock
/usercamera/SmoothMovement ,T Smoothed behavior
/usercamera/LookAtMe ,T Look-At-Me behaviour
/usercamera/AutoLevelRoll ,T Auto-level roll behavior
/usercamera/AutoLevelPitch ,T Auto-level pitch behavior
/usercamera/Flying ,T Flying
/usercamera/TriggerTakesPhotos ,T Trigger takes photos
/usercamera/DollyPathsStayVisible ,T Dolly path visiblity while animating
/usercamera/AudioFromCamera ,T Audio from camera
/usercamera/ShowFocus ,T Focus overlay
/usercamera/Streaming ,T Spout stream
/usercamera/RollWhileFlying ,T Roll while flying behavior
/usercamera/OrientationIsLandscape ,T Image orientation

Sliders

Address Type Description Default Minimum Maximum
/usercamera/Zoom ,f Zoom 45 20 150
/usercamera/Exposure ,f Exposure 0 -10 4
/usercamera/FocalDistance ,f Focal distance 1.5 0 10
/usercamera/Aperture ,f Aperture 15 1.4 32
/usercamera/Hue ,f Greenscreen hue 120 0 360
/usercamera/Saturation ,f Greenscreen saturation 100 0 100
/usercamera/Lightness ,f Greenscreen lightness 60 0 50
/usercamera/LookAtMeXOffset ,f Look-At-Me X offset 0 -25 25
/usercamera/LookAtMeYOffset ,f Look-At-Me Y offset 0 -25 25
/usercamera/FlySpeed ,f Fly speed 3 0.1 15
/usercamera/TurnSpeed ,f Turn speed 1 0.1 5
/usercamera/SmoothingStrength ,f Smoothing strength 5 0.1 10
/usercamera/PhotoRate ,f Dolly photo capture rate 1 0.1 2
/usercamera/Duration ,f Dolly duration 2 0.1 60

Dolly

All Dolly OSC endpoints are read-write unless otherwise specified.

Address Type Description
/dolly/Import ,s write-only Import dolly path from a JSON file
/dolly/Export ,s write-only Export current dolly path to a JSON file
Emits an OSC message when export is complete
/dolly/ExportLocal ,s write-only As above, but exports all points as local
/dolly/PlayDelayed ,f write-only Play an animation after a delay (in seconds)
/dolly/Play ,T Play or stop an animation
Skip delay or cancel a delayed animation
Emits an OSC message when animation state changes

Errata

Missing from the VRChat Docs page, but present in the client OSCQuery response

Present on the VRChat Docs page, but missing from the client OSCQuery response

OSC ports

VRChat uses two UDP ports for OSC communication, one TCP port for an OSCQuery HTTP server on localhost (127.0.0.1), and one UDP port for mDNS Service Discovery:

Port Direction Purpose
UDP 9000 Send → VRChat Your application sends messages to VRChat
UDP 9001 Receive ← VRChat Your application receives messages from VRChat
TCP variable HTTP ↔ VRChat Your application gets OSCQuery data from VRChat
UDP 5353 mDNS ↔ VRChat multicastDNS Service Discovery[9][10]

The UDP ports can be overridden with a command line argument: --osc=inPort:senderIP:outPort. For example, --osc=9000:127.0.0.1:9001 replicates the defaults, and --osc=9000:192.168.1.42:9001 would send data to another device on the local network.

You can manually find the port numbers for these features by searching the current log file for a line that looks like
2025.01.02 03:04:05 Debug - Advertising Service VRChat-Client-A1B2C3 of type OSCQuery on 42069 or
2025.01.02 03:04:05 Debug - Advertising Service VRChat-Client-A1B2C3 of type OSC on 9000

Community resources

V · ECommunity-written content
The following was created by the community. It may contain material not directly endorsed by the VRChat team. To learn more, consider reading Contributing to the VRChat Wiki.

See also Community:OSC Resources for more detailed information.

The community has made useful resources for using OSC and developing OSC, such as tools and libraries. See here.

Resources

References