I have a central point, a planet is moving around it on the orbit A (a circle)
And the planet is rotating at a certain speed on its axis ( B )
I have a Data Structure representing the Base Mesh information that is static and calculated around the origin point that is static.
Think:
float3[] pointsList
Where all the point are calculated around 0,0,0 instead of where the planet is ( it's easier to convert 1 point on a frame rather than a list with thousands of point each frame )
Around that planet, I have a collider to be able to catch raycasts on it. The sphere collider is roughly the size of the mesh so it matches well.
Here is what I need :
How can I convert the point from the raycast back to an "origin" state.
Here is an illustration :
From My understanding I would need :
To Revert the rotation on the Axis (A) BUT following the (C) Line along the surface to find the base point as if the mesh did not rotate at all and then Translate the point so it is in the origin referential. (Around 0,0,0 , where the base mesh have been calculated)
Now...what are the maths that I need to do behind the scenes to do that?
TLDR: I am trying to convert a raycast point on the surface of a sphere back to an "origin" kind of point to do stuff behind with it with the base mesh coordinates.
Edit : Adding representation of the planet VS the stored point Array ( please note that A is at 0,0,0 ) :
Here : B is the representation of the points array and is STATIC & A Is the position of the planet with the collider & the mesh created from B's Points, all rotating on it's axis ( cf : Other screenshot )
So how do I "revert" a point from the collider around the mesh to get a point as if the raycast Happened on the A sphere ?
Edit 2 : Result with InvertTransform
if (!Physics.Raycast(MainCamera.ScreenPointToRay(Input.mousePosition), out hit))
{
return;
}
RaycastHit hit;
Vector3 localHit = TargetPlanet.transform.InverseTransformPoint(hit.point);
GameObject rayCastHit = GameObject.CreatePrimitive(PrimitiveType.Sphere);
rayCastHit.name = "RayCastHit";
rayCastHit.transform.position = hit.point;
rayCastHit.transform.localScale = new Vector3(0.025f,0.025f,0.025f);
GameObject targetLocal = GameObject.CreatePrimitive(PrimitiveType.Sphere);
targetLocal.name = "TargetLocal";
targetLocal.transform.position = localHit;
targetLocal.transform.localScale = new Vector3(0.025f,0.025f,0.025f);
Vector3 planetHit = TargetPlanet.transform.TransformPoint(targetLocal.transform.position);
GameObject targetPlanet =GameObject.CreatePrimitive(PrimitiveType.Sphere);
targetPlanet.name = "TargetPlanet";
targetPlanet.transform.parent = TargetPlanet.transform;
targetPlanet.transform.position = planetHit;
targetPlanet.transform.localScale = new Vector3(0.025f,0.025f,0.025f);
Then Clicking on the same point again and again without mooving the mouse give me that :
For the raycast hit :
For The TargetLocal : ( On the reference Sphere at origin )
For The TargetPlanet: ( On the Surface of the planet & the view of the collider )
Both the hit on the surface & on the reference seems OFF and never hit the same point
Edit 3 : Movement Code :
public float3 EvaluatePlanetOrbit(int planetID, float t)
{
float angle = t * 360 * Mathf.Deg2Rad;
float x = math.sin(angle) * Orbits[planetID].XAxis; // Orbits[planetID].XAxis -> Float
float z = math.cos(angle) * Orbits[planetID].ZAxis; // same
return new float3(x, 0, z);
}
//That is the code managing the movement of the planet
planetData.OrbitalProgress += time * (1 /planetData.CurrentOrbit) * planetData.OrbitalSpeed;
PlanetGridGameObject.transform.position = EvaluatePlanetOrbit(planetData.PlanetID, planetData.OrbitalProgress);
// Rotations
planetData.CurrentAngleRotation += time * GameSettings.RotationPlanetSpeed;
planetData.CurrentAngleRotation %= 360;
Quaternion rotationAboutAxis = Quaternion.Euler(0, planetData.CurrentAngleRotation, 0);
Quaternion tiltOfAxis = Quaternion.Euler(0, 0, GameSettings.RotationPlanetAxis);
PlanetGameObject.transform.rotation = (Quaternion) tiltOfAxis * rotationAboutAxis ;