private void StartGrab(InputSource inputSource, Spatial target) { if (GrabActive || target == null || !Godot.Object.IsInstanceValid(target)) { return; } CurrentGrabbedTarget = target; _currentInputSource = inputSource; var targetTransform = CurrentGrabbedTarget.GlobalTransform; _manipulator = new Spatial() { Name = "manipulator" }; inputSource.GetTree().Root.AddChild(_manipulator); _manipulator.GlobalTransform = targetTransform; _previousParent = CurrentGrabbedTarget.GetParent(); _previousParent.RemoveChild(CurrentGrabbedTarget); _manipulator.AddChild(CurrentGrabbedTarget); CurrentGrabbedTarget.GlobalTransform = targetTransform; _manipulatorPosInToolSpace = _currentInputSource.ToLocal(_manipulator.GlobalTransform.origin); _manipulatorupInToolSpace = _currentInputSource.ToLocal(_manipulator.GlobalTransform.basis.y); _manipulatorLookAtPosInToolSpace = _currentInputSource.ToLocal(_manipulator.GlobalTransform.origin - _manipulator.GlobalTransform.basis.z); }