Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Flipping cloth? ScaleX == -1?
#11
Here, I wrote this for you. Add it to the cloth component, and set it to update after the solver in ScriptExecutionOrder. This way it is 100% sure it will be done after all simulation is completed.

Code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Obi;

[RequireComponent(typeof (ObiCloth))]
public class FlipNormals : MonoBehaviour {

    private ObiCloth actor;
    
    // Update is called once per frame
    void Awake ()
        {
        actor = GetComponent<ObiCloth>();
    }

    private void LateUpdate()
    {
        Vector3 solverScale = actor.Solver.transform.localScale;

        if (solverScale.x < 0 || solverScale.y < 0 || solverScale.z < 0)
        {
            Vector3[] normals = actor.clothMesh.normals;

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

            actor.clothMesh.normals = normals;
        }
    }
}

Works fine, collisions with colliders and all. Still, doing this in the vertex shader would be far more performant.

The solver is set up in local space mode, and all colliders, cloth, etc are parented under it. Note that none of the colliders has negative scale, only the solver does. I'm also attaching a video of the results:

Reply
#12
(23-08-2019, 10:05 AM)josemendez Wrote: As I already told you, set your solver update mode to FixedUpdate, then write your code after WaitForFixedUpdate:
https://docs.unity3d.com/ScriptReference...pdate.html

Your code should be executed after all physics steps in the frame, which is precisely what WaitForFixedUpdate accomplishes. See:
https://docs.unity3d.com/Manual/ExecutionOrder.html

You can also insert it in Update, or even LateUpdate.


As I said, colliders (capsule, box and sphere colliders in particular) do not support negative scale. Are you 100% positive you're flipping them after the simulation?

No I see the source of confusion: when I talk about flipping code I mean DE-flipping (putting the hierarchy into normal position, e.g. localScale.x == 1), when you talk about flipping, you mean actual flipping, e.g. setting localScale.x to -1. I now understand everything and will test this later today.

One thing bothers me though: I tried setting the model to localScale.x == 1 in my FixedUpdate, while ensuring that my FixedUpdate is called before yours (Script execution order) and then changing it to localScale.x == -1 both in my Update and in my LateUpdate (the cloth is set to simulate in FixedUpdate). What I ended up with was a character that was constantly flipping back and forth. Maybe that was my negligence - we will see.
Reply
#13
(23-08-2019, 12:10 PM)cubrman Wrote: No I see the source of confusion: when I talk about flipping code I mean DE-flipping (putting the hierarchy into normal position, e.g. localScale.x == 1), when you talk about flipping, you mean actual flipping, e.g. setting localScale.x to -1. I now understand everything and will test this later today.

One thing bothers me though: I tried setting the model to localScale.x == 1 in my FixedUpdate, while ensuring that my FixedUpdate is called before yours (Script execution order) and then changing it to localScale.x == -1 both in my Update and in my LateUpdate (the cloth is set to simulate in FixedUpdate). What I ended up with was a character that was constantly flipping back and forth. Maybe that was my negligence - we will see.

Lucky you, I'm more confused now  Indeciso. Hope you got all the bits and pieces you need to make it work!. Let me know otherwise.
Reply