Have you ever wanted to convert a 3D point on the surface of a tilted part in Roblox Studio into a Vector2 based on its position on the surface area? It can be a tricky task, but fear not, I’ve got a solution for you!
First, let’s go over the problem. If you have a tilted part, using the
GetSurfacePosition() method won’t work, as it only returns the surface position on the un-tilted part. Instead, we need to calculate the position of the point relative to the part’s origin, and then use its orientation to determine its position on the surface area.
Here’s an example implementation of a function that does just that:
function GetSurfacePosition(part,surfacePoint) local pos = surfacePoint - part.Position pos = pos * part.CFrame:Inverse() -- Calculate the normalized position of the point on the surface of the part local normX = (pos.X + part.Size.X/2)/part.Size.X local normY = (pos.Y + part.Size.Y/2)/part.Size.Y -- Convert the normalized position to UDim2 offset return Vector2.new(normX,normY) end
This function takes a tilted
part and a 3D
point on its surface, and returns a Vector2 representing the position of the point on the surface area of the part.
The function first calculates the position of the
point relative to the
part’s origin in local space using the inverse of the
part’s orientation. It then calculates the dimensions of the
Next, it calculates the surface normal of the part at the
point by constructing a CFrame with the
point as its origin and a vector pointing up in the Z direction, and then transforming it to local space. The surface normal is the LookVector of this transformed CFrame.
Finally, the function calculates the normalized position of the
point on the surface of the
part based on its X and Y coordinates relative to the surface normal, and converts the normalized position to UV Coordinates.
I hope this helps anyone who’s been struggling with this problem. If you have any questions or feedback, feel free to leave a comment below.