Skip to content
This repository has been archived by the owner on Mar 28, 2024. It is now read-only.

[BUG-7743] Bezier Curve Support for llSetKeyframedMotion() #15418

Closed
sl-service-account opened this issue Nov 8, 2014 · 1 comment
Closed

Comments

@sl-service-account
Copy link

How would you like the feature to work?

This is being copied over from SCR-373

This proposal is for a new data-type for llSetKeyframedMotion()'s KFM_DATA option, entitled KFM_BEZIER_INTERPOLATION.

The additional data type adds an extra rotation to each keyframe that is interpreted as a bezier curve, described by the four points; P0=<0,0>, P1=<x,y>, P2=<z,s> and P3=<1,1>.

Using the bezier curve the key framed animation is able to determine how quickly or slowly to apply the interpolation between position and/or rotation. Specifically, the percentage time elapsed for the keyframe is treated as X, and fed into the curve to gain access to Y, which will describe the extent of the translation at that point. Using bezier curves it is possible to create smoothed transitions that accelerate, decelerate or both, allowing us to create natural movement with only a handful of keyframes; currently it is only possible to create smooth looking animations by adding multiple keyframes to simulate an acceleration or deceleration phase, however a bezier curve would allow this to be done with infinite precision, and with far greater simplicity for the scripter, and far less complexity for the simulator (no need for complex workarounds).

If not specified the default behaviour would be BEZIER_LINEAR, with other useful constants defined below (minus KFM_ prefix as they may be useful elsewhere):

|Constant|Value|
|
|-|-|-|
|BEZIER_LINEAR|<0.0, 0.0, 1.0, 1.0>|
|
|BEZIER_EASE|<0.25, 0.1, 0.25, 1.0|
|
|BEZIER_EASE_IN|<0.42, 0.0, 1.0, 1.0>|
|
|BEZIER_EASE_OUT|<0.0, 0.0, 0.58, 1.0>|
|
|BEZIER_EASE_IN_OUT|<0.42, 0.0, 0.58, 1.0>|



Examples:

