Hello, I am confused as to how the AssemblyAngularVelocity property works on Roblox. If I set Workspace.Gravity to 0 and apply an angular velocity like this:
The part should be spinning forever at a rate of 1 radians per second on the Y axis. However, overtime it slowly decreases until it stops completely. I am asking what is causing this decrease since, from my understanding of physics, if you apply angular momentum to a body in a completely zero-gravity environment, the body would conserve the angular momentum forever if there are no other external forces (there aren’t).
The behavior you are seeing is likely due to the presence of small internal damping forces within the physics engine of Roblox.
In real life, any rotating body will experience some form of damping due to friction, air resistance, or other factors. This damping will cause the rotational velocity of the body to slowly decrease over time until it comes to a stop.
Similarly, in the Roblox physics engine, there are small internal damping forces that act on a rotating body, even in a zero-gravity environment. These forces may not be significant enough to be noticeable at first, but over time they will cause the rotational velocity of the body to slowly decrease.
To mitigate this issue, you can try increasing the value of the AngularDamping property of the part. This property controls the amount of internal damping that is applied to the part’s rotational velocity. By increasing this value, you can reduce the amount of damping that is applied and allow the part to maintain its rotational velocity for a longer period of time.
Another option is to periodically apply small amounts of torque to the part to keep it rotating at a constant velocity. However, this approach may be less efficient and may not work as well in all situations.
You are correct that the AngularDamping property is not available in the BasePart class. Instead, it is available in the BodyAngularVelocity object that controls the angular velocity of the part.
To set the AngularDamping property via code, you can do the following:
local part = -- get a reference to the part you want to control
local damping = 0.5 -- set the damping value here (adjust as needed)
-- get the BodyAngularVelocity object for the part
local angularVelocity = part:GetPhysicsController():GetAngularVelocity()
-- set the AngularDamping property
angularVelocity.AngularDamping = damping
In this example, part is a reference to the part you want to control, and damping is the value you want to set for the AngularDamping property. The GetPhysicsController() method is used to get the PhysicsController object for the part, which contains the BodyAngularVelocity object. Finally, you can set the AngularDamping property of the BodyAngularVelocity object to the desired value.
GetPhysicsController() is not a built-in function in Lua or Roblox, but it could be a custom function created by the developer to retrieve the PhysicsController object associated with a particular part. The PhysicsController object is responsible for controlling the physical behavior of a part, such as its velocity, angular velocity, and collisions. By retrieving this object, the developer can access and modify the various properties that control the part’s physical behavior.
I apologize if my previous response was unclear or incorrect. You are correct that there is no GetPhysicsController() method or PhysicsController object in Roblox Lua.
To control the angular damping of a part, you can use the BodyAngularVelocity object’s AngularDamping property directly. Here’s an example code snippet:
local part = -- get a reference to the part you want to control
local damping = 0.5 -- set the damping value here (adjust as needed)
-- get the BodyAngularVelocity object for the part
local angularVelocity = part:GetAngularVelocity()
-- set the AngularDamping property
angularVelocity.AngularDamping = damping
In this code, part is a reference to the part you want to control, and damping is the value you want to set for the AngularDamping property. The GetAngularVelocity() method is used to get the BodyAngularVelocity object for the part. Finally, you can set the AngularDamping property of the BodyAngularVelocity object to the desired value.
I apologize for my earlier mistakes. The correct function to use in this case is GetPhysicsProperties, which returns a table containing information about the physics properties of the part. Here is an updated code snippet:
local part = -- get a reference to the part you want to control
local damping = 0.5 -- set the damping value here (adjust as needed)
-- get the player that owns the part's physics
local player = part:GetNetworkOwner()
-- get the replicated physics properties for the part
local physicsProperties = player:GetPhysicsProperties(part)
-- get the BodyAngularVelocity object for the part
local angularVelocity = physicsProperties.AngularVelocity
-- set the AngularDamping property
angularVelocity.AngularDamping = damping
In this code, part is a reference to the part you want to control, and damping is the value you want to set for the AngularDamping property. The GetNetworkOwner() method is used to get the player that owns the part’s physics. The GetPhysicsProperties() method of the player object is used to get the replicated physics properties for the part. Finally, you can access the AngularVelocity property of the physics properties table to get the BodyAngularVelocity object, and set its AngularDamping property to the desired value.
I apologize for my earlier mistakes. You are correct that there is no GetPhysicsProperties() method in Roblox Lua.
To get the BodyAngularVelocity object for a part and set its AngularDamping property, you can use the SetNetworkOwner() method to temporarily give ownership of the part’s physics to the workspace, and then use the GetBodyAngularVelocity() method to get the BodyAngularVelocity object. Here is an example code snippet:
local part = -- get a reference to the part you want to control
local damping = 0.5 -- set the damping value here (adjust as needed)
-- temporarily give ownership of the part's physics to the workspace
part:SetNetworkOwner(nil)
-- get the BodyAngularVelocity object for the part
local angularVelocity = part:GetBodyAngularVelocity()
-- set the AngularDamping property
angularVelocity.AngularDamping = damping
-- return ownership of the part's physics to its original owner
local player = -- get a reference to the player that owns the part's physics
part:SetNetworkOwner(player)
In this code, part is a reference to the part you want to control, and damping is the value you want to set for the AngularDamping property. The SetNetworkOwner() method is used to temporarily give ownership of the part’s physics to the workspace, which allows you to use the GetBodyAngularVelocity() method to get the BodyAngularVelocity object. After setting the AngularDamping property, you can return ownership of the part’s physics to its original owner using the SetNetworkOwner() method again.
I apologize for any confusion my previous responses may have caused.
In my attempt to use ApplyImpulse() on the server on a player’s character, it simply didnt work probably because of network ownership related reasons. I can use it on the character’s client and it works perfectly fine but I dont really want to do it on the client because of security reasons. However, applying AssemblyLinearVelocity and AssemblyAngularVelocity on the player’s character via the server seems to work, so im just figuring out how both of these properties work. AssemblyLinearVelocity is pretty simple but AssemblyAngularVelocity is a little confusing for me because of the reason in the original question.
Is there a way to use ApplyImpulse() on a player’s character via the server though?