[Résolu] Inverser Normal sur Asset avec Blendshape

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

[Résolu] Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 22 Mars 2018 12:12

Bonjour à tous !

Tout d'abord je tenais à vous remercier (surtout Titan) pour votre aide de la dernière fois !

Donc mon problème est lié à l'inversion de normal. J'utilise ce script ( Merci Titan ^^ )

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
public class ReverseNormals : MonoBehaviour {

	void OnEnable () {
		FlipTriangles();		
	}

	void OnDisable () {
		FlipTriangles();
	}
	
	void FlipTriangles() {
		Mesh mesh  = GetComponent<MeshFilter>()?. mesh;
		if (mesh == null) return;

		Vector3[] normals = mesh.normals;
		for (int i=0;i<normals.Length;i++)
			normals[i] = -normals[i];
		mesh.normals = normals;

		for (int m=0;m<mesh.subMeshCount;m++)
		{
			int[] triangles = mesh.GetTriangles(m);
			for (int i=0;i<triangles.Length;i+=3)
			{
				int temp = triangles[i + 0];
				triangles[i + 0] = triangles[i + 1];
				triangles[i + 1] = temp;
			}
			mesh.SetTriangles(triangles, m);
		}
	}
}
Donc tout fonctionnait bien jusqu'à ce que je décide d'animer mon objet via des blendshape. Je me suis servi de ce tuto la :
https://www.youtube.com/watch?v=1QZlqwdLx5Q

C'était plus simple pour mo d'animer directement dans maya et de l'importer dans Unity (moins flexible mais pour ce projet ce n'est pas grave).

Mais dès que j'importe mon objet avec un blendshape impossible d'inverser les normal.

Quelqu'un aurait une idée ? Je ne vois pas pourquoi cela poserait un problème en fait.

Merci beaucoup et bonne journée !

Leuprochon
Dernière édition par Leuprochon le 23 Mars 2018 14:58, édité 1 fois.

Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

Re: Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 22 Mars 2018 16:05

Petite avancée mais qui ne résout pas le soucis !!

En fait mon objet a 2 blendshape. Si je n'applique pas le flip également au blendshape alors ça ne marche pas. Le seul problème c'est : Comment appliquer le flip au blendshape sachant que je n'y ai pas accès dans Unity ? ( je dois pouvoir l'activer ou le désactiver, donc il ne suffit pas de le faire dans maya ).

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5464
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Inverser Normal sur Asset avec Blendshape

Message par boubouk50 » 22 Mars 2018 16:26

Ne t'est-il pas possible d'inverser les normales une fois tout effectué?
Genre lancer ce script en dernier? (script execution order ou LateUpdate ())
Sinon, ne peux-tu pas le faire en shader?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

Re: Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 22 Mars 2018 16:37

Malheureusement ça ne marche pas.

J'ai également essayé avec ce shader mais rien n'y fait :

Code : Tout sélectionner

 
Shader "Flipping Normals" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {

        Tags { "RenderType" = "Opaque" }

        Cull Off

        CGPROGRAM

        #pragma surface surf Lambert vertex:vert
        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
            float4 color : COLOR;
        };

        void vert(inout appdata_full v) {
            v.normal.xyz = v.normal * -1;
        }

        void surf (Input IN, inout SurfaceOutput o) {
             fixed3 result = tex2D(_MainTex, IN.uv_MainTex);
             o.Albedo = result.rgb;
             o.Alpha = 1;
        }

        ENDCG

    }

      Fallback "Diffuse"
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5464
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Inverser Normal sur Asset avec Blendshape

Message par boubouk50 » 22 Mars 2018 17:01

Et tu ne peux pas inverser les normales depuis la source plutôt qu'après coup?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

Re: Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 22 Mars 2018 17:58

En fait voici une petite explication :

J'ai modélisé (enfin récupéré et fait la retopo) d'un coeur et modélisé l'intérieur.
Je suis entrain de faire un prototype pour de la RA et j'aimerais que lorsqu'on clique sur un bouton type Toggle ça inverse les normales pour voir l'intérieur du cœur.

Tout ça marchait très bien avant de faire une animation avec les blenshape. Depuis je n'arrive plus à inverser les normales.

J'ai la méthode bourrine qui consiste à avoir deux fois le coeur (avec et sans les normales inversées) et d'afficher l'un ou l'autre en fonction de ce que je souhaite. Ça me suffirait mais ce n'est pas propre et je n'aime pas ça !

Mais impossible de trouver un article qui en parle sur le net.

Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

Re: Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 23 Mars 2018 11:44

Bon, j'ai trouvé un shader qui marche ! C'est celui ci :

https://answers.unity.com/questions/115 ... unlit.html

Par contre j'avais bossé mes shader à partir d'un shader Standard (Specular Color) et la j'ai plus rien, du coup c'est moins beau !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5464
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Inverser Normal sur Asset avec Blendshape

Message par boubouk50 » 23 Mars 2018 11:48

Tu peux combiner les shaders.
Prendre la partie d'inversion des normales et l'insérer dans un shader qui fait le reste.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Leuprochon
Messages : 56
Inscription : 04 Déc 2017 19:12

Re: Inverser Normal sur Asset avec Blendshape

Message par Leuprochon » 23 Mars 2018 12:14

Oui c'est ce que j'ai fait, j'ai obtenu ça du coup :

Mais le problème c'est que quand j'utilise ce shader pour inverser les normal il met comme un "voile noir" (cf image jointe à Gauche shader flip et à droite mon shader de base)

Si quelqu'un a une idée je suis preneur !

Image

Code : Tout sélectionner

Shader "Custom/StandardSpecularSurfaceShader" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _SpecularColor("Specular", Color) = (0.2,0.2,0.2)
        _BumpMap ("Bumpmap", 2D) = "bump" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        Cull front
   
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf StandardSpecular fullforwardshadows
 
        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0
 
        sampler2D _MainTex;
        sampler2D _BumpMap;
 
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };
 
        half _Glossiness;
        fixed3 _SpecularColor;
        fixed4 _Color;

 
        void surf (Input IN, inout SurfaceOutputStandardSpecular o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
            // Specular from specular color
            o.Specular = _SpecularColor;
            // Smoothness come from slider variable
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
            o.Emission = half3(0,0,0);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5464
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Inverser Normal sur Asset avec Blendshape

Message par boubouk50 » 23 Mars 2018 13:05

Ce ne serait pas tout simplement l'ombre du cœur sur lui-même qui génère ce souci?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »