DeviceGravityChanged
The DeviceGravityChanged event fires when the device’s gravity DataType/Vector3/vector
changes on a device that has an accelerometer.
A device’s gravity vector represent the force of gravity on each of the device’s X, Y, and Z axes. While gravity never changes, the force it exerts on each axis changes when the device rotates and changes orientation. The force value exerted on each axis is a unit vector ranging from -1 to 1.
An accelerometer is a component found in most mobile devices that measures acceleration (change in speed).
This event can be used to determine the real-world direction of the force of gravity on a user’s device. This even can then be used to simulate the force of gravity on a user’s device within the game, such as on in-game objects (see example below).
To check if a user’s device has an enabled accelerometer, see UserInputService/AccelerometerEnabled
. If the device has an enabled accelerometer, you can use the UserInputService/GetDeviceGravity
function to get the current force of gravity on the user’s device.
Parameters
Name | Type | Default | Description |
---|---|---|---|
|
An |
Code Samples
Move a Ball using the Accelerometer
This code adds a force on a part so that it falls in the direction of actual gravity relative to the user’s device. This code can be seen in this uncopylocked place.
In order for this example to work as expected, it must be placed in a LocalScript
and the user’s device must have an UserInputService/AccelerometerEnabled|accelerometer
.
local UserInputService = game:GetService("UserInputService")
local Ball = game.Workspace.Ball
local RealGravity = Instance.new("BodyForce", Ball)
local AntiGravity = Instance.new("BodyForce", Ball)
AntiGravity.force = Vector3.new(0, 196.2 * Ball:GetMass(), 0)
local function MoveBall(gravity)
RealGravity.force = gravity.Position * 196.2 * game.Workspace.Ball:GetMass()
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(MoveBall)
end
Create a Gyroscopic Camera
This example controls the player’s Camera
so that it matches the player’s device orientation via using the device’s UserInputService/GyroscopeEnabled|gyroscope
and UserInputService/AccelerometerEnabled|accelerometer
.
The camera is positioned inside the player’s head, and updated to move with the player and the user’s device rotation, by executing the following line every RunService/BindToRenderStep|RenderStep
:
camera.CFrame = CFrame.new(head.Position - Vector3.new(0,8,10)) * currentRotation
The code sample relies on the device’s gyroscope to determine when the player rotates their device. It does so by connecting to the UserInputService/DeviceRotationChanged|DeviceRotationChanged
event.
The code sample relies on the device’s accelerometer to retrieve the gravity vector used to determine the device’s orientation (whether it is flipped upside down or not). To determine whether the device’s orientation is upside down, the code sample uses the UserInputService/DeviceGravityChanged|DeviceGravityChanged
event.
Since the script places the camera inside the head to create a first-person camera, the limbs are made transparent by the HideCharacter()
function so that the player does not see their Player/Character
when rotating the camera.
In order for this example to work as expected, it must be placed in a LocalScript
and the user’s device must have a gyroscope and an accelerometer.
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:wait()
local head = character:WaitForChild("Head")
local camera = game.Workspace.CurrentCamera
local currentRotation = camera.CFrame-- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -.5 or gravity.Position.Z > .5)
orientationSet = true
end
end
local function RotationChanged(rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x,y,z = delta:toEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs (character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
local function UpdateCamera()
local camera = game.Workspace.CurrentCamera
camera.CoordinateFrame = currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0,0,-10))
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0,8,10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0,0,-10))
end)
end