• Create Account

## Aligning a path, along a another dynamically

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

6 replies to this topic

### #1dribble04  Members

159
Like
0Likes
Like

Posted 09 May 2014 - 05:40 AM

Am building a 2D top down game where there are roads, and intersections, and the user is creating a path, for the car to follow, but that path can be created only on the road, and it has to centre itself on that road. How would I attempt to do this? Am developing in Unity btw.

Right now am gathering the points on input, and based on the direction of the drawn path, it knows if its moving horizontally or vertically, but I am not quite sure how to figure out if its turning. My implementation knows if its turning but it also includes diagonals.

public void InputUpdate()
{
if(Input.GetMouseButtonDown(0))
{
dragPoints.Clear();
lineRenderer.SetVertexCount(0);

horizontalCount = verticalCount = 0;

isDragging = true;
isComplete = false;
}

if(Input.GetMouseButtonUp(0))
{
isDragging = false;
isComplete = true;
}

if(isDragging)
{
Vector3 tempPosition = gameCamera.ScreenToWorldPoint(Input.mousePosition);
tempPosition = new Vector3(tempPosition.x, tempPosition.y, 0f);

return;

Vector3 totalDirection = Vector3.zero;

int minSamplePoints = 4;

startPoint = dragPoints[0];

if(dragPoints.Count > minSamplePoints)
{
endPoint = dragPoints[dragPoints.Count - 1];

for(int i = 0; i + minSamplePoints < dragPoints.Count; i++)
totalDirection += (dragPoints[i + minSamplePoints] - dragPoints[i]).normalized;

prevAvgX = currentAvgX;
prevAvgY = currentAvgY;

currentAvgX = totalDirection.x / dragPoints.Count;
currentAvgY = totalDirection.y / dragPoints.Count;

if(Mathf.Abs(currentAvgY) <= 0.1f)
{
currentAxis = Axis.Horizontal;
horizontalCount++;
}
else if(Mathf.Abs(currentAvgX) <= 0.1f)
{
currentAxis = Axis.Vertical;
verticalCount++;
}
else
{
if(Mathf.Abs(currentAvgX) > Mathf.Abs(currentAvgY))
currentAxis = Axis.TurnXY;
else if (Mathf.Abs(currentAvgX) < Mathf.Abs(currentAvgY))
currentAxis = Axis.TurnYX;
}
}

RenderLine();
}
}


Any help would be much appreciated.

Cheers!!

### #2dribble04  Members

159
Like
0Likes
Like

Posted 09 May 2014 - 07:45 AM

Figured out how to align it. Anyone can tell me, how I will know if am making a turn?

### #3eppo  Members

4595
Like
1Likes
Like

Posted 09 May 2014 - 07:47 AM

This is probably easiest when the underlying road structure is defined as a network of interconnected splines. That way the center of the road and its tangent/direction are exactly defined. Also, you can do distance tests between the (tessellated) curve and surrounding points to see whether such points lie on the road. Lastly, a user-defined route becomes a simple series of (spline-)key-points.

Edited by eppo, 09 May 2014 - 07:48 AM.

### #4dribble04  Members

159
Like
0Likes
Like

Posted 12 May 2014 - 11:32 PM

I thought of this approach, any other solutions?

### #5ferrous  Members

5748
Like
0Likes
Like

Posted 15 May 2014 - 11:33 AM

Figured out how to align it. Anyone can tell me, how I will know if am making a turn?

I thought of this approach, any other solutions?

Are you trying to figure out when a turn is occurring in a list of points?  If you have all the points, and the first point has some known orientation (ie the point that the user is currently in), you might be able to make vectors out of the points (ie P0 - P1 is the first vector, P2-P1), and see if the angles ever get over some threshold?

### #6dribble04  Members

159
Like
0Likes
Like

Posted 15 May 2014 - 12:25 PM

I've figured all that out. My new problem is constraining the user defined path to a road.

### #7ferrous  Members

5748
Like
0Likes
Like

Posted 16 May 2014 - 05:15 PM

I've figured all that out. My new problem is constraining the user defined path to a road.

Oh, I think I understand, the control points of the curve can be all within the road, but the curve generated by those control points can sometimes be outside the line?

EDIT:  I'll have to think about it some if thats the issue at hand.  Best I can come up with off the top of my head is to brute force check some points in between control points, and then if that point is off, then insert a control point that is within the road in between the two existing control points... and recheck... which isn't that great.

Second thought is to swap to a completely different system, like marco pinters, and then have non-road tiles be blocking tiles, but that might not be a road you want to go down.

Edited by ferrous, 16 May 2014 - 05:19 PM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.