ARVROrigin in Godot 4: it is XROrigin3D now
By Eduardo Orellana · Updated
ARVROrigin is called XROrigin3D in Godot 4, and the rest of the ARVR family moved to XR: ARVRCamera is XRCamera3D and ARVRController is XRController3D. In a Godot 4 project, ARVROrigin.new() fails to parse with Identifier "ARVROrigin" not declared in the current scope. Did you mean to use "XROrigin3D"?.
AppImage, x86_64. Ubuntu 22.04, Debian 12, Fedora 39 or newer.
Intel or AMD Chromebook, with Linux turned on.
What Godot is checking
GDScript resolves every name when the script loads. ARVROrigin is not a class in Godot 4, so the analyzer stops before anything runs, and because the name is in Godot's own table of Godot 3 renames, the message names the replacement.
The converter carries every ARVR class to its XR name. XROrigin3D marks the centre of the tracked play space, with the XRCamera3D and XRController3D nodes as its children; OpenXR is built in and turned on in Project Settings, XR.
Reproduce it
A Godot 3 script that creates a ARVROrigin in code, in a Godot 4 project.
extends Node
func _ready():
var origin = ARVROrigin.new()
print(origin)
What Godot 4.7.2 prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
SCRIPT ERROR: Parse Error: Identifier "ARVROrigin" not declared in the current scope. Did you mean to use "XROrigin3D"?
at: GDScript::reload (res://answers/arvrorigin-in-godot-4/repro.gd:4)
ERROR: Failed to load script "res://answers/arvrorigin-in-godot-4/repro.gd" with error "Parse error".
at: load (modules/gdscript/gdscript_resource_format.cpp:46)Fix it
An XR rig: an XROrigin3D with a camera and a left-hand controller.
extends Node3D
func _ready() -> void:
var origin := XROrigin3D.new()
add_child(origin)
origin.add_child(XRCamera3D.new())
var hand := XRController3D.new()
hand.tracker = &"left_hand"
origin.add_child(hand)
print(origin.get_class(), " children: ", origin.get_child_count(), ", hand tracker ", hand.tracker)
What the fixed script prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
XROrigin3D children: 2, hand tracker left_handVerified on Godot 4.7.2
Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 18 October 2026, and the output above is what Godot printed, unedited.
Where the check lives in Godot's source: [gdscript_analyzer.cpp line 4687, the message with its hint](https://github.com/godotengine/godot/blob/4.7.2-stable/modules/gdscript/gdscript_analyzer.cpp#L4687), [renames_map_3_to_4.cpp line 1476, ARVROrigin to XROrigin3D](https://github.com/godotengine/godot/blob/4.7.2-stable/editor/project_upgrade/renames_map_3_to_4.cpp#L1476), [XROrigin3D class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/XROrigin3D.xml).
Questions
- How do I start OpenXR?
- Turn on Project Settings, XR, OpenXR, Enabled, and set the main viewport's use_xr to true when the interface initialises.
- What is ARVRController called?
- XRController3D, with tracker set to left_hand or right_hand.
Related
- Camera in Godot 4: it is Camera3D now
- Spatial in Godot 4: it is Node3D now, and translation is position
- Every verified Godot 4 answer
- ARVRController in Godot 4: it is XRController3D now
- YSort in Godot 4: use y_sort_enabled on a Node2D
- Identifier "…" not declared in the current scope in Godot 4
- Sprite in Godot 4: it is Sprite2D now
- RayCast in Godot 4: it is RayCast3D now
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free