Why doesn't negative scale flip faces?

Unless you reverse the winding order of triangles, which would, as far as I understand it, require a new triangles array, applying negative scale to a mesh* should make the faces point in the opposite direction. That doesn't happen. Why?

  • I haven't tried to figure out all possible cases, but I believe this is at least true if the scale isn't made negative in at least two axes. What alerted me to this in particular was working with some quads in a GUI. I wanted some buttons to look like other buttons, only flipped in one axis. I tried using the same mesh, only with a negative scale in one axis, to see if I could do it without having to use two mesh instances with different UVs. It worked, but it doesn't batch. I sent a bug report, because either it should batch, or it should be documented, why it doesn't batch. I'd just like to know the answer to this question, to have a better overall understanding of things, but also because it might help me with the batching issue at hand. My solution will be simpler if I can use a mesh with negative scale, but I won't do it if it won't batch.

What determines "front" or "back" for a mesh are the (vertex) normals - smooth or non-smooth, and generally all meshes have them. If you look directly at a plane and flip it horizontally or vertically, the vertex normals stay the same, and therefore the plane's front/back orientation is unchanged. It does change when you mirror it front-to-back, since this will also mirror the normals.

Winding order is only relevant to define some initial orientation, to compute the direction of the face normal. Once a mesh has vertex normals, it is essentially ignored. Unity might react to a flipped mesh when recomputing the normals in the import settings, I'm not sure.