I’m trying to create like a door swivel animation, but can’t seem to find anything on how to make a part swivel on a fixed point. Currently I’ve got it so the door rotates on the centre axis, and it constantly spins, instead of stopping

```
local function RenderStepped()
Door = nil
local Character = Player.Character
if Character then
local HumanoidRootPart = Character:FindFirstChild('HumanoidRootPart')
if not HumanoidRootPart then return end
for _, v in pairs(AllDoors) do
local Distance = (v.CFrame.Position - HumanoidRootPart.CFrame.Position).magnitude
if not Door or Distance <= Door.Distance then
Door = {
Current = v,
Distance = Distance
}
end
end
if not Door then return end
local Distance = Door.Distance
local Hinge = Door.Current.Parent:FindFirstChild('Hinge')
if not Hinge then return end
if Distance <= ReachableDistance then
local DoorOpen = TweenService:Create(Door.Current, TweenInfo.new(), {CFrame = Door.Current.CFrame * CFrame.Angles(0, math.rad(45), 0)}):Play()
else
print('Close')
end
end
end
```

If I’ve made this more convoluted than it needs to be then please let me know

How I lay the models out

Basically,

`Buildings`

are the exteriors, and

`Rooms`

are the interiors. They have a

`Door`

, which is the part that swings open,

`Teleporter`

which when touched teleports the player into the respective spot, and then

`Hinge`

, which is the axis the door should swing on.

I would put a part called hinge inside the door and add WeldConstraint between the door and the hinge

And here is my script:

```
local TweenService = game:GetService("TweenService")
local hinge = script.Parent.Hinge
local openGoal = {}
openGoal.CFrame = CFrame.new(hinge.Position) * CFrame.Angles(0, math.rad(90), 0)
local closeGoal = {}
closeGoal.CFrame = CFrame.new(hinge.Position) * CFrame.Angles(0, math.rad(0), 0)
local tweenInfo = TweenInfo.new(2)
local openTween = TweenService:Create(hinge, tweenInfo, openGoal)
local closeTween = TweenService:Create(hinge, tweenInfo, closeGoal)
local closed = true
script.Parent.Part.ClickDetector.MouseClick:Connect(function()
if closed then
openTween:Play()
closed = false
else
closeTween:Play()
closed = true
end
end)
```

now the door doesn’t rotate on the center axis

1 Like

Not sure if I’m doing something wrong, but it’s not working

The open print does print

```
local function NearestDoorChanged(door)
local CurrentDoor
if not CurrentDoor then
CurrentDoor = door
end
if CurrentDoor then
print('Open')
local openGoal = {}
openGoal.CFrame = CFrame.new(CurrentDoor.Hinge.Position) * CFrame.Angles(0, math.rad(90), 0)
local tweenInfo = TweenInfo.new(2)
local openTween = TweenService:Create(CurrentDoor.Hinge, tweenInfo, openGoal)
openTween:Play()
else
print('Door has not been found, close')
end
CurrentDoor = door
end
```

Make sure the hinge is anchored and the door itself unanchored (and the hinge connected to the door with weldconstraint)

Also try changing the math.rad in cframe angles to negative 90 and change the math.rad parameter place between the braces because the rotation might depend on where the door is placed

This seems to work, HOWEVER

```
if door then
local Goal = {}
Goal.CFrame = CFrame.new(CurrentDoor.Hinge.Position) * CFrame.Angles(0, -math.rad(120), 0)
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5, Enum.EasingStyle.Bounce), Goal)
Tween:Play()
else
local Goal = {}
Goal.CFrame = CFrame.new(CurrentDoor.Hinge.Position) * CFrame.Angles(0, 0, 0)
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5), Goal)
Tween:Play()
end
```

If the door is rotated on a different angle, then it doesn’t work. I need it to rotate relative to the doors position

Hold on, I am in school at the moment. When I’m home I will look into it.

I made a new script that rotates the hinge relative to it’s position

```
local TweenService = game:GetService("TweenService")
local hinge = script.Parent.Hinge
local openGoal = {}
openGoal.CFrame = hinge.CFrame:ToWorldSpace(CFrame.Angles(0, math.rad(90), 0))
local closeGoal = {}
closeGoal.CFrame = hinge.CFrame:ToWorldSpace(CFrame.Angles(0, math.rad(0), 0))
local tweenInfo = TweenInfo.new(0.5, Enum.EasingStyle.Bounce)
local openTween = TweenService:Create(hinge, tweenInfo, openGoal)
local closeTween = TweenService:Create(hinge, tweenInfo, closeGoal)
local closed = true
script.Parent.Part.ClickDetector.MouseClick:Connect(function()
if closed then
openTween:Play()
closed = false
else
closeTween:Play()
closed = true
end
end)
```

So in your case it would be

```
if door then
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, -math.rad(120), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5, Enum.EasingStyle.Bounce), Goal)
Tween:Play()
else
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, math.rad(0), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5), Goal)
Tween:Play()
end
```

I hope this helps

Door doesn’t wanna shut when door == nil

```
if door then
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, -math.rad(120), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5, Enum.EasingStyle.Bounce), Goal)
Tween:Play()
else
print('Close')
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, math.rad(0), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5), Goal)
Tween:Play()
end
```

print(‘Close’) does print (when door == nil) however the door just stays open. And since door stays open, when you go back, it rotates the door more and more, until it goes back to the beginning (3 times, as 3*120 = 360)

Try changing your script to

```
if door then
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, -math.rad(120), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5, Enum.EasingStyle.Bounce), Goal)
Tween:Play()
else
print('Close')
local Goal = {}
Goal.CFrame = CurrentDoor.Hinge.CFrame:ToWorldSpace(CFrame.Angles(0, math.rad(120), 0))
local Tween = TweenService:Create(CurrentDoor.Hinge, TweenInfo.new(0.5), Goal)
Tween:Play()
end
```