<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div dir="ltr">
<div></div>
<div>
<div>Agreed that simplification can work. Thanks Joe. </div>
<div dir="ltr"><br>
</div>
<div>As a style consideration, it may be easier during authoring efforts to confirm correctness</div>
<div>of the combined complementary animation of multiple backgrounds by putting each of the BooleanSequencer nodes side-by-side and then comparing them. (The human visual system is very good at detecting differences when comparing things side-by-side.) That
way you know you have good consistent coverage throughout and no mixups. Receiving an extra false event every now and then is not a problem, specification is usually pretty clear about animation nodes receiving a true event as trigger for an action to occur. </div>
<div dir="ltr"><br>
</div>
<div dir="ltr">Manually drawing out your storyboard to choreograph all the players is always a good practice when authoring a sophisticated story. Wondering if anyone here has part of the Screenwriters Guild yet? (maybe out on the street for strike line right
now…) 🤓 🪧</div>
<div id="ms-outlook-mobile-signature">
<div><br>
</div>
<div dir="ltr">I’m guessing that Titania on Linux might have a feature like this already. Seems like a common future task.</div>
<div dir="ltr"><br>
</div>
<div dir="ltr">Have fun with X3D animation! 😀👍</div>
<div dir="ltr"><br>
</div>
<div>v/r Don</div>
</div>
</div>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> x3d-public <x3d-public-bounces@web3d.org> on behalf of Joseph D Williams <joedwil@earthlink.net><br>
<b>Sent:</b> Monday, July 17, 2023 11:28:11 PM<br>
<b>To:</b> Andreas Plesch <andreasplesch@gmail.com><br>
<b>Cc:</b> X3D Graphics public mailing list <x3d-public@web3d.org><br>
<b>Subject:</b> Re: [x3d-public] STEP interpolation, was Blender > Exporting rig transforms to HAnim?</font>
<div> </div>
</div>
<style>
<!--
@font-face
{font-family:Wingdings}
@font-face
{font-family:"Cambria Math"}
@font-face
{font-family:Calibri}
p.x_MsoNormal, li.x_MsoNormal, div.x_MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif}
a:link, span.x_MsoHyperlink
{color:blue;
text-decoration:underline}
p.x_MsoListParagraph, li.x_MsoListParagraph, div.x_MsoListParagraph
{margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
font-size:11.0pt;
font-family:"Calibri",sans-serif}
.x_MsoChpDefault
{}
@page WordSection1
{margin:1.0in 1.0in 1.0in 1.0in}
div.x_WordSection1
{}
ol
{margin-bottom:0in}
ul
{margin-bottom:0in}
-->
</style>
<div lang="EN-US" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="x_WordSection1">
<p class="x_MsoNormal">Two ways to code this:</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> <BooleanSequencer DEF='Background3Sequencer' </p>
<p class="x_MsoNormal">key='0 0.09 0.11 0.22 0.43 0.55 0.63 0.73 0.85 0.86 1' </p>
<p class="x_MsoNormal">keyValue='true true true false false false false false false false true'/></p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> <BooleanSequencer DEF='Background1Sequencer' </p>
<p class="x_MsoNormal">key='0 0.22 1' </p>
<p class="x_MsoNormal">keyValue='true false true'/></p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Both would produce the same number of value_changed events.
</p>
<p class="x_MsoNormal"> </p>
<ul type="disc" style="margin-top:0in">
<li class="x_MsoListParagraph" style="margin-left:0in">There is only an event out with a new timestamp if the</li><li class="x_MsoListParagraph" style="margin-left:0in">new value has changed compared to the last value.</li></ul>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">I don’t think I need a new out event at each keytime. Only if the value_changed is actually changed. I might code the first version thinking that I would get an event at each keytime, regardless. I try to think of some situation where
I definitely want an event at each keytime, regardless if out has changed or not. If I need that, I shouldn’t need to depend on this or any interpolator node
</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Thanks and Best, </p>
<p class="x_MsoNormal">Joe</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> </p>
<div style="border:none; border-top:solid #E1E1E1 1.0pt; padding:3.0pt 0in 0in 0in">
<p class="x_MsoNormal" style="border:none; padding:0in"><b>From: </b><a href="mailto:andreasplesch@gmail.com">Andreas Plesch</a><br>
<b>Sent: </b>Monday, July 17, 2023 7:32 PM<br>
<b>To: </b><a href="mailto:joedwil@earthlink.net">Joseph D Williams</a><br>
<b>Cc: </b><a href="mailto:michalis.kambi@gmail.com">Michalis Kamburelis</a>; <a href="mailto:x3d-public@web3d.org">
X3D Graphics public mailing list</a><br>
<b>Subject: </b>Re: STEP interpolation, was Blender > Exporting rig transforms to HAnim?</p>
</div>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">The way STEP works currently is the same as regular LINEAR</p>
<p class="x_MsoNormal">interpolation. There is only an event out with a new timestamp if the</p>
<p class="x_MsoNormal">new value has changed compared to the last value. So with STEP there</p>
<p class="x_MsoNormal">are only a few events per cycle. Would that work for you?</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">In the case of two subsequent, identical keyValues, there is no event</p>
<p class="x_MsoNormal">when the second interval is entered. So an alternative may be to emit</p>
<p class="x_MsoNormal">an event in this case even if the value did not change. It may be</p>
<p class="x_MsoNormal">helpful in some cases and should not affect too much existing</p>
<p class="x_MsoNormal">behaviours.</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">Andreas</p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">On Mon, Jul 17, 2023 at 9:59 PM Joseph D Williams <joedwil@earthlink.net> wrote:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> I like this and interesting how this works relative to another type of step node, the BooleanSequencer. For any initial state, I expect that the keyvalue will be set at the keytime, remain in that readable state until the next keytime,
when the next keyvalue will out.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> As expected, the keyvalue has the same time stamp as the keytime event in.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.3.xsd'></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <head></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <meta content='background4.x3d' name='title'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </head></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Scene></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <WorldInfo title='background5.x3d'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Viewpoint DEF='EntryView1' description='Hello character' position='0 2 10'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Background DEF='Background1' skyColor='0 0 0'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Background DEF='Background2'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> groundAngle='1.57' groundColor='0.3 0.6 0 0.7 1 0.5'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> skyColor='0 0.71 0.88'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Background DEF='Background3'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> groundAngle='1.57' groundColor='0.9 0.39 0.6 0.2 1 0.5'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> skyColor='0.82 0.82 0.82'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <Background DEF='Background4' skyColor='0.6 0.6 0.6'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <!-- Animation controls --></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <TimeSensor DEF='Clock10Seconds' cycleInterval='10' loop='true'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <BooleanSequencer DEF='Background1Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key='0 0.11 1'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> keyValue='true false true'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <BooleanSequencer DEF='Background2Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key='0 0.11 0.55 1'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> keyValue='false true false false'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <BooleanSequencer DEF='Background3Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key='0 0.55 0.85 1'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> keyValue='false true false false'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <BooleanSequencer DEF='Background4Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key='0 0.85 1'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> keyValue='false true false'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='value_changed' fromNode='Background1Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_bind' toNode='Background1'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='value_changed' fromNode='Background2Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_bind' toNode='Background2'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='value_changed' fromNode='Background3Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_bind' toNode='Background3'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='value_changed' fromNode='Background4Sequencer'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_bind' toNode='Background4'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='fraction_changed' fromNode='Clock10Seconds'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_fraction' toNode='Background1Sequencer'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='fraction_changed' fromNode='Clock10Seconds'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_fraction' toNode='Background2Sequencer'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='fraction_changed' fromNode='Clock10Seconds'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_fraction' toNode='Background3Sequencer'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <ROUTE fromField='fraction_changed' fromNode='Clock10Seconds'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> toField='set_fraction' toNode='Background4Sequencer'/></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </Scene></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </X3D></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Thanks and Preserve the Cascade.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Joe</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> From: Andreas Plesch</p>
<p class="x_MsoNormal">> Sent: Monday, July 17, 2023 8:59 AM</p>
<p class="x_MsoNormal">> To: Michalis Kamburelis</p>
<p class="x_MsoNormal">> Cc: X3D Graphics public mailing list; Joseph D Williams</p>
<p class="x_MsoNormal">> Subject: Re: STEP interpolation, was Blender > Exporting rig transforms to HAnim?</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Hi Michalis,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> On Mon, Jul 17, 2023 at 9:23 AM Michalis Kamburelis</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> <michalis.kambi@gmail.com> wrote:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > For STEP, I am using the lower value of the interval:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ...</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > This corresponds to typical x3d interval use, and you may have done the same ?.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > Yes, that is indeed what Castle Game Engine / view3dscene is doing too.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > If input is between key[n] and key[n+1], then the output of STEP is keyValue[n].</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Super. There are also the edge cases:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key[exactly at n] => keyValue[n]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key[< nMin] => keyValue[nMin]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> key[> nMax] => keyValue[nMax]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Just to confirm.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > I started converting your testcase (</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > https://github.com/andreasplesch/x3dom/blob/step_interpolator/test/regression-suite/test/cases/interpolators/interpolators.html</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ) into standalone X3D file. I noticed a few things special to X3DOM I</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > think (aside from lowercase node / field names, which I understand is</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > just necessary for HTML5 integration):</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > - "alphaMode" and "alphaCutoff" specified at "PhysicalMaterial", while</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > in X3D 4 they are on "Appearance"</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Yes, for historical reasons, because they only apply to PhysicalMaterial.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Appearance has alphaClipThreshold for regular Material in x3dom. There</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> was some reason why it was not not reused for PhysicalMaterial perhaps</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> due to shader uniforms or subtle usage differences.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > - "PhysicalMaterial.unlit" boolean, while in X3D 4 we have separate</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > node "UnlitMaterial" instead</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > - baseColorFactor -> it is baseColor in X3D 4</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > - metallicfactor, roughnessfactor -> just metallic, roughness in X3D 4</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Will be easy to rename.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > - diffusefactor, specularfactor, glossinessfactor on PhysicalMaterial</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > -> in X3D 4 we follow te glTF standard "metallic-roughness" workflow,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > so there's no no specular / glossinness.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> There used to be specular/glossiness for glTF1. We would probably just</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> keep it as there is also an extension.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > In the end, it was a bit easier to take glTF from</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/InterpolationTest/glTF</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > and open it in view3dscene, or convert to X3D from view3dscene. But I</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > know this is not objective test, sure it was easier this way for me to</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > just open in CGE/view3dscene :)</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Of course.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> x3dom has a different DEF naming convention prefixing with 'glTF_' and</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> using the node.name when available but I do not think it is necessary</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> to align.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> I noticed the $ character in the DEF names but see</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> 'Most restrictive and most interoperable guidance regarding choice of</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> characters in names: can start with letter or underscore character,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> but not a number or a colon. Can then include letters, numbers,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> hyphen, underscore, or period characters. This interoperability is</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> important so that files can be converted equivalently between</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> encodings without validation problems.'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Shapes do not get named</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > Quickly scanning view3dscene output, the one CGE/view3dscene-specific</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > thing there is "ImageTexture.flipVertically" (we plan to add</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > alternative to it, using texture transform for max conformance), the</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > rest looks standard X3D 4.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> x3dom has boolean flipY which I believe corresponds to an OpenGl flag.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> I also noticed the boolean OrientationInterpolator.keyValueQuaternions</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> . x3dom converts all rotations from axis-angle to Quaternions during</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> parsing, so this would save a little bit time there but not during the</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> animation. I would assume Euler angles would be a more common format</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> to accept from modeling software but that might be one step too far.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Thank you for the nice list which will make it more manageable to work through.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> I found another animation example here:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> https://github.com/mrdoob/three.js/pull/12907</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> and uploaded it here:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> https://github.com/andreasplesch/Library/blob/gh-pages/Examples/gltf2/interpolation/InterpolationComparison.gltf</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Regards, Andreas</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > Regards,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > Michalis</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > pon., 17 lip 2023 o 07:16 Andreas Plesch <andreasplesch@gmail.com> napisał(a):</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > Hi Michalis,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > I am putting finishing touches on STEP and CUBICSPLINE interpolation modes.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > For STEP, I am using the lower value of the interval:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > key='0 1 2'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > keyValue='10 11 12'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > value at key= 0.6 : 10</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > value at key= -0.1 : 10</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > value at key= 2 : 12</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > value at key= 2.1 : 12</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > This corresponds to typical x3d interval use, and you may have done the same ?.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > I also added CUBICSPLINE to all interpolators except for</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ColorInterpolator (could be added but seems strange). Doing that I</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > found that for CoordinateInterpolator and NormalInterpolator the</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > layout of keyValues with in and out tangents was most natural this</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > way:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > keyValue='FrameData1, FrameData2..FrameDataN'</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > where FrameData is the data for a key frame and looks like:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > [inTangent1, inTangent2 .. inTangentM],</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > [value1, value2 .. valueM],</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > [outTangent1, outTangent2 .. outTangentM]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > where all entries are Vec3f.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > The total number of scalar values in keyValue is thus N * 3 * M * 3.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > I could not test CUBICSPLINE for Coordinate or NormalInterpolator yet</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > since I do not have a test example. Does any scene come to mind ?</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > Perhaps I can augment the Dolphin example with some arbitrary tangents</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > for testing.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > I also converted the glTF Interpolation Test example to X3D:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > https://github.com/andreasplesch/x3dom/blob/step_interpolator/test/regression-suite/test/cases/interpolators/interpolators.html</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > It may be useful for testing Position and OrientationInterpolator without glTF.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > Andreas</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > On Tue, Jun 27, 2023 at 10:34 AM Andreas Plesch <andreasplesch@gmail.com> wrote:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Hi Michalis,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Ok, let me work on adding a STEP interpolation mode to interpolators.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Do you want to raise a spec. improvement suggestion ?</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > As a side note, STEP mode is also related to x3d sequencers. A</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ScalarInterpolator in STEP mode would be equivalent to a hypothetical</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ScalarSequencer, except for the next and previous fields. Hm, perhaps</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > it makes sense to add next and previous fields to interpolators which</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > would step through intervals.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > The CUBICSPLINE algorithm for glTF is fairly well documented as far as</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > I remember. Feel free of course to look up the implementation in</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > x3dom.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > It is worth noting that the existing SplineInterpolator nodes only</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > allow for one (central) tangent per key and key value, whereas the</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > common cubic spline algorithm allows for two tangents (in, and out)</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > per key and key value. Those mathematically inclined may be able to</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > show that the x3d algorithm for spline interpolations is equivalent to</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > the cubic spline algorithm with identical in and out tangents.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > x3dom just mirrors glTF in that inTangent, value, outTangent occur in</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > triplets in the MF keyValue field. An alternative interface would</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > introduce keyInTangent and keyOutTangent fields which then would</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > require sensible default values. Not sure.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Some thoughts, Andreas</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > PS:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > A StringSequencer would be useful as a mechanism to store and select</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > alternative string values for display in Text nodes. I think the</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > current strategy is to use an IntegerSequencer to select from Shapes</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > in a Switch. A MFStringSequencer would be more concise and convenient.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Hm, similarly there could be a StringTrigger event utility.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > On Tue, Jun 27, 2023 at 8:18 AM Michalis Kamburelis</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > <michalis.kambi@gmail.com> wrote:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Indeed glTF has additional interpolation options, and I think it would</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > make sense to add them to X3D.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Looks like X3DOM and view3dscene/Castle Game Engine go in this</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > direction already :)</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > 1. X3DOM has SFString "interpolation" field, default "LINEAR", see</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > https://doc.x3dom.org/author/Interpolation/X3DInterpolatorNode.html .</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Andreas above explained how it supports "CUBICSPLINE" option.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > 2. view3dscene / Castle Game Engine allow to use "STEP" interpolation</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > explicitly.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > For this, we add such field:</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > SFString [in,out] interpolation "LINEAR" # range: ["LINEAR"|"STEP"]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > .. to all X3DInterpolatorNode descendants (so, all interpolator</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > nodes). This seems exactly like X3DOM, we just added "STEP", where</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > X3DOM added "CUBICSPLINE". In the end we should probably have all</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ["LINEAR"|"STEP"|"CUBICSPLINE"].</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > 3. Note that even without this field, with default linear</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > interpolation, it was possible to have effectively step interpolation,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > as Andreas mentions. You can just duplicate keys in the middle, like</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > key [0 0.33 0.33 0.66 0.66]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > keyValue [10 10 20 20 30 30]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > # interpolation "LINEAR"</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > This is valid with X3D ("""keys shall be monotonically</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > non-decreasing""" according to spec).</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > It is equivalent to</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > key [0 0.33 0.66]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > keyValue [10 20 30]</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > interpolation "STEP"</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Using explicit "STEP" is slightly better, as you need 50% less</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > memory to store it, less computation (no need to do lerp or detect</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > this special case to optimize), and seems just simpler for authors --</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > it specifies intention explicitly, which makes sense, also if one</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > hopes a round-trip e.g. import to Blender and export to Blender.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Having such additional interpolation options seems common, glTF</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > and Blender too have them (</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > https://docs.blender.org/manual/en/latest/editors/graph_editor/fcurves/properties.html#editors-graph-fcurves-settings-interpolation</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ).</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > 4. Note that view3dscene / Castle Game Engine do not support</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > "CUBICSPLINE" interpolation yet, but we plan to.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > For now we support curve interpolation by adding extra</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > intermediate keys to the linear interpolation -- so, we have</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > needlessly more keys / key values. But this is only a temporary</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > solution, we want to support "CUBICSPLINE" properly, like X3DOM.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Regards,</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > Michalis</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > niedz., 25 cze 2023 o 05:33 Andreas Plesch <andreasplesch@gmail.com> napisał(a):</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > Date: Sat, 24 Jun 2023 10:11:03 -0700</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > From: Joseph D Williams <joedwil@earthlink.net></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > To: Michalis Kamburelis <michalis.kambi@gmail.com></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > Cc: GPU Group <gpugroup@gmail.com>, X3D Graphics public mailing list</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > <x3d-public@web3d.org></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > Subject: Re: [x3d-public] Blender > Exporting rig transforms to HAnim?</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > > Which shows that yes, you have a list of the key times that just have to be ascending. Default is linear interpolation between keyvalues. Now new to me, I like the STEP option where value not interpolated but stays the
same until next keyvalue change. For that effect, gltf makes it easier. I want that STEP option in x3d! And then there is also the cubic spline with specified tangents. Me want that one too.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > In order to support glTF x3dom added a CUBICSPLINE with tangents</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > option to interpolators, in the same form as glTF, eg. three values</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > (in tangent, value, out tangent) per key. Parallel to glTF x3dom</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > interpolators have a "interpolation" SFString field which can have</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > "LINEAR" and "CUBICSPLINE" values. I suspect due to glTF support other</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > viewers also already do something like that and could expose such a</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > mode to regular X3D.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > A STEP option is already elegantly solved by X3D with duplicate keys</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > with different values in series. That allows mixing step wise and</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > linear interpolation in one animation. x3dom just translates glTF STEP</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > to that format which is very straightforward. A dedicated STEP option</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > would be 50% more efficient in storage but I am not sure if this is</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > enough of a benefit to justify duplication of existing functionality.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > It may not or it may as x3dom already does it internally for glTF. It</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > would be possible to add to x3d as well but perhaps not necessary.</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > Andreas</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > _______________________________________________</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > x3d-public mailing list</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > x3d-public@web3d.org</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > > > http://web3d.org/mailman/listinfo/x3d-public_web3d.org</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > --</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Andreas Plesch</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > > Waltham, MA 02453</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > ></p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > --</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > Andreas Plesch</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> > > Waltham, MA 02453</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> --</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Andreas Plesch</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> Waltham, MA 02453</p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal">> </p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal"> </p>
<p class="x_MsoNormal">--</p>
<p class="x_MsoNormal">Andreas Plesch</p>
<p class="x_MsoNormal">Waltham, MA 02453</p>
<p class="x_MsoNormal"> </p>
</div>
</div>
</body>
</html>