[x3d-public] VariationPhysicsModel for ParticleSystem using programmable shaders

John Carlson yottzumm at gmail.com
Tue Apr 23 22:02:00 PDT 2024


I guess what I’m trying to say is, I want something like x3d_Particle
shader variable, but use my own numbers, like inner radius, outer radius,
number of bumps in theta and phi, and possibly rotation in theta and phi
(for spherical coordinates).  I realize that this is my own application,
but I’m working towards a more general solution.

My equation that I am visualizing is:

r = a + b * cos(c * theta + theta_rotation) * cos (d * phi + phi_rotation)

I would like to have variation in a,b,c,d, etc.

John

That is, I want to apply a VariationPhysicsModel with values and
variations, so I don’t have to have scripting in my app.

I am working towards a solution in x_ite, but I don’t have the shader code
part done yet.  I will look for where x3d_Particle is used, and try to
create an x3d_ParticleValues variable.

I realize that my implementation might not be secure, so I won’t officially
release my version, unless I use non-array implementations.

Hmm!

Johm

On Tue, Apr 23, 2024 at 3:14 AM John Carlson <yottzumm at gmail.com> wrote:

> I'm realizing the number of floats could go off the end of the array in
> the shader.  Hmm!
>
>
>
> John
>
> On Tue, Apr 23, 2024 at 3:12 AM John Carlson <yottzumm at gmail.com> wrote:
>
>> Here are my ideas for VariationPhysicsModel implementation:
>>
>> Particle Physics Model XML:
>>
>> <VariationPhysicsModel values="2 2 5 5 0 0" varations="2 1 3 3 0.1 0.1"
>> lastFrame='0' updateRate='0.1'>
>> =====================
>> X3D Script version.  Does not do instance animation
>> =====
>>
>>                 <Script DEF='Animate'>
>>                   <field name="set_fraction" accessType="inputOnly"
>> type="SFFloat"></field>
>>                   <field name='values' type='MFFloat'
>> accessType='inputOutput' value='2 2 5 5 0 0'></field>
>>                   <field name='variations' type='MFFloat'
>> accessType='inputOutput' value='2 1 3 3 0.1 0.1'></field>
>>                   <field name='lastframe' type='SFFloat'
>> accessType='inputOutput' value='0'></field>
>>                   <field name='updaterate' type='SFFloat'
>> accessType='inputOutput' value='0.1'></field>
>>                                    <![CDATA[
>> ecmascript:
>>
>>                                            function set_fraction(f, tm) {
>>                             if (lastframe + updaterate < tm) {
>>
>>                                                   lastframe = tm;
>>                                 for (let v in values) {
>>                                         values[v] = values[v] +
>> (Math.random() - 0.5) * 2 * variations[v] * 0.1;
>>                                 }
>>                             }
>>                         }
>> ]]>
>> </Script>
>> ======
>> Shader implementation:
>> ======
>> uniform float [6] values; // change to x3d_ParticleValues
>>
>> vec3 rose(vec3 p, float[6] values) {
>>      float a = values[0];
>>      float b = values[1];
>>      float c = values[2];
>>      float d = values[3];
>>      float tdelta = values[4];
>>      float pdelta = values[5];
>> [snip]
>> =======
>> ComposedShader  I realize I could pass all floats in one field, but the
>> first 3 SFFloats don't change.
>> =======
>>    <ComposedShader DEF="x_ite" language='GLSL'>
>>                   <field name='chromaticDispertion'
>> accessType='initializeOnly' type='SFVec3f' value='0.98 1 1.033'></field>
>>                   <field name='cube' type='SFNode'
>> accessType="initializeOnly">
>>                         <ComposedCubeMapTexture
>> USE="texture"></ComposedCubeMapTexture>
>>                   </field>
>>                   <field name='bias' accessType='initializeOnly'
>> type='SFFloat' value='0.5'></field>
>>                   <field name='scale' accessType='initializeOnly'
>> type='SFFloat' value='0.5'></field>
>>                   <field name='power' accessType='initializeOnly'
>> type='SFFloat' value='2'></field>
>>                   <field name='values' type='MFFloat'
>> accessType='inputOutput' value='2 1 4 4 0 0'></field>
>>                   <ShaderPart url='"../shaders/x_ite_variations.vs" "
>> https://coderextreme.net/X3DJSONLD/src/main/shaders/x_ite_variations.vs"'
>> type="VERTEX" containerField='parts'></ShaderPart>
>>                   <ShaderPart url='"../shaders/commonnew.fs" "
>> https://coderextreme.net/X3DJSONLD/src/main/shaders/commonnew.fs"'
>> containerField='parts' type='FRAGMENT'></ShaderPart>
>>                 </ComposedShader>
>> ===============================
>> Normally I would use separate variables, but I want this to be widely
>> applicable.  There should probably be a max array size for performance
>> reasons.
>> ==================================
>> You can see most of my current changes on my
>> https://github/coderextreme/x_ite repo.
>>
>> Here's my current demo:
>>
>> https://coderextreme.net/X3DJSONLD/src/main/html/particles.html
>>
>> On Mon, Apr 22, 2024 at 8:21 PM John Carlson <yottzumm at gmail.com> wrote:
>>
>>> My thought is to add a new input variable in to shader,
>>>
>>> in float[] myVariable;
>>>
>>> Then provide
>>>
>>> <field name=“myVariable” type=“MFFloat” accessType=“inputOnly”
>>> value=“…”/>
>>>
>>> In the ComposedShader.
>>>
>>> But I don’t know currently how to tie a particle physics model to a
>>> composed shader, nor how to address instances of geometry.  The work I’ve
>>> done so far addresses all instances, and uses scripts, not wind.
>>>
>>> So I need to look into source code a bit.
>>>
>>> It would seem that naming individual floats might provide better
>>> documentation.  I guess an MFFloat is less wordy, and a single float
>>> MFFloat can serve as an SFFloat.
>>>
>>> John
>>>
>>> On Mon, Apr 22, 2024 at 7:53 PM John Carlson <yottzumm at gmail.com> wrote:
>>>
>>>> Also, one could provide Variational Physics Models that apply to all
>>>> particles or one particle.
>>>>
>>>> WindPhysicsModel already does this, but the 6 variational physics
>>>> models I’m imagining affects each particle.
>>>>
>>>> I’ll probably start coding this up tonight, if no one else volunteers.
>>>>
>>>> I don’t know if I need a Script per particle or not.  I’m thinking I
>>>> need to provide toNode and toField (ROUTEs), but on a particle level, so
>>>> perhaps I need a specialized ROUTE.
>>>>
>>>> How might we combine this with InstancedShape?  Can we add
>>>> ParticleSystems’ PhysicsModels to InstancedShape?
>>>>
>>>> I’m looking for more collaboration on reducing the number of Scripts I
>>>> use.
>>>>
>>>> I’m now seeing that float arrays are a thing in custom shaders, so
>>>> perhaps for my 6 shader parameters, a single variational physics model is
>>>> all that is required, with 2 MFFloats, one for values, and one for
>>>> variation of values.
>>>>
>>>> Thanks!
>>>>
>>>> John
>>>>
>>>> On Mon, Apr 22, 2024 at 7:24 PM John Carlson <yottzumm at gmail.com>
>>>> wrote:
>>>>
>>>>> Holger, I would like to provide 2 sets of (SFVec3f of values as well
>>>>> as an SFVec3f of variation corresponding to the values).  My thought is to
>>>>> use PhysicsModels in the ParticleSystems.  These are not emitters, but
>>>>> something more like a WindPhysicsModel, they parametrically alter the shape
>>>>> of geometry over time in a ComposedShader.  There are actually 6 individual
>>>>> SFFloats of values, so technically, I might use 6 WindPhysicsModels,
>>>>> sending speed into the programmable shader, and providing gustiness for
>>>>> variation.  But this is not wind, and AFAIK, X_ITE and Sunrize does wind
>>>>> with the WindPhysicsModel.  Is there another PhysicsModel available, or
>>>>> should I write my own?
>>>>>
>>>>> Would it be better to use 2 MFFloats, and how do I send an MFFloat to
>>>>> the ComposedShader?
>>>>>
>>>>> Thanks!
>>>>>
>>>>> John
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20240424/55d57ece/attachment.html>


More information about the x3d-public mailing list