From 313e100d028ff825c0257f7361d8eb0efdffb0a2 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Wed, 30 Mar 2022 15:23:50 +0200 Subject: [PATCH 1/5] Doc: Update materials.md --- .../Documentation~/creators-guide/editor/materials.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md index a0f1ba8d9..e8ea24073 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md @@ -17,7 +17,7 @@ We refer to rendered materials just as **materials**. They describe how a surfac A material typically includes one or more textures that define the color, normals, roughness, metalness and many more parameters on a per-pixel basis. > [!note] -> In Visual Pinball, materials don't include the texture. Instead, the texture is applied on a per-object basis. +> Contrary to VPE - in Visual Pinball, materials don't include the texture. Instead, the texture is applied on a per-object basis. ## Physics Materials @@ -31,7 +31,7 @@ We refer to how the material interacts with the ball during the physics simulati Physics materials are a way to group common behavior among certain objects, but contrarily to rendered materials, you can also *not* assign a physics material to an object and set each of those four parameters individually. > [!note] -> In Visual Pinball, the physical parameters are part of the rendered material, so there is only one notion of material. +> Contrary to VPE - in Visual Pinball, the physical parameters are part of the rendered material, so there is only one notion of material. ## Conversion from Visual Pinball @@ -42,4 +42,4 @@ As mentioned above, there are two differences between Visual Pinball and VPE how When importing a `.vpx` file, VPE converts the "visual part" of Visual Pinball materials into materials for the current render pipeline. It does that by creating a new material for every material/texture combination in Visual Pinball. The materials are then written to the `Materials` asset folder of the imported table where they can be easily edited and referenced. Since Visual Pinball uses different shaders than Unity, the results of the conversion are approximations and should be heavily tweaked. -Since VPE uses the same physics engine as Visual Pinball, the physical values of the materials don't need to be converted, they are copied 1:1 into a new physics material and saved in the asset folder. \ No newline at end of file +Since VPE uses the same physics engine as Visual Pinball, the physical values of the materials don't need to be converted, they are copied 1:1 into a new physics material and saved in the asset folder. From 55e096ce122d3e061cc559c22b3ba009476a42fb Mon Sep 17 00:00:00 2001 From: Cupiii Date: Wed, 30 Mar 2022 15:47:10 +0200 Subject: [PATCH 2/5] Doc: Update materials.md --- .../Documentation~/creators-guide/editor/materials.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md index e8ea24073..18664824e 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md @@ -30,6 +30,8 @@ We refer to how the material interacts with the ball during the physics simulati Physics materials are a way to group common behavior among certain objects, but contrarily to rendered materials, you can also *not* assign a physics material to an object and set each of those four parameters individually. +Physics materials also give access to additional features such as curves for elasticity and friction, not present in objects directly. + > [!note] > Contrary to VPE - in Visual Pinball, the physical parameters are part of the rendered material, so there is only one notion of material. From 03383e03b227509ad29a4d4407d5f02b57e49d17 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Wed, 30 Mar 2022 21:24:57 +0200 Subject: [PATCH 3/5] Doc: New Page in Doc: Physics --- .../creators-guide/manual/nfozzy-curve.png | Bin 0 -> 15489 bytes .../physics-material-asset-with-curves.png | Bin 0 -> 21633 bytes .../creators-guide/manual/physics.md | 90 ++++++++++++++++++ ...r-collider-with-physics-material-asset.png | Bin 0 -> 17228 bytes 4 files changed, 90 insertions(+) create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/nfozzy-curve.png create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/physics-material-asset-with-curves.png create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/rubber-collider-with-physics-material-asset.png diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/nfozzy-curve.png b/VisualPinball.Unity/Documentation~/creators-guide/manual/nfozzy-curve.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc9b19951bb9afcc832ca6d16ec4e7de1f8891e GIT binary patch literal 15489 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 Mq-Tbz(Q(H72QtXV>i_@% literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md new file mode 100644 index 000000000..f1b52a213 --- /dev/null +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md @@ -0,0 +1,90 @@ +--- +uid: physics +title: Physics in VPE +description: VPE's physics engine +--- +# Physics Engine + +When playing pinball, physics are very important. Playfield elements impact the ball. These elements can not only be changed in size and shape but also how the influence the balls movement, so it's important to be able to control them. + +Compared to Visual Pinball, VPE uses the same physics engine for almost all parts of the game, but there are differences. + +This document will try to describe the differences to the physics engine at first glance, but will try to describe important aspects of the physics engine when they are needed to understand concepts. + +## Introduction and general topics + +### Visual Pinball and VPE's physics engine + +Some (unsorted) facts about the physics engine: + +- running at 1000 Hz plus CCD-iterations +- CCD: uses Continuous Collision Detection for collisions +- Uses a quadtree in a broad phase +- is highly optimized for pinball (i.e. optimizied more for static than dynamic objects) +- translates the objects internally on the playfield into "Colliders" like circles, Lines, Planes, Points, Triangles +- VPE's physics mostly use Unity's DOTS (Data-Oriented Technology Stack) and should therefore be multithreaded (which Visual Pinball is not). +- is by no means a accuraty system to describe physics (no game physics engine is). Physics in Pinball are much more complicated as one might think. Imagine a spinning ball hitting a flexible rubber -> should the spin vanish, get reversed, get conservated, and if, how much? - It depends... + +### Different coordinate systems + +In VPE's (and Visual Pinball) physics engine, a different coordinate system is used as it is used in unity. + +For the following explanation, imagine looking at the playfield from above: +In physics engine, +- positive X is right +- positive Y is down (to the drain) +- positive Z is pointing to my eye + +In Unity also looking from above onto the playfield: +- positive X is right +- positive Y is pointing to my eye +- positive Z is pointing from the drain into the backglass + +## Settings of different components + +### Walls and Rubbers + +Playfield elemets may have collider components, such as a rubber collider: +[!Rubber Collider](rubber-collider-with-physics-material-asset.png) +In general, you can set +- Elasticity, +- Elasticity Falloff, +- Friction, +- Scatter Angle + +Targets, metal wire guides, primitives, ramps, rubbers also have the ability to set a Physics Materials Asset as a preset. + +You can create a new Physics Materials Asset in any Asset Folder in the project view by "right click, create, visual pinball, physics material". + +A physics material asset has more options compared to the collider components themselves. +[Physics Material Asset](physics-material-asset-with-curves.png) +While you can set the options from above, you also can set curves for elasticity over velocity and friction over velocity. +Many people think the the physics settings and scripts proposed by nFozzy come closest to real pinball. + +While nFozzy wrote Visual Basic Scripts which optimized the Visual Pinball physics. While it would be possible to implement exactly the same behaviour as nFozzy proposed in his scripts, VPE deviates from the original implementation slightly: + +nFozzy felt the elasticity and elasticity fall-off settings were somewhat limited in simulating the correct behaviors for these objects so he defined new curves for elasticity of objects for different ball speeds: +[nFozzy Rubber Dampening Curve](nfozzy-curve.png) +(original nFozzy curve for a rubber band) + +What nFozzy did, was adjusting the XY-velocity of a ball from before collision to a new velocity after collision. According to different speeds, different factors were used for reduction of the velocity. +In the example above: a ball with the speed of approximately 30 (Physics Units per Second) should come out of the collision with slightly less than 80% of it's original speed. + +VPE's implementation of this behaviour slightly differs: +- Not the XY-Speed is taken as basis for the calculation, but the perpendicular (normal) speed to the Wall/Target/Rubber. +- Not the XY-Speed is reduced, but only elasticity of the object is overwritten by the value (0.8), thus reducing the perpendicular (normal) bounce of the ball to 80%. +- The velocity of the ball along the target (tangent) is not reduced artificially by the curve, but it may be reduced by friction or scatter-angle. +The reason for this is, that we think that nFozzy just was not able to do so (because in VP-VBS the impact angle is simply not given to the script), and would have done the same. + +Nevertheless nFozzy (maybe without wanting to) also reduced friction based effects on the ball. +To take this into account, there is another parameter curve introduced in VPE: Friction over Velocity. It works the same, as the elasticity over velocity curve, but may dampen the friction according to velocity. + + +### Flipper correction (Part 1, Polarity / Velocity) +-> [Flippers](xref:VisualPinball.Unity.Flippers) + +### Flipper correction (Part 2, Flipper Tricks) +(coming soon to VPE (TM)) + + + diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/rubber-collider-with-physics-material-asset.png b/VisualPinball.Unity/Documentation~/creators-guide/manual/rubber-collider-with-physics-material-asset.png new file mode 100644 index 0000000000000000000000000000000000000000..53ada55424361dbede669b1aff41f04a3b7c0693 GIT binary patch literal 17228 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 Date: Wed, 30 Mar 2022 21:29:40 +0200 Subject: [PATCH 4/5] Doc: corrections to physics page --- .../Documentation~/creators-guide/manual/physics.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md index f1b52a213..3892d8f50 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md @@ -45,7 +45,7 @@ In Unity also looking from above onto the playfield: ### Walls and Rubbers Playfield elemets may have collider components, such as a rubber collider: -[!Rubber Collider](rubber-collider-with-physics-material-asset.png) +![Rubber Collider](rubber-collider-with-physics-material-asset.png) In general, you can set - Elasticity, - Elasticity Falloff, @@ -57,14 +57,14 @@ Targets, metal wire guides, primitives, ramps, rubbers also have the ability to You can create a new Physics Materials Asset in any Asset Folder in the project view by "right click, create, visual pinball, physics material". A physics material asset has more options compared to the collider components themselves. -[Physics Material Asset](physics-material-asset-with-curves.png) +![Physics Material Asset](physics-material-asset-with-curves.png) While you can set the options from above, you also can set curves for elasticity over velocity and friction over velocity. Many people think the the physics settings and scripts proposed by nFozzy come closest to real pinball. While nFozzy wrote Visual Basic Scripts which optimized the Visual Pinball physics. While it would be possible to implement exactly the same behaviour as nFozzy proposed in his scripts, VPE deviates from the original implementation slightly: nFozzy felt the elasticity and elasticity fall-off settings were somewhat limited in simulating the correct behaviors for these objects so he defined new curves for elasticity of objects for different ball speeds: -[nFozzy Rubber Dampening Curve](nfozzy-curve.png) +![nFozzy Rubber Dampening Curve](nfozzy-curve.png) (original nFozzy curve for a rubber band) What nFozzy did, was adjusting the XY-velocity of a ball from before collision to a new velocity after collision. According to different speeds, different factors were used for reduction of the velocity. From 989115dbd7041ed689a51f20a81a93e8f047b3c9 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Wed, 30 Mar 2022 21:30:19 +0200 Subject: [PATCH 5/5] Doc: more changes --- .../Documentation~/creators-guide/manual/physics.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md index 3892d8f50..fafe3f3d1 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/physics.md @@ -45,7 +45,9 @@ In Unity also looking from above onto the playfield: ### Walls and Rubbers Playfield elemets may have collider components, such as a rubber collider: + ![Rubber Collider](rubber-collider-with-physics-material-asset.png) + In general, you can set - Elasticity, - Elasticity Falloff, @@ -57,14 +59,18 @@ Targets, metal wire guides, primitives, ramps, rubbers also have the ability to You can create a new Physics Materials Asset in any Asset Folder in the project view by "right click, create, visual pinball, physics material". A physics material asset has more options compared to the collider components themselves. + ![Physics Material Asset](physics-material-asset-with-curves.png) + While you can set the options from above, you also can set curves for elasticity over velocity and friction over velocity. Many people think the the physics settings and scripts proposed by nFozzy come closest to real pinball. While nFozzy wrote Visual Basic Scripts which optimized the Visual Pinball physics. While it would be possible to implement exactly the same behaviour as nFozzy proposed in his scripts, VPE deviates from the original implementation slightly: nFozzy felt the elasticity and elasticity fall-off settings were somewhat limited in simulating the correct behaviors for these objects so he defined new curves for elasticity of objects for different ball speeds: + ![nFozzy Rubber Dampening Curve](nfozzy-curve.png) + (original nFozzy curve for a rubber band) What nFozzy did, was adjusting the XY-velocity of a ball from before collision to a new velocity after collision. According to different speeds, different factors were used for reduction of the velocity.