The way I did this is by putting parts in a ViewportFrame, however, SurfaceGuis do not render in ViewportFrames, so Im just stuck with blank signs.
There is 2 reasons why I cant put the parts in the camera:
You cant really scale parts that are in the camera, they will always be the same size.
If you zoom in, the parts will go through other parts
Also I cant really make the text a decal because I want the text to be set by script
I actually ran into the same issue you are running into: SurfaceGui’s don’t render in ViewportFrames and welding parts to the Camera causes distortion effects and causes some clipping issues.
The clipping issues can be resolved by enabling the AlwaysOnTop proprty of the SurfaceGui. That only works for the GUI elements though, not the parts they are applied to. I would suggest you make your own texture that mimics the parts you are currently using, so that it can be displayed as a texture.
If you’re trying to make it more 3D than just SurfaceGUI-Welded-To-The-Camera, there currently is no way to achieve this. In order to avoid the distortion effects you’d need to decrease the Field of View significantly, and due to Roblox not supporting multiple cameras rendering on top of each other, the only way to achieve this would be by decreasing FoV of your entire game to an unplayable small value.
This is a good usecase to request the support of SurfaceGui within ViewportFrames though, and you should definitely add your support to the existing feature request(s) that ask for this.
I guess what I could try doing is put a SurfaceGui on every surface of the parts with a marble texture, and check AlwaysOnTop and put the parts in the camera.
Still doesnt solve the scaling problem though
And I can imagine having a ton of surfaceguis and imagelabels may not be the best idea
I just put the parts in front of the camera, and teleport the camera somewhere you cant zoom out.
Gonna add some depth of field to make this look better.