Let items on conveyor belts round corners (#6964)

This commit is contained in:
Kevin Zheng
2022-03-02 14:32:33 -08:00
committed by GitHub
parent 6d8cc29f74
commit 551f5a7e78

View File

@@ -77,22 +77,29 @@ namespace Content.Server.Physics.Controllers
{ {
if (speed == 0 || direction.Length == 0) return Vector2.Zero; if (speed == 0 || direction.Length == 0) return Vector2.Zero;
/* TODO: Figure out how to fix corner cuts.
direction = direction.Normalized;
var dirNormal = new Vector2(direction.Y, direction.X);
var dot = Vector2.Dot(itemRelative, dirNormal);
*/
var velocity = direction * speed;
return velocity * frameTime;
/* /*
velocity += dirNormal * speed * -dot; * Basic idea: if the item is not in the middle of the conveyor in the direction that the conveyor is running,
* move the item towards the middle. Otherwise, move the item along the direction. This lets conveyors pick up
* items that are not perfectly aligned in the middle, and also makes corner cuts work.
*
* We do this by computing the projection of 'itemRelative' on 'direction', yielding a vector 'p' in the direction
* of 'direction'. We also compute the rejection 'r'. If the magnitude of 'r' is not (near) zero, then the item
* is not on the centerline.
*/
return velocity * frameTime; var p = direction * (Vector2.Dot(itemRelative, direction) / Vector2.Dot(direction, direction));
*/ var r = itemRelative - p;
if (r.Length < 0.1)
{
var velocity = direction * speed;
return velocity * frameTime;
}
else
{
var velocity = r.Normalized * speed;
return velocity * frameTime;
}
} }
public IEnumerable<(EntityUid, TransformComponent)> GetEntitiesToMove(ConveyorComponent comp, TransformComponent xform) public IEnumerable<(EntityUid, TransformComponent)> GetEntitiesToMove(ConveyorComponent comp, TransformComponent xform)