Page 1 sur 1

[Resolu]Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 12:57
par EmileF
Bonjour, encore une petite question,

Je voudrais dans une carafe ou un vase transparent, de forme irrégulière, créer un niveau d'eau qui puisse suivre les contours du vase selon la hauteur du niveau. et aussi que les couleurs soient différentes au dessous et au dessus du niveau.

Je ne sais pas si j'ai été assez clair.

Merci de me guider un peu pour ce détail. Je ne sais pas si ça peut se faire avec une déformation de mesh ou avec les shaders.

Un conseil ou un tuto serait super, mes recherches ont été négative sur le web.

Merci

Re: Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 13:28
par Max
Bonjour,

Peut-être que ce genre de chose pourrait convenir:

https://www.youtube.com/watch?v=yDU_KKfvrFE

Re: Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 13:36
par EmileF
Super merci Max.

Ca a l'air de correspondre tout à fait à ce que j'ai cherché.

Je vais étudier ça avec beaucoup d’intérêt.

Merci beaucoup. avec Unity.fr on n'est jamais bloqué.

Re: Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 17:05
par EmileF
Une petite question subsidiaire.

Le shader marche bien en mode Edit.

En mode play, en cas de mouvement du vase, le liquide réagit comme je le souhaitais. Pas de problème la dessus.

Maintenant , j'essaye d'ajouter une fonction qui me permet de modifier la hauteur du liquide en mode play, et là ça coince. je n'arrive pas à trouver le principe pour modifier la propriété FillAmount du shader

Voila le shader que j'utilise et qui fonctionne très bien en mode edit:

Code : Tout sélectionner

Shader "Unlit/SpecialFX/Liquid"
{
	Properties
	{
		_Tint("Tint", Color) = (1,1,1,1)
		_MainTex("Texture", 2D) = "white" {}
		_FillAmount("Fill Amount", Range(-10,10)) = 0.0
		[HideInInspector] _WobbleX("WobbleX", Range(-1,1)) = 0.0
		[HideInInspector] _WobbleZ("WobbleZ", Range(-1,1)) = 0.0
		_TopColor("Top Color", Color) = (1,1,1,1)
		_FoamColor("Foam Line Color", Color) = (1,1,1,1)
		_Rim("Foam Line Width", Range(0,0.1)) = 0.0
		_RimColor("Rim Color", Color) = (1,1,1,1)
		_RimPower("Rim Power", Range(0,10)) = 0.0
	}

		SubShader
		{
			Tags {"Queue" = "Geometry"  "DisableBatching" = "True" }

					Pass
			{
			 Zwrite On
			 Cull Off // we want the front and back faces
			 AlphaToMask On // transparency

			 CGPROGRAM


			 #pragma vertex vert
			 #pragma fragment frag
			// make fog work
			#pragma multi_compile_fog

			#include "UnityCG.cginc"

			struct appdata
			{
			  float4 vertex : POSITION;
			  float2 uv : TEXCOORD0;
			  float3 normal : NORMAL;
			};

			struct v2f
			{
			   float2 uv : TEXCOORD0;
			   UNITY_FOG_COORDS(1)
			   float4 vertex : SV_POSITION;
			   float3 viewDir : COLOR;
			   float3 normal : COLOR2;
			   float fillEdge : TEXCOORD2;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _FillAmount, _WobbleX, _WobbleZ;
			float4 _TopColor, _RimColor, _FoamColor, _Tint;
			float _Rim, _RimPower;

			float4 RotateAroundYInDegrees(float4 vertex, float degrees)
			{
			   float alpha = degrees * UNITY_PI / 180;
			   float sina, cosa;
			   sincos(alpha, sina, cosa);
			   float2x2 m = float2x2(cosa, sina, -sina, cosa);
			   return float4(vertex.yz , mul(m, vertex.xz)).xzyw;
			}


			v2f vert(appdata v)
			{
			   v2f o;

			   o.vertex = UnityObjectToClipPos(v.vertex);
			   o.uv = TRANSFORM_TEX(v.uv, _MainTex);
			   UNITY_TRANSFER_FOG(o,o.vertex);
			   // get world position of the vertex
			   float3 worldPos = mul(unity_ObjectToWorld, v.vertex.xyz);
			   // rotate it around XY
			   float3 worldPosX = RotateAroundYInDegrees(float4(worldPos,0),360);
			   // rotate around XZ
			   float3 worldPosZ = float3 (worldPosX.y, worldPosX.z, worldPosX.x);
			   // combine rotations with worldPos, based on sine wave from script
			   float3 worldPosAdjusted = worldPos + (worldPosX  * _WobbleX) + (worldPosZ* _WobbleZ);
			   // how high up the liquid is
			   o.fillEdge = worldPosAdjusted.y + _FillAmount;

			   o.viewDir = normalize(ObjSpaceViewDir(v.vertex));
			   o.normal = v.normal;
			   return o;
			}

			fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
			{
				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv) * _Tint;
			// apply fog
			UNITY_APPLY_FOG(i.fogCoord, col);

			// rim light
			float dotProduct = 1 - pow(dot(i.normal, i.viewDir), _RimPower);
			float4 RimResult = smoothstep(0.5, 1.0, dotProduct);
			RimResult *= _RimColor;

			// foam edge
			float4 foam = (step(i.fillEdge, 0.5) - step(i.fillEdge, (0.5 - _Rim)));
			float4 foamColored = foam * (_FoamColor * 0.9);
			// rest of the liquid
			float4 result = step(i.fillEdge, 0.5) - foam;
			float4 resultColored = result * col;
			// both together, with the texture
			float4 finalResult = resultColored + foamColored;
			finalResult.rgb += RimResult;

			// color of backfaces/ top
			float4 topColor = _TopColor * (foam + result);
			//VFACE returns positive for front facing, negative for backfacing
			return facing > 0 ? finalResult : topColor;

		  }
		  ENDCG
		 }

		}
}
Voici le script que j'utilise pour essayer de modifier la hauteur du liquide

