The default idle pose is incorrect

In the profile page the default idle pose should be the normal idle pose. But the default idle pose right now is the rhtro idle pose.

Also this bug affects old bundle images.
Expected behavior
Profile:
When no animation package is selected, the default pose is expected to be like Character 1.

image

(Character 1)

image

(Character 2)


Bundles:

The character pose in the bundle images should be as in screenshot 1.


(Screenshot 1)


(Screenshot 2)

10 Likes

I think this is intended behaviour, some of the older R15 animations are being replaced with Rthro animations like the running animation

3 Likes

This is not the expected behavior. There has been no announcement of such an update anywhere. Nevertheless, if there were such an update, I think they would add an option to return to the normal idle pose.

This is wrong information. You can still use regular R15 animations.

1 Like

Hello @music_man1996 i think you are interested in website bugs. it’s been 24 days, is there any update?

1 Like

The running, walking and swimming animations have been replaced with their rthro counterparts since the release of rthro. (doing that was kinda redundant though since the rthro animation pack is already its own bundle)

1 Like

No, if there is no ‘rhtro idle’ in a bundle package, it must have a default animation instead of rhtro pose. (Thumbnail)

There are no rhtro animations inside the old bundles.

1 Like

that was in 2018 when they replaced the running walking and swimming animations

1 Like

They replaced the default ‘action pose’ to the new rthro idle animation. Unfortunately this is intended behavior

1 Like

Can you prove that this is an update? Was it announced anywhere or did a staff member confirm it?

1 Like

This was an under-the-hood internal change as are most changes on this platform. Its not significant enough to make an announcement for

2 Likes

I think this is an important update. With this update, all blocky characters profile poses became terrible. It could be as you said, but there should be an option to return to ‘action pose’. The thumbnail was broken and incompatible in the old bundles. Hopefully, a staff will respond here and clear up this uncertainty.

2 Likes

They have yet to respond, shocker(!) I’m gonna bump this because the new pose is still absolutely disgusting to look at, even more so when compared with the original pose! :joy:

I thought we were supposed to be able to freely choose and create our own avatars?? - rather than having perfectly good + beloved features ripped out, and replaced with more rthro mess.

Roblox, PLEASE revert this or, at the very least, give us the option to choose between the two of them!!

2 Likes

i would probably actually use r15 if they fix the pose

3 Likes

bumping since the new pose is still disgusting

2 Likes

come on roblox… do the right thing… PLEASE!!! THE NEW POSE IS TERRIBLE!!

2 Likes

Bump. Roblox promotes imagination and creativity yet limits it at the same time. Action pose should be the default and the Rthro pose should be selected when the Rthro idle is selected.

If they were to bring back the old pose I would actually use R15 occasionally.

1 Like

I believe this change was done intentionally.
Here is the script responsible for rendering these bodyshots internally from 2021. (You cannot get anything above 2021 :/)

-- Avatar_R15_Action v1.1.1
-- For R6, this generates the normal with/without gear pose.  For R15 it positions their body in an action pose.
local baseUrl, characterAppearanceUrl, fileExtension, x, y = ...

local ThumbnailGenerator = game:GetService("ThumbnailGenerator")
ThumbnailGenerator:AddProfilingCheckpoint("ThumbnailScriptStarted")

pcall(function() game:GetService("ContentProvider"):SetBaseUrl(baseUrl) end)
game:GetService("ScriptContext").ScriptsDisabled = true

local player = game:GetService("Players"):CreateLocalPlayer(0)
player.CharacterAppearance = characterAppearanceUrl
player:LoadCharacterBlocking()

ThumbnailGenerator:AddProfilingCheckpoint("PlayerCharacterLoaded")

local poseAnimationId = "http://www.roblox.com/asset/?id=532421348"

local function getJointBetween(part0, part1)
    for _, obj in pairs(part1:GetChildren()) do
        if obj:IsA("Motor6D") and obj.Part0 == part0 then
            return obj
        end
    end
end

local function applyKeyframe(character, poseKeyframe)
    local function recurApplyPoses(parentPose, poseObject)
        if parentPose then
            local joint = getJointBetween(character[parentPose.Name], character[poseObject.Name])
            if joint and poseObject.Weight ~= 0 then
                joint.C1 = poseObject.CFrame:inverse() + joint.C1.p
            end
        end
        for _, subPose in pairs(poseObject:GetSubPoses()) do
            recurApplyPoses(poseObject, subPose)
        end
    end

    for _, poseObj in pairs(poseKeyframe:GetPoses()) do
        recurApplyPoses(nil, poseObj)
    end
end

