I have been maintaining Module3D for several years, each being better than the last (except version 5 in some cases). With Roblox’s new ViewportFrames comes a better way to handle the task of adorning models to frames. Previously, you could not use the module with SurfaceGuis, and you won’t get smooth performance with large models. Now both are possible, and at the same time!
Advantages Of V6
Module3D V6 is a complete re-write to utilize ViewportFrames instead of positioning objects and correcting the orientation. The advantages of the new implementation this include:
- More and larger models can be adorned without a performance hit.
- Positioning frames in BillboardGuis behind the objects are no longer needed.
- Post-processing effects no longer affect the objects.
- Map lighting no longer affects the objects.
- Objects adorned to the sides of the display don’t get distorted.
- Clipping with the map is longer a problem.
- Models can be adorned to SurfaceGuis.
- Updating the rotation uses a lot fewer resources.
- Properties like FiledOfView can be changed independently of the player’s camera.
The available API is included in the module. Here is what the module contains:
Module3D:Attach3D(Frame,Model) Attaches a model or part to a frame. Returns a Model3D object. Does not use a clone of the model so it can be referenced directly. Model3D object: Model3D.Object3D - the model for the bounding box. If the input model was a model, it will be the same as the input. Model3D.Parent - the parent frame of the model. Model3D.AdornFrame - the frame the model is adorned to. Model3D.Camera - the camera used by the viewport frame. Model3D:Update() Force updates the camera CFrame. Model3D:SetActive(Active) Sets the frame being active. Model3D:GetActive() Reutrns if the frame is active. Model3D:SetCFrame(NewCF) Sets the CFrame offset. Automatically updates the camera CFrame. Model3D:GetCFrame() Returns the CFrame offset. Model3D:SetDepthMultiplier(Multiplier) Sets the multiplier for how far back the camera should go. Automatically updates the camera CFrame. Model3D:GetDepthMultiplier() Returns the depth multiplier Model3D:End()
The following file uses the SurfaceGui example above including:
- Module3D V6 and the Towers model are in ReplicatedStorage
- SurfaceGUI and the script are in StarterGui
local Frame = script.Parent:WaitForChild("Frame") local Module3D = require(game.ReplicatedStorage:WaitForChild("Module3D")) local Towers = game.ReplicatedStorage:WaitForChild("Towers") local Model3D = Module3D:Attach3D(Frame,Towers) Model3D:SetDepthMultiplier(1.2) Model3D.Camera.FieldOfView = 5 Model3D:SetActive(true) game:GetService("RunService").RenderStepped:Connect(function() Model3D:SetCFrame(CFrame.Angles(0,tick() % (math.pi * 2),0) * CFrame.Angles(math.rad(-10),0,0)) end)
Module3D V6 Example.rbxl (410.6 KB)