I wanted to make a parallax 3d system for interior so that i don’t have to
individually place the furniture for every window
But its jittery and glitchy
Video
I took the @EgoMoose code for the camera cframing inside the viewportframe
i tried using parallel lua cuz i thought its because of performance but its still glitchy
da code:
local UP = Vector3.new(0, 1, 0)
local FOV120 = math.rad(120)
local PI2 = math.pi/2
for i,window in pairs(workspace.Windows:GetChildren()) do
coroutine.wrap(function()
-----///
local sur = script.Parent.Parent.SurfaceGui:Clone()
sur.Adornee = window
sur.Parent = script.Parent.Parent
local vpf = sur:WaitForChild("ViewportFrame")
local camera = game.Workspace.CurrentCamera
--
local nCamera = Instance.new("Camera", vpf)
nCamera.FieldOfView = 70
vpf.CurrentCamera = nCamera
--
--
local aspect = window.Size.x / window.Size.y
vpf.Parent.CanvasSize = Vector2.new(camera.ViewportSize.y*aspect, camera.ViewportSize.y)
vpf.LightDirection = -game.Lighting:GetSunDirection()
vpf.BackgroundColor3 = window.Color
local part = game.ReplicatedStorage.World.Model:Clone()
part:SetPrimaryPartCFrame(window.CFrame)
part:Clone().Parent = vpf
local function GetSurfaceInfo(part)
local partCF, partSize = part.CFrame, part.Size
local back = -Vector3.FromNormalId(sur.Face)
local axis = (math.abs(back.y) == 1) and Vector3.new(back.y, 0, 0) or UP
local right = CFrame.fromAxisAngle(axis, PI2) * back
local top = back:Cross(right).Unit
local cf = partCF * CFrame.fromMatrix(-back*partSize/2, right, top, back)
local size = Vector2.new((partSize * right).Magnitude, (partSize * top).Magnitude)
return cf, size
end
game:GetService("RunService").RenderStepped:ConnectParallel(function(dt)
task.desynchronize()
local camCF = camera.CFrame
local surfaceCF, surfaceSize = GetSurfaceInfo(window)
local viewportSizeY = camera.ViewportSize.y
local rPoint = surfaceCF:PointToObjectSpace(camCF.p)
local sX, sY = rPoint.x / surfaceSize.x, rPoint.y / surfaceSize.y
local scaleX = 1 + math.abs(sX)*2
local scaleY = 1 + math.abs(sY)*2
local scale = math.sqrt(scaleX*scaleX + scaleY*scaleY)
local rDist = (camCF.p - surfaceCF.p):Dot(surfaceCF.LookVector)
local newFov = 2*math.atan2(surfaceSize.y/2, rDist)
local clampedFov = math.clamp(math.deg(newFov), 1, 70)
local pDist = surfaceSize.y/2 / math.tan(math.rad(clampedFov)/2)
local adjust = rDist / pDist
local factor = (newFov > FOV120 and adjust or 1) / scale
local scaleCF = CFrame.new(0, 0, 0, factor, 0, 0, 0, factor, 0, 0, 0, 1)
task.synchronize()
vpf.Position = UDim2.new(vpf.AnchorPoint.x - sX, 0, vpf.AnchorPoint.y - sY, 0)
vpf.Size = UDim2.new(scale, 0, scale, 0)
vpf.BackgroundColor3 = sur.Adornee.Color
sur.CanvasSize = Vector2.new(viewportSizeY*(surfaceSize.x/surfaceSize.y), viewportSizeY)
nCamera.FieldOfView = clampedFov
nCamera.CFrame = CFrame.new(camCF.p) * (surfaceCF - surfaceCF.p) * CFrame.Angles(0, math.pi, 0) * scaleCF
end)
---///
end)()
end