Problem with CFrames

I’m trying to create a death effect, but its not always working.

This is how it works when Im looking forward (working right):
a6e8a4237a2fe0e400645155ce593091

And when Im looking left/right (working wrong):
78e9108d7947a15074e626f59d5f82bc

This is a function that returns a CFrame the part should be tweened to.

local r = math.random
local rad = math.rad

local yOffset = 5

local function GetCFrame(part: BasePart)
	local PartToCFrame = {
		["Head"] = (part.CFrame + Vector3.new(0, 1+yOffset, 0)),
		["Left Arm"] = (part.CFrame + Vector3.new(-1, 0+yOffset, 0))*(CFrame.Angles(0, 0, rad(-r(10, 40)))),
		["Left Leg"] = (part.CFrame + Vector3.new(-0.5, -1+yOffset, 0))*(CFrame.Angles(0, 0, rad(-r(10, 30)))),
		["Right Arm" ] = (part.CFrame + Vector3.new(1, 0+yOffset, 0))*(CFrame.Angles(0, 0, rad(r(10, 40)))),
		["Right Leg"] = (part.CFrame + Vector3.new(0.5, -1+yOffset, 0))*(CFrame.Angles(0, 0, rad(r(10, 30)))),
		["Torso"] = (part.CFrame + Vector3.new(0, 0+yOffset, 0))
	}
	
	return PartToCFrame[part.Name]
end

And when player dies, I do this for every part:

local Tween = TweenService:Create(part, TweenInfo.new(3, Enum.EasingStyle.Sine), {CFrame = GetCFrame(part)})
Tween:Play()

Your Vector3 offset needs to be making use of the player’s direction. Your X value will need to change to a Z value as the player rotates, we do this with CFrame.RightVector. I don’t know the exact values so please play around with making either x or z negative or using CFrame.LookVector.

["Left Arm"] = (part.CFrame + Vector3.new(part.CFrame.RightVector.X, 0+yOffset, part.CFrame.RightVector.Z))*(CFrame.Angles(0, 0, rad(-r(10, 40)))),

like this?

local function GetCFrame(part: BasePart)
	local PartToCFrame = {
		["Head"] = part.CFrame + Vector3.new(part.CFrame.RightVector.X, 1+yOffset, part.CFrame.RightVector.Z),
		["Left Arm"] = (part.CFrame + Vector3.new(part.CFrame.RightVector.X, 0+yOffset, part.CFrame.RightVector.Z))*CFrame.Angles(0, 0, rad(-r(10, 40))),
		["Left Leg"] = (part.CFrame + Vector3.new(part.CFrame.RightVector.X, -1+yOffset, part.CFrame.RightVector.Z))*CFrame.Angles(0, 0, rad(-r(10, 30))),
		["Right Arm" ] = (part.CFrame + Vector3.new(part.CFrame.RightVector.X, 0+yOffset, part.CFrame.RightVector.Z))*CFrame.Angles(0, 0, rad(r(10, 40))),
		["Right Leg"] = (part.CFrame + Vector3.new(part.CFrame.RightVector.X, -1+yOffset, part.CFrame.RightVector.Z))*CFrame.Angles(0, 0, rad(r(10, 30))),
		["Torso"] = part.CFrame + Vector3.new(part.CFrame.RightVector.X, 0+yOffset, part.CFrame.RightVector.Z)
	}
	
	return PartToCFrame[part.Name]
end

This works, but how do I create more space between body parts, like shown in the first gif, and prevent character from leaning to the side?
55eb1de8e7e72aa90b2de4e906c5d428

You can just add the RightVector to the cframe

Ex:

becomes

part.CFrame + part.CFrame.RightVector * -0.5 + Vector3.new(0, -1+yOffset, 0)

some of them still need to be negative like the left arm and leg @hell_ish is correct just adding is easier. if you want more distance you can multiply the RightVector

local scalar: number = 2
-- ...
["Left Arm"] = (part.CFrame + (scalar * -part.CFrame.RightVector + Vector3.new(0, 0+yOffset, 0)))*CFrame.Angles(0, 0, rad(-r(10, 40))),
["RightArm"] = (part.CFrame + (scalar * part.CFrame.RightVector + Vector3.new(0, 0+yOffset, 0)))*CFrame.Angles(0, 0, rad(-r(10, 40))),

where the scalar controls how far apart they should be. Notice only the left arm and leg should have negative right vectors. The head and torso don’t need a right vector as they don’t move along the x/z plane

1 Like

Thank you! This seems to be working (even without scalar). Current code:

local yOffset = 5

local function GetCFrame(part: BasePart)
	local RightVector = part.CFrame.RightVector
	local PartToCFrame = {
		["Head"] = part.CFrame + Vector3.new(0, 1+yOffset, 0),
		["Left Arm"] = (part.CFrame + (-RightVector+Vector3.new(0, 0+yOffset, 0)))*CFrame.Angles(170, 0, rad(-r(10, 50))),
		["Left Leg"] = (part.CFrame + (-RightVector+Vector3.new(0, -1+yOffset, 0)))*CFrame.Angles(170, 0, rad(-r(10, 40))),
		["Right Arm" ] = (part.CFrame + (RightVector+Vector3.new(0, 0+yOffset, 0)))*CFrame.Angles(170, 0, rad(r(10, 50))),
		["Right Leg"] = (part.CFrame + (RightVector+Vector3.new(0, -1+yOffset, 0)))*CFrame.Angles(170, 0, rad(r(10, 40))),
		["Torso"] = part.CFrame + Vector3.new(0, 0+yOffset, 0)
	}
	
	return PartToCFrame[part.Name]
end
1 Like