diff --git a/doc/classes/XRServer.xml b/doc/classes/XRServer.xml
index d940ea41aca..c7ba94b1b46 100644
--- a/doc/classes/XRServer.xml
+++ b/doc/classes/XRServer.xml
@@ -108,6 +108,10 @@
The primary [XRInterface] currently bound to the [XRServer].
+
+ The current origin of our tracking space in the virtual world. This is used by the renderer to properly position the camera with new tracking data.
+ [b]Note:[/b] This property is managed by the current [XROrigin3D] node. It is exposed for access from GDExtensions.
+
Allows you to adjust the scale to your game's units. Most AR/VR platforms assume a scale of 1 game world unit = 1 real world meter.
diff --git a/servers/xr_server.cpp b/servers/xr_server.cpp
index 85ef684d402..bab8e9ae4b1 100644
--- a/servers/xr_server.cpp
+++ b/servers/xr_server.cpp
@@ -52,11 +52,14 @@ XRServer *XRServer::get_singleton() {
void XRServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_world_scale"), &XRServer::get_world_scale);
ClassDB::bind_method(D_METHOD("set_world_scale", "scale"), &XRServer::set_world_scale);
+ ClassDB::bind_method(D_METHOD("get_world_origin"), &XRServer::get_world_origin);
+ ClassDB::bind_method(D_METHOD("set_world_origin", "world_origin"), &XRServer::set_world_origin);
ClassDB::bind_method(D_METHOD("get_reference_frame"), &XRServer::get_reference_frame);
ClassDB::bind_method(D_METHOD("center_on_hmd", "rotation_mode", "keep_height"), &XRServer::center_on_hmd);
ClassDB::bind_method(D_METHOD("get_hmd_transform"), &XRServer::get_hmd_transform);
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "world_scale"), "set_world_scale", "get_world_scale");
+ ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "world_origin"), "set_world_origin", "get_world_origin");
ClassDB::bind_method(D_METHOD("add_interface", "interface"), &XRServer::add_interface);
ClassDB::bind_method(D_METHOD("get_interface_count"), &XRServer::get_interface_count);