Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Rotating a frame so it's in perspective?

Okay, this question is more of a request for ideas on equations etc. that will basically rotate a frame into perspective, e.g:

http://prntscr.com/bdaje7

to this:

http://prntscr.com/bdajho

(this is in PS, but you get the idea)


My only idea for this to set/tween the size and position in some way as well as the rotation. I attempted it, but it didn't work very well.

Here is my code if you want it (although it's not very important):

wait(1)
local f = script.Parent.Frame
local num = 80
local num2 = .25
local t = 0.025
local pos = UDim2.new(0,(num*t)*5,0,(num*t)*8)

print(num*t)

f:TweenSizeAndPosition(f.Size - UDim2.new(0,0,0,(num*t)*10),f.Position-pos,"InOut","Quad",num*t,true)
for i = 1,num do
	f.Rotation = f.Rotation + num2
	wait(t)
end

Thank you! Any help with this would be greatly useful!

~TDP

2 comments

0

I don't believe it's possible to form a trapezium like that with a single Roblox frame. This will be very complicated.

0

Yes. I agree. My only other idea is creating multiple triangles and basically animating it - which will take forever since it's like 300 lines of code per frame.

1 answer

✓ Accepted answer

This is a fun question because there are quite a few possible answers! There are two ways I can think of off the top of my head.

The first is to use a lot of vertical frames and math to scale them based on the perspective/depth etc. I personally wouldn't use this method because it would require me to do more work than I have to.

The second way, which is what I'll give an example of, is to simply triangulate your shape and draw it with triangles. I used this module to triangulate and this article to draw 2D triangles. I then used WorldToScreenPoint to get the corners of one of the surfaces on the shape just for ease of testing/showing how it works.

local camera = game.Workspace.CurrentCamera;
local screen = script.Parent; -- screengui
local cleanup = screen:WaitForChild("cleanup"); -- something we can put the drawn triangles in and clear the next frame

local triangle = require(script:WaitForChild("triangle")); -- for drawing 2D triangles
local delaunay = require(script:WaitForChild("delaunay")); -- for 2D trianglation

function get2DPoints(part)
	local points = {};
	for x = -1, 1, 2 do
		for y = -1, 1, 2 do
			local p3 = (part.CFrame * CFrame.new(part.Size/2 * Vector3.new(x, y, 1))).p;
			local p2 = camera:WorldToScreenPoint(p3);
			table.insert(points, p2);
		end;
	end;
	return points;
end;

local part = game.Workspace.Part;

function update()
	cleanup:ClearAllChildren(); -- clear prev stuff
	local points = get2DPoints(part);
	local tris = delaunay.triangulate(unpack(points)); -- triangulate the shape
	for _, tri in next, tris do
		-- params: parent, colour, pointa, pointb, pointc
		triangle(cleanup, Color3.new(), unpack(tri));
	end;
end;

game:GetService("RunService").RenderStepped:connect(update);

This is what it looks like

2 comments

0

So the gif shown is what it would look like when put in use?

0

Yes

This discussion is preserved as it was. New answers, comments, and votes are closed.