Alarming Issue concerning Welds (essentially disables welds) and Motor6Ds

I discovered an alarming, weird behavior with Welds (and Motor6Ds). This behavior happens only if you do a certain method (listed below). Since Welds and Motor6Ds both exhibit the behavior using the same, certain methods, I’ll be referring to them as welds.

Weird behavior:
A weld, executed correctly according to the Wiki, is supposed to move its Part1 after a C0 edit. Instead, the weld moves its Part0 on C0 edit. That’s what the behavior is (The weld moves Part0 instead of Part1), I think it essentially disables welds, meaning this switch-up of a behavior would make the welded model look super clunky and glitch, I classify it as a major bug- it destroys the look of everything and everyone is vulnerable.

How to trigger this behavior:
NOTE: make sure all involved parts are unanchored and have all SurfaceTypes set to smooth (standard welding procedure)

  1. Weld a part that is greater in size than the part it’s being welded to
  2. Weld a part that is equal in size than the part it’s being welded to
  3. SOMETIMES, if you have 2 parts of the same size and you weld those 2 parts to a part of any size, it will trigger this behavior
    “Why would you weld a huge part to a small part?”, Ball and Chain, you weld the ball to the chain, one should be able to make a ball and chain (and isn’t it a staple of physics?)

Try it yourself, using this code that I used to weld two parts:

-- Weld part1 (partBeingWelded) to part2 (partBeingWeldedTo)
-- This isn't special code, we've all seen a WeldTo code, you could use your own
-- Also, you'll need code to edit the C0, welding only triggers the behavior, editing C0 lets you
-- - see the behavior.
--
-- adjust the C0 of the first object selected in studio
game.Selection:Get()[1].C0 = game.Selection:Get()[1].C0 + Vector3.new(0,2,0)
--
local weldTo = function(partBeingWelded, partBeingWeldedTo) 
        -- Use a weld or a Motor6D, same results
	--local newWeld = Instance.new("Weld") 
	local newWeld = Instance.new("Motor6D")
	newWeld.Part0 = partBeingWeldedTo
	newWeld.Part1 = partBeingWelded
	newWeld.C0 = partBeingWeldedTo.CFrame:inverse() * partBeingWelded.CFrame
	newWeld.Name = "w"..partBeingWelded.Name
	
	newWeld.Parent = partBeingWeldedTo
end

Wiki explains how to correctly weld: Documentation - Roblox Creator Hub

Short term solution:
I guess I just have to avoid those 3 ways that create this weird behavior.

Request:
Please make it so C0 edits of Welds and Motor6Ds ALWAYS adjust the Part1 in any properly-made welds (the way Wiki recommends ^)

If I made any mistakes/anything I should I know please lemme know.

3 Likes

The issue is terrible and arbitrary behavior. ROBLOX changed joints (they weren’t always like this) so that Part0 and Part1 didn’t matter. Part0 is supposed to be the root part and Part1 is supposed to be the sub part, but with this horrible behavior, the larger part is the root part and the smaller part is the sub part, even if the smaller part is Part0. When both parts are the same size, you run into the issue the behavior being arbitrary which causes issues like this.

You can read more on this stupid behavior here:

2 Likes

I assumed it, it seems the greater size becomes the ‘assembly root’ (I called it the WeldFather), this behavior shouldn’t be, the Part0 should be the WeldFather. Please be careful when automating things, ROBLOX Design team (someone designed this ‘greater size becomes root’ behavior)

I’ve read threads a year old about this issue now, it doesn’t seem like staff pay much attention to it. Why is ROBLOX’s design team trying to force-tie physics to everything? Staff, you are smart enough to know that that is a hair off impossible in a game. You just need a strong physics engine, not a perfect one, and especially not a system that you force onto people. You were reluctant to remove CollisionFidelity being based on Geometry in CSG I think to preserve a ‘physics environment’, and you’ve spoken passion about making ROBLOX a very physics-associated game, so I suspect this forceful behavior from ROBLOX.

Other threads on this issue:
(first 2 provided by Echo)

Believe me man, I was going nuts too when I found this out, I had to take a break to ease my mind, I had no idea why this was acting like this. Finally reached a concrete solution after 4 hours. There isn’t even a solution, the solution is just to avoid the problem (these ways), lol >_>