Java<br>default { <br> state_entry() { <br> llSetKeyframedMotion( <br> [ // Keyframes <br> <0.0, 0.0, 10.0>, BEZIER_EASE_OUT, 1.0, // Launch <br> <0.0, 0.0, -10.0>, BEZIER_EASE_IN, 1.0, // Fall <br> <0.0, 0.0, 0.5>, BEZIER_EASE_IN_OUT, 0.25, // Unconvincing bounce up <br> <0.0, 0.0, -0.5>, BEZIER_EASE_IN, 0.25, // Fall to start position <br> ], <br> [ // Options <br> KFM_DATA, KFM_TRANSLATION | KFM_BEZIER_INTERPOLATION <br> ] <br> ); <br> } <br> <br> touch_start(integer x) { <br> llSetKeyframedMotion([], [KFM_COMMAND, KFM_CMD_PLAY]); <br> } <br>}<br>



Java<br>default { <br> state_entry() { <br> llSetKeyframedMotion( <br> [ // Keyframes <br> <10.0, 0.0, 0.0>, BEZIER_EASE_IN_OUT, 5.0, <br> <-10.0, 0.0, 0.0>, BEZIER_EASE_IN_OUT, 5.0 <br> ], <br> [ // Options <br> KFM_DATA, KFM_TRANSLATION | KFM_BEZIER_INTERPOLATION, <br> KFM_MODE, KFM_LOOP, <br> KFM_COMMAND, KFM_CMD_PLAY <br> ] <br> ); <br> } <br>}<br>



For a good source to see what bezier-curves make possible, take a look at the CSS3 animation-timing-function.|

Why is this feature important to you? How would it benefit the community?

This would be a very useful capability for key-framed motion, as it eliminates the need to add additional frames in order to perform smoothing, as the curves can be used to produce smoothing far more easily.

Original Jira Fields
Field Value
Issue BUG-7743
Summary Bezier Curve Support for llSetKeyframedMotion()
Type New Feature Request
Priority Unset
Status Closed
Resolution Unactionable
Reporter Haravikk Mistral (haravikk.mistral)
Created at 2014-11-08T19:08:28Z
Updated at 2014-11-12T19:30:29Z
{
  'Business Unit': ['Platform'],
  'Date of First Response': '2014-11-12T13:30:29.308-0600',
  'How would you like the feature to work?': "This is being copied over from SCR-373\r\n\r\nThis proposal is for a new data-type for {{llSetKeyframedMotion()}}'s {{KFM_DATA}} option, entitled {{KFM_BEZIER_INTERPOLATION}}.\r\n\r\nThe additional data type adds an extra {{rotation}} to each keyframe that is interpreted as a [bezier curve|http://en.wikipedia.org/wiki/Bezier_curve], described by the four points; P0=<0,0>, P1=<x,y>, P2=<z,s> and P3=<1,1>.\r\n\r\nUsing the bezier curve the key framed animation is able to determine how quickly or slowly to apply the interpolation between position and/or rotation. Specifically, the percentage time elapsed for the keyframe is treated as X, and fed into the curve to gain access to Y, which will describe the extent of the translation at that point. Using bezier curves it is possible to create smoothed transitions that accelerate, decelerate or both, allowing us to create natural movement with only a handful of keyframes; currently it is only possible to create smooth looking animations by adding multiple keyframes to simulate an acceleration or deceleration phase, however a bezier curve would allow this to be done with infinite precision, and with far greater simplicity for the scripter, and far less complexity for the simulator (no need for complex workarounds).\r\n\r\nIf not specified the default behaviour would be {{BEZIER_LINEAR}}, with other useful constants defined below (minus {{KFM_}} prefix as they may be useful [elsewhere|https://jira.secondlife.com/browse/SCR-325]):\r\n||Constant||Value||\r\n|{{BEZIER_LINEAR}}|{{<0.0, 0.0, 1.0, 1.0>}}|\r\n|{{BEZIER_EASE}}|{{<0.25, 0.1, 0.25, 1.0}}|\r\n|{{BEZIER_EASE_IN}}|{{<0.42, 0.0, 1.0, 1.0>}}|\r\n|{{BEZIER_EASE_OUT}}|{{<0.0, 0.0, 0.58, 1.0>}}|\r\n|{{BEZIER_EASE_IN_OUT}}|{{<0.42, 0.0, 0.58, 1.0>}}|\r\n\r\n*Examples*:\r\n{code:title=Launcher}default {\r\n    state_entry() {\r\n        llSetKeyframedMotion(\r\n            [ // Keyframes\r\n                <0.0, 0.0, 10.0>,  BEZIER_EASE_OUT,    1.0,  // Launch\r\n                <0.0, 0.0, -10.0>, BEZIER_EASE_IN,     1.0,  // Fall\r\n                <0.0, 0.0, 0.5>,   BEZIER_EASE_IN_OUT, 0.25, // Unconvincing bounce up\r\n                <0.0, 0.0, -0.5>,  BEZIER_EASE_IN,     0.25, // Fall to start position\r\n            ],\r\n            [ // Options\r\n                KFM_DATA, KFM_TRANSLATION | KFM_BEZIER_INTERPOLATION\r\n            ]\r\n        );\r\n    }\r\n\r\n    touch_start(integer x) {\r\n        llSetKeyframedMotion([], [KFM_COMMAND, KFM_CMD_PLAY]);\r\n    }\r\n}{code}\r\n\r\n{code:title=Smooth Mover}default {\r\n    state_entry() {\r\n        llSetKeyframedMotion(\r\n            [ // Keyframes\r\n                <10.0, 0.0, 0.0>,  BEZIER_EASE_IN_OUT, 5.0,\r\n                <-10.0, 0.0, 0.0>, BEZIER_EASE_IN_OUT, 5.0\r\n            ],\r\n            [ // Options\r\n                KFM_DATA, KFM_TRANSLATION | KFM_BEZIER_INTERPOLATION,\r\n                KFM_MODE, KFM_LOOP,\r\n                KFM_COMMAND, KFM_CMD_PLAY\r\n            ]\r\n        );\r\n    }\r\n}{code}\r\n\r\nFor a good source to see what bezier-curves make possible, take a look at the [CSS3 animation-timing-function|http://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp].",
  'Severity': 'Unset',
  'Target Viewer Version': 'viewer-development',
  'Why is this feature important to you? How would it benefit the community?': 'This would be a very useful capability for key-framed motion, as it eliminates the need to add additional frames in order to perform smoothing, as the curves can be used to produce smoothing far more easily.',
}
@sl-service-account
Copy link
Author

Kyle Linden commented at 2014-11-12T19:30:29Z

Hello Haravikk,

Thank you for your suggestion. We've reviewed your request and determined that it is not something we can tackle at this time.
Please be assured that we truly appreciate the time you invested in creating this feature request, and have given it thoughtful consideration among our review team. This wiki outlines some of the reasoning we use to determine which requests we can, or can't, take on: http://wiki.secondlife.com/wiki/Feature_Requests
Thanks again for your interest in improving Second Life.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

1 participant