"Chasing" object around a sphere

Hey all,

For a project, I’ve got planet-based combat as part of the gameplay. In short, I use forward movement and rotation followed by rotational and positional clamping to the planet’s surface. It uses a bit of spherical coordinate math, but that’s not important.

So, I have enemies that I’d like to follow my position, wherever I am on the sphere. This, however, is proving difficult. Using transform.LookAt(player.position) only works well when they’re closer on the sphere, but farther away, and I get a quasi-Gimbal Lock scenario.

What’s the best way to have something rotate so it’s forward vector propels itself toward an object on a sphere? Thanks in advance!

Also, here’s the code, so you get an idea of what I’m doing to “clamp” it and such.

// Applies yaw changes (DOESN'T WORK RIGHT :C)
transform.LookAt(player.transform.position);
		
// Applies forward movement
currentSpeed += Time.deltaTime * enemyPlanetAccel;
currentSpeed = Mathf.Clamp(currentSpeed, 0, enemyPlanetMaxSpeed);
currentSpeed -= Time.deltaTime / 2f;
transform.position += transform.forward * currentSpeed * Time.deltaTime;
		
// Correct turns/position to limit to planet's surface
Vector3 c2s = transform.position - planet.transform.position;
Quaternion newTurn = Quaternion.LookRotation(Vector3.Cross(transform.right, c2s), c2s);
transform.rotation = newTurn;
transform.position = sphericalToCartesian(new Vector3(landingRValue, cartesianToSpherical(transform.position).y, cartesianToSpherical(transform.position).z));

Thanks again for any help! :slight_smile:

1 Answer

1

Slerp is supposed to do that. Spherical Linear intERPolation. Slerp to find the ‘Cartesian’ coordinates between your start (current) and end positions, use constant height for radius.