Code : Tout sélectionner

    public void HauteurLiquide(float h)
    {
        MaterialPropertyBlock block = new MaterialPropertyBlock();
        transform.GetComponent<Renderer>().GetPropertyBlock(block);
        block.SetFloat("_FillAmount", h);
        transform.GetComponent<Renderer>().SetPropertyBlock(block);
    }
Je pense que dans le shader, il faut faire une modification pour accepter cette valeur. Je n'arrive pas à comprendre vraiment le fonctionnement des shaders, aussi, il m'est très difficile d'adapter celui là à mes désirs.

Est-ce que quelqu'un peut m'aider svp?

Re: Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 17:30
par EmileF
En fait, ça fonctionne comme ça, c'était les valeurs utilisées qui n'étaient pas adaptées à mon cas.

Dans le shader, le FillAmount va de -10 à 10, en mode Edit j'avais du mal pour le mettre au niveau que je voulais
En mode play Impossible.
En fait dans mon cas le fil amount doit aller de 0.37 à 0.60. Je ne sait pas pourquoi, ce doit être une question de taille de l'objet, bien que mon scale est à 1.

Je ne comprends pas tout, mais ça marche.

merci.

Re: [Resolu]Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 17:42
par boubouk50
Ca à l'air d'être un offset world, donc il faut qu'il soit adapté à ton objet.
Aussi, je pense que la configuration initiale (sans fillAmount) devrait être une bouteille à moitié pleine (ou à moitié vide) pour avoir un range centré sur le 0. Ainsi, tu aurais un fillAmount compris entre -0.115 et -0.115.
Je ne sais pas comment il s'utilise mais tu dois avoir un objet de réglage initial pour définir où tu dois couper non? Ou bien est-ce automatique?

Re: [Resolu]Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 18:23
par EmileF
Boubouk a écrit :Je ne sais pas comment il s'utilise mais tu dois avoir un objet de réglage initial pour définir où tu dois couper non? Ou bien est-ce automatique?
Je ne comprends pas vraiment ta question. mais quand j'ai récupéré le shader, les valeurs de base pour le FillAmount étaient -10 à 10.

Je pense que si c'est des valeurs mondiales, si je change la position verticale de mon vase, ces valeurs devraient être changées.

Après maint tâtonnement j'ai fini pas trouvé que les valeurs qui me conviennent sont 0.37 pour le vase plein et 0.60 pour le vase vide.

Je vais donc me tenir entre ces valeurs pour mes besoins. Mais pourquoi, je ne sais pas.

En tout cas, merci Boubouk.

Re: [Resolu]Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 18:34
par boubouk50
EmileF a écrit :
16 Déc 2019 18:23
Je pense que si c'est des valeurs mondiales, si je change la position verticale de mon vase, ces valeurs devraient être changées.
Non, c'est un offset, une addition par rapport à la position des sommets. Donc où que ta carafe soit, tu auras toujours les mêmes valeurs.
Par opposition, elles auraient pu être dépendantes de la taille de l'objet pour avoir des valeurs en pourcentage donc entre 0 et 100% par exemple, et ne pas avoir à trouver la dimension réelle.

Re: [Resolu]Niveau d'eau variable dans une carafe

Publié : 16 Déc 2019 19:34
par EmileF
Ha d'accord,

Je pense que tu as raison au sujet de la taille. Mais du coup, comme j'ajoute un flotteur, ça me donne la position plus facilement

merci