在Unity3d中有没有一种方法可以翻转(镜像)3D游戏对象?
我想使用Unity游戏引擎的功能之一来翻转其中一个3D游戏对象。
在Unity3d中有没有一种方法可以翻转(镜像)3D游戏对象?
我想使用Unity游戏引擎的功能之一来翻转其中一个3D游戏对象。
是的,实际上翻转一个物体并不难。以下是我的两个代码片段,可以实现此操作(我省略了显而易见的模板,包括抓取网格引用):
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();
}
一个重要细节是,根据轴配置,您可能需要翻转面法线。这可以通过颠倒三角形数组中引用的顶点顺序来实现:
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;
}
在检查器中,您可以通过设置X
=-1
或Y
=-1
或Z
=-1
来对对象进行缩放操作。根据要镜像的轴向。
代码实现方式如下:
transform.localScale += new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
例如,对于通过x轴进行镜像。
这适用于简单的对象。如果该对象是动画的,则会导致奇怪的行为。