Difference between revisions of "TranslateTo - ObjectReference"

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Nickudell
(Altered Parameters to reflect which are absolute coordinates and which are relative coordinates)
(added a new discovery (flagging as full LOD) that causes the function to fail.)
 
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[Category:Scripting]]
[[Category:Scripting]]
[[Category:Papyrus]]
[[Category:Papyrus]]
[[Category:Console Commands]]
'''Member of:''' [[ObjectReference Script]]
'''Member of:''' [[ObjectReference Script]]


Line 16: Line 15:
*afY: Position along the Y axis (Absolute world coordinates).
*afY: Position along the Y axis (Absolute world coordinates).
*afZ: Position along the Z axis (Absolute world coordinates).
*afZ: Position along the Z axis (Absolute world coordinates).
*afAngleX: Destination X Angle (Relative to original angle).
*afAngleX: Destination X Angle (Absolute world rotation).
*afAngleY: Destination Y Angle (Relative to original angle) (rarely used).
*afAngleY: Destination Y Angle (Absolute world rotation) (rarely used).
*afAngleZ: Destination Z Angle (Relative to original angle).
*afAngleZ: Destination Z Angle (Absolute world rotation).
*afSpeed: Movement Speed.
*afSpeed: Movement Speed.
*afMaxRotationSpeed: Maximum rotation Speed (default is 0 to mean "don't clamp the rotation speed") - Negative values cause unpredictable rotation.
*afMaxRotationSpeed: Maximum rotation Speed (default is 0 to mean "don't clamp the rotation speed") - Negative values cause unpredictable rotation.
Line 38: Line 37:
== Tips ==
== Tips ==
A movement speed parameter (afSpeed) of 1 is extremely slow - nearly imperceptible to the human eye.  Starting at a an afSpeed of 100 and working up or down towards the desired speed is recommended.  
A movement speed parameter (afSpeed) of 1 is extremely slow - nearly imperceptible to the human eye.  Starting at a an afSpeed of 100 and working up or down towards the desired speed is recommended.  
== Notes ==
*The movement speed is in [[Units|units]] per second.
*The rotation speed is in degrees per second.
*afMaxRotationSpeed equal to 0 means that the object will reach the target rotation when it reaches the target position.
*It is not possible to cause the object to rotate faster than it would with afMaxRotationSpeed equal to 0. (Cannot reach target rotation before target position.)
*The OnTranslationComplete event will fire when the object reaches both the target position and target rotation.
*The OnTranslationAlmostComplete event can fire even when the target rotation is far from being reached.
== Collision boxes, bugs and other oddities ==
The collision "boxes" may not be updated after using this function. Here are some of the observations reported on the forums. [http://forums.bethsoft.com/topic/1383367-getting-collisions-to-move-with-translateto/page__view__findpost__p__20989813 (source)]
* The collision box is property updated for moveable statics.
* The collision box is not moved for other static objects. To fix this the object must be declared as a MoveableStatic and its mesh must have the bhkRigidBody settings corrected (see [http://forums.bethsoft.com/topic/1383367-getting-collisions-to-move-with-translateto/page__view__findpost__p__20988707 this post]).
* The collision box is voided for actors (but they will still collide with the ground). They will go through other actors, activators, etc.
Besides of that, a few bugs and oddities have been reported:
* Using havok collision in an activator then trying to translate it doesn't work... it just sits there motionless.
* You can however translate an enabled activator when it has no 3D... meaning you can do it from ANYWHERE at any time - as long as it was enabled (and a slight wait or other function afterwards).
* The function does not work on MiscItems (presumably for the same reason). [[SetPosition - ObjectReference]] works though.
* '''It is possible to translate havok-enabled items''' by [[SetMotionType_-_ObjectReference|setting their MotionType]] to motion_keyframed. After being translated, they can be forced back into Havok simulation by changing their motion type back to motion_dynamic and [[ApplyHavokImpulse - ObjectReference|applying a small havok impulse]]. Deleting havok objects or changing their motion type mid-translation may cause a CTD: use [[StopTranslation - ObjectReference|StopTranslation]] first.
* You cannot translate something that is disabled (or was just enabled). You will get a no3D error. It may even be necessary to add a [[Wait - Utility]] statement or double-check the load status using [[Is3DLoaded - ObjectReference]] before translating an object after its OnLoad event is called.
*You cannot translate an object that is flagged as '''Full LOD''', it will simply ignore the command and papyrus logs will show no errors.
Translating water activators:
* Water plane activators can be translated, but their collision does not move with them unless the "Movable" keyword is added to the activator. This can be seen in TG08Water1024.
* The collision for water planes is handled in a very "coarse" manner. Non-horizontal water planes will intersect strangely and may cause objects to float well above their surfaces.


== See Also ==
== See Also ==
Line 48: Line 74:
*[[OnTranslationComplete - ObjectReference]]
*[[OnTranslationComplete - ObjectReference]]
*[[OnTranslationFailed - ObjectReference]]
*[[OnTranslationFailed - ObjectReference]]
*[[Spatial functions and snippets]]

Latest revision as of 22:47, 15 November 2024

Member of: ObjectReference Script

Makes the object translate to the passed in position and orientation at the given speed.

Syntax[edit | edit source]

Function TranslateTo(float afX, float afY, float afZ, float afAngleX, float afAngleY, float afAngleZ, float afSpeed, \
  float afMaxRotationSpeed = 0.0) native

Parameters[edit | edit source]

  • afX: Position along the X axis (Absolute world coordinates).
  • afY: Position along the Y axis (Absolute world coordinates).
  • afZ: Position along the Z axis (Absolute world coordinates).
  • afAngleX: Destination X Angle (Absolute world rotation).
  • afAngleY: Destination Y Angle (Absolute world rotation) (rarely used).
  • afAngleZ: Destination Z Angle (Absolute world rotation).
  • afSpeed: Movement Speed.
  • afMaxRotationSpeed: Maximum rotation Speed (default is 0 to mean "don't clamp the rotation speed") - Negative values cause unpredictable rotation.

Return Value[edit | edit source]

None.

Examples[edit | edit source]

; Translate the bird slowly to 0,0,0 with a rotation of 90,90,90
Bird.TranslateTo(0.0, 0.0, 0.0, 90.0, 90.0, 90.0, 1.0)


; Translate the bird slowly to 0,0,0 with a rotation of 90,90,90 with a max rotation speed of 10
Bird.TranslateTo(0.0, 0.0, 0.0, 90.0, 90.0, 90.0, 1.0, 10.0)

Tips[edit | edit source]

A movement speed parameter (afSpeed) of 1 is extremely slow - nearly imperceptible to the human eye. Starting at a an afSpeed of 100 and working up or down towards the desired speed is recommended.

Notes[edit | edit source]

  • The movement speed is in units per second.
  • The rotation speed is in degrees per second.
  • afMaxRotationSpeed equal to 0 means that the object will reach the target rotation when it reaches the target position.
  • It is not possible to cause the object to rotate faster than it would with afMaxRotationSpeed equal to 0. (Cannot reach target rotation before target position.)
  • The OnTranslationComplete event will fire when the object reaches both the target position and target rotation.
  • The OnTranslationAlmostComplete event can fire even when the target rotation is far from being reached.

Collision boxes, bugs and other oddities[edit | edit source]

The collision "boxes" may not be updated after using this function. Here are some of the observations reported on the forums. (source)

  • The collision box is property updated for moveable statics.
  • The collision box is not moved for other static objects. To fix this the object must be declared as a MoveableStatic and its mesh must have the bhkRigidBody settings corrected (see this post).
  • The collision box is voided for actors (but they will still collide with the ground). They will go through other actors, activators, etc.


Besides of that, a few bugs and oddities have been reported:

  • Using havok collision in an activator then trying to translate it doesn't work... it just sits there motionless.
  • You can however translate an enabled activator when it has no 3D... meaning you can do it from ANYWHERE at any time - as long as it was enabled (and a slight wait or other function afterwards).
  • The function does not work on MiscItems (presumably for the same reason). SetPosition - ObjectReference works though.
  • It is possible to translate havok-enabled items by setting their MotionType to motion_keyframed. After being translated, they can be forced back into Havok simulation by changing their motion type back to motion_dynamic and applying a small havok impulse. Deleting havok objects or changing their motion type mid-translation may cause a CTD: use StopTranslation first.
  • You cannot translate something that is disabled (or was just enabled). You will get a no3D error. It may even be necessary to add a Wait - Utility statement or double-check the load status using Is3DLoaded - ObjectReference before translating an object after its OnLoad event is called.
  • You cannot translate an object that is flagged as Full LOD, it will simply ignore the command and papyrus logs will show no errors.

Translating water activators:

  • Water plane activators can be translated, but their collision does not move with them unless the "Movable" keyword is added to the activator. This can be seen in TG08Water1024.
  • The collision for water planes is handled in a very "coarse" manner. Non-horizontal water planes will intersect strangely and may cause objects to float well above their surfaces.

See Also[edit | edit source]