I would like to move an object through a path found by A* star but taking into account the object's turn radius and movement speed, while also avoiding possible obstacles during a curve. After some research, I found this article in gamasutra about realistic turns and this question. If I understood correctly, to add smooth turns I just need to create a circle in either the left side of the object or the right (depending on which direction it will rotate) and then move the object along that circle until it reach the point in which it can move straight to the goal. I implemented the code from the article, however I couldn't get it working
- The tank is the object I want to move and the boxes are obstacles;
- The red Xs are the "waypoints" and the blue line is the line segment between those points;
- The white circle is the tank's turning radius;
- The green line is the actual movement the tank would perform taking its turning radius and movement speed into account;
- And the pink dotted circle represents the "point to leave the circle and start on the straight line" that I've got with the algorithm;
The first problem is that I'm not sure how to calculate the right place for the pink circle. If I understood correctly, it should be positioned between the end of the green line's curve and the start of the straight one.
The second problem is that, once solved the first, I don't know how to actually move the tank through the "circular" path, while in straight path I could simply take the direction between the current point and the next, and move along that.
Here's my implementation in gdscript
extends Node2D
var speed = 80
var rotation_speed = 1
var goal = null
var velocity = Vector2()
func _ready():
goal = get_parent().get_node("Goal").global_position
func _physics_process(delta):
if goal == null:
return
var pos = global_position
var circle_radius = speed / rotation_speed
var angle_to_circle_center = rotation + PI/2 #rotation - PI/2
var circle_pos = pos
circle_pos.x += circle_radius * cos(angle_to_circle_center)
circle_pos.y += circle_radius * sin(angle_to_circle_center)
var dx = goal.x - circle_pos.x
var dy = goal.y - circle_pos.y
var h = sqrt(dx*dx + dy*dy)
var r = circle_radius
if h < r:
return
var d = sqrt(h*h - r*r)
var theta = acos(r / h)
var phi = atan(dy / dx)
var Q = Vector2()
Q.x = circle_pos.x + r * cos(phi + theta)
Q.y = circle_pos.y + r * sin(phi + theta)
get_parent().get_node("icon").global_position = Q
Any insight would be appreciated - thanks in advance!