Well thank you for care. I made something today, and almost reach what i want to do thank you for clue bro realy help me out. This is outcome right now,
-make sure that paths translation is zero.
-make sure sphere's face is looking at the local -z axis.
-add a little bit more points for the path. so that shphere can look around more sensitive angles.
this is path:

video:
https://streamable.com/tyb51w
this is nodes:

this is touch screen script for drag and drop position data:
extends Node2D
var current_drag_pos = Vector2()
var can_drag = false
var go_intepolite = false
func _input(event):
if event is InputEventScreenTouch:
if not event.pressed:
can_drag = false
go_intepolite = true
if event is InputEventScreenDrag:
current_drag_pos = event.position
can_drag = true
go_intepolite = false
this is raycasting and interpolite to do closest path point:
extends MeshInstance
onready var camera_node_for_ray = get_parent().get_parent().get_parent().get_node("camera_for_raycast")
onready var get_touch_data = get_parent().get_parent().get_parent().get_node("touch_drag_script")
const ray_length = 10000
var result
onready var path1 = get_parent().get_parent().get_parent().get_node("Path")
func _process(delta):
global_transform.origin.y = 0.2
if get_touch_data.can_drag == true:
var camera = camera_node_for_ray
var from = camera.project_ray_origin(get_touch_data.current_drag_pos)
var to = from + camera.project_ray_normal(get_touch_data.current_drag_pos) * ray_length
var space_state = get_world().direct_space_state
result = space_state.intersect_ray(from,to)
if result.empty() == false:
global_transform.origin = result["position"]
if get_touch_data.go_intepolite == true:
translation = translation.linear_interpolate(path1.get_curve().get_closest_point(translation),0.1)
look_at(translation,Vector3.UP)