local function applyR15Pose(character)
    local poseKeyframSequence = game:GetService("KeyframeSequenceProvider"):GetKeyframeSequence(poseAnimationId)
    local poseKeyframe = poseKeyframSequence:GetKeyframes()[1]

    applyKeyframe(character, poseKeyframe)
end

local function findAttachmentsRecur(parent, resultTable, returnDictionary)
    for _, obj in pairs(parent:GetChildren()) do
        if obj:IsA("Attachment") then
            if returnDictionary then
                resultTable[obj.Name] = obj
            else
                resultTable[#resultTable + 1] = obj
            end
        elseif not obj:IsA("Tool") and not obj:IsA("Accoutrement") then -- Leave out tools and accoutrements in the character
            findAttachmentsRecur(obj, resultTable, returnDictionary)
        end
    end
end

local function findAttachmentsInTool(tool)
    local attachments = {}
    findAttachmentsRecur(tool, attachments, false)
    return attachments
end

local function findAttachmentsInCharacter(character)
    local attachments = {}
    findAttachmentsRecur(character, attachments, true)
    return attachments
end

local function weldAttachments(attach1, attach2)
    local weld = Instance.new("Weld")
    weld.Part0 = attach1.Parent
    weld.Part1 = attach2.Parent
    weld.C0 = attach1.CFrame
    weld.C1 = attach2.CFrame
    weld.Parent = attach1.Parent
    return weld
end

local function findFirstMatchingAttachment(model, name)
    for _, child in pairs(model:GetChildren()) do
        if child:IsA("Attachment") and child.Name == name then
            return child
        elseif not child:IsA("Accoutrement") and not child:IsA("Tool") then
            local foundAttachment = findFirstMatchingAttachment(child, name)
            if foundAttachment then
                return foundAttachment
            end
        end
    end
end

local function doR15ToolPose(character, humanoid, tool)
    local characterAttachments = findAttachmentsInCharacter(character)
    local toolAttachments = findAttachmentsInTool(tool)
    local foundAttachments = false
    -- If matching attachments exist in the gear then weld them and do the "action" R15 pose.
    -- Otherwise keep the R15 in the T-Pose position and just raise the arm.
    for _, attachment in pairs(toolAttachments) do
        local matchingAttachment = characterAttachments[attachment.Name]
        if matchingAttachment then
            foundAttachments = true
            weldAttachments(matchingAttachment, attachment)
        end
    end

    if foundAttachments then
        tool.Parent = character
        applyR15Pose(character)

		local toolPose = tool:FindFirstChild("ThumbnailPose")
		if toolPose and toolPose:IsA("Keyframe") then
			applyKeyframe(character, toolPose)
		end
    else
        tool.Parent = nil
        local rightShoulderJoint = getJointBetween(character.UpperTorso, character.RightUpperArm)
        if rightShoulderJoint then
            rightShoulderJoint.C1 = rightShoulderJoint.C1 *  CFrame.new(0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 1, 0):inverse()
        end
        if tool:FindFirstChild("Handle") then
            local attachment = findFirstMatchingAttachment(character, "RightGripAttachment")
            if attachment then
                tool.Handle.CFrame = attachment.Parent.CFrame * attachment.CFrame * tool.Grip:inverse()
            end
        end
        humanoid:EquipTool(tool)
    end
end

local character = player.Character
if character then
    local tool = character:FindFirstChildOfClass("Tool")
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local animateScript = character:FindFirstChild("Animate")
    if animateScript then
        local equippedPoseValue = animateScript:FindFirstChild("Pose") or animateScript:FindFirstChild("pose")
        if equippedPoseValue then
            local poseAnim = equippedPoseValue:FindFirstChildOfClass("Animation")
            if poseAnim then
                poseAnimationId = poseAnim.AnimationId
            end
        end
    end

    if humanoid then
        if humanoid.RigType == Enum.HumanoidRigType.R6 then
            if tool then
                character.Torso["Right Shoulder"].CurrentAngle = math.rad(90)
            end
        elseif humanoid.RigType == Enum.HumanoidRigType.R15 then
            if tool then
                doR15ToolPose(character, humanoid, tool)
            else
                applyR15Pose(character)
            end
        end
    end
end

local result, requestedUrls = ThumbnailGenerator:Click(fileExtension, x, y, --[[hideSky = ]] true)
ThumbnailGenerator:AddProfilingCheckpoint("ThumbnailGenerated")

return result, requestedUrls

The poseAnimationId variable was originally set to the ActionPose and does not change unless you have an animation package equipped with a pose assigned to it.

Someone definitely changed that variable because running this code in current day studio on someone without any animation packages equipped still shows the old pose.