I am trying to play animations inside a ViewportFrame, using WorldModel, however half of them don’t play.
First case, the Open animation never plays, even tho I set it up just like the Shake animation.
Secondly, the Idle animation of the dog never plays either. I am unsure if this is due to same reason the Open animation not playing, or possibly due to it being a skinned mesh? (Idk, maybe skinned meshes don’t work in viewports?)
-- Load animations
local Shake = NewCrate.AnimationController.Animator:LoadAnimation(NewCrate.Shake)
local Open = NewCrate.AnimationController.Animator:LoadAnimation(NewCrate.Open)
-- Shake animation
for i = 1, 3 do
Shake:Play()
wait(1.25)
end
Open:Play()
I can’t see any reason why the open animation would not play? It has a higher priority than the Shake animation, so it’s not being overwritten. Can see the exact Open animation below in the animation editor.
Code for the dog model. Once again, this Idle animation 100% works in the world, but doesn’t play when in the viewport
local WorldModel = Instance.new("WorldModel")
-- Copy over the pets contents
for _, v in pairs(PetModel:GetChildren()) do
local New = v:Clone()
New.Parent = WorldModel
end
-- Set postion
WorldModel.PrimaryPart = WorldModel.HumanoidRootPart
WorldModel:SetPrimaryPartCFrame(
CFrame.new(0, 0, 0) + Vector3.new(0, 1.25, 0)
)
WorldModel.Parent = Viewport
-- Load pet animations
local Idle = WorldModel.Humanoid.Animator:LoadAnimation(WorldModel.Idle)
Idle:Play()
Skinned mesh animations do play in ViewportFrames, however, they do not cause the ViewportFrame to update. To see the animation update each frame, you need to trigger a ViewportFrame update each frame. This can be done by changing a property of the mesh on .Heartbeat (toggling .Anchored on/off each frame works, for example)
I noted this here & talked to Roblox staff about it in DMs but it’s still an issue.
local viewportModel -- your skinned mesh model
local onOff = true
game:GetService("RunService").Heartbeat:Connect(function()
onOff = not onOff
viewportModel.PrimaryPart.Anchored = onOff
end)
This will result in the ViewportFrame updating every frame and therefore you’ll be able to see your animation playing. It’s a workaround and quite annoying, this definitely needs a better solution.
It’s basically the same thing , I’m trying to play an animation on a model that’s wrapped by a “WorldModel” , within a viewportframe , and the model is a skinned mesh , it only updates when I update properties of the model itself.
I’m having the same issue as this. The skinned mesh animation works in the WorldModel in Studio only, but when I turned off the Cage Mesh Deformer Beta it stopped working in studio as well. Turned it back on but it still will not work in the live game.
So the beta seems to fix it for me at least…Just can’t use it
I think animations are broken in WorldModels. I’m not using any Beta features. Let me know if a repro is helpful.
If animations do work on character models in a VPF, I’d like to understand if there is anything special that needs to be done. Is there a demo of it? I imagine it’s a very common use case for building shops/avatar editors.
I have managed to do characters (with animations) in a viewport, by simply having a dummy rig stored in RepStorage, and cloning it into the Viewport.WorldModel and then using HumanoidDescription to get it to match my character. No beta features turned on either
--// Setup the character model for the viewport
local function SetupCharacter()
if Player.UserId <= 0 then return end
-- Create camera
local ViewportCamera = Instance.new("Camera")
ViewportCamera.FieldOfView = 50
ViewportCamera.CFrame = CFrame.new(-0.25, 1.5, 5)
ViewportCamera.Parent = PlayerViewport
local DummyClone = Dummy:Clone()
DummyClone:SetPrimaryPartCFrame(CFrame.new(0, 0, 0) * CFrame.Angles(0, math.rad(200), 0))
DummyClone.Parent = PlayerViewport.WorldModel
local HumanoidDescription
local Success, Error = pcall(function()
HumanoidDescription = Players:GetHumanoidDescriptionFromUserId(Player.UserId)
end)
if Success then -- Set dummy
DummyClone.Humanoid:ApplyDescription(HumanoidDescription)
else
warn(Error)
end
-- Get objects and parent to WorldModel
for _, v in pairs(DummyClone:GetChildren()) do
v.Parent = PlayerViewport.WorldModel
end
DummyClone:Destroy()
PlayerViewport.CurrentCamera = ViewportCamera
-- Do idle animation
local Idle = PlayerViewport.WorldModel.Humanoid.Animator:LoadAnimation(PlayerViewport.WorldModel.Idle)
Idle:Play()
end
Hello! Were you able to get the dog pet in the original post to animate? I’m running into the same exact problem where its shows up in the ViewportFrame but just won’t show any animation. I’m also using similar code to you.
local object = script.Parent.Muck
local camera = Instance.new("Camera")
camera.CFrame = CFrame.new(object.RootPart.Position + (object.RootPart.CFrame.lookVector*4),object.RootPart.Position)
camera.Parent = script.Parent
script.Parent.Parent.CurrentCamera = camera
local animation = Instance.new("Animation")
animation.AnimationId = "https://www.roblox.com/asset/?id=7913452598"
local AnimationController = object.AnimationController
local animationTrack = AnimationController:LoadAnimation(animation)
animationTrack.Looped = true
animationTrack:Play()