Reputation:
Is there a way to Flip (Mirror) a 3D GameObject in Unity3d?
I want to flip one of the 3D GameObjects Using Unity Game-engine capability
Upvotes: 3
Views: 10486
Reputation: 5035
Yes, flipping an object is not that hard actually. Here's two snippets of my code that achieve this (I left out the obvious boilerplate that grabs the mesh reference):
public bool flipX = true;
public bool flipY;
public bool flipZ;
void Flip()
{
if (mesh == null) return;
Vector3[] verts = mesh.vertices;
for (int i = 0; i < verts.Length; i++)
{
Vector3 c = verts[i];
if (flipX) c.x *= -1;
if (flipY) c.y *= -1;
if (flipZ) c.z *= -1;
verts[i] = c;
}
mesh.vertices = verts;
if (flipX ^ flipY ^ flipZ) FlipNormals();
}
One important detail is that depending on the axis configuration you might need to flip face normals. This is achieved by reversing the order in which verts are referenced in the triangles array:
void FlipNormals()
{
int[] tris = mesh.triangles;
for (int i = 0; i < tris.Length / 3; i++)
{
int a = tris[i * 3 + 0];
int b = tris[i * 3 + 1];
int c = tris[i * 3 + 2];
tris[i * 3 + 0] = c;
tris[i * 3 + 1] = b;
tris[i * 3 + 2] = a;
}
mesh.triangles = tris;
}
Upvotes: 5
Reputation: 633
You can scale the object by X
= -1
or Y
= -1
or Z
= -1
in inspector. According to the axis you want to mirror the object.
By code you can do this by:
transform.localScale += new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
for mirroring by the x-axis for example.
This is working for simple objects. If the object is animated this will cause a strange behaviour.
Upvotes: 4