将静态模型(带MeshFilter)按指定轴向、指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之前模型的顶点,所以三角面的渲染顺序要变,面的渲染,在unity中,因为一个三角面是以这个三角面的三个组成顶点的顺时针顺序渲染的,镜像颠倒以后,面的渲染顺序正好相反,模型的面正好全部渲染到相反方向(不过感觉像是一个做双面材质的笨办法),这里将所有三角面保存的顶点信息整体倒置一遍就正好倒置了所有面的渲染方向了。

感觉有点绕,例如,一个面有三个顶点组成,分别是1,2,3,他们是这样分布的:

渲染顺序为1,2,3的话,就是渲染的面向屏幕之外的这个面,渲染顺序为1,3,2的话,就是渲染的面向屏幕之内的这个面。

基本情况就是这样了。

接下来是代码:

第一步:

重新生成镜像物的顶点:

    /// <summary>
/// 生成镜像顶点
/// </summary>
Vector3[] GenerateVertices(Vector3[] oldVertices)
{
Vector3[] newVertices = oldVertices;
//镜像所有顶点
switch (_MirrorDirection)
{
case MirrorDirection.x:
for (int i = 0; i < newVertices.Length; i++) newVertices[i].x = newVertices[i].x * -1 + _MirrorDistance;
break;
case MirrorDirection.y:
for (int i = 0; i < newVertices.Length; i++) newVertices[i].y = newVertices[i].y * -1 + _MirrorDistance;
break;
case MirrorDirection.z:
for (int i = 0; i < newVertices.Length; i++) newVertices[i].z = newVertices[i].z * -1 + _MirrorDistance;
break;
} return newVertices;
}

第二步:

重新生成镜像物的三角面

    /// <summary>
/// 生成镜像三角面
/// </summary>
int[] GenerateTriangles(int[] oldTriangles)
{
int[] newTriangles = new int[oldTriangles.Length];
//将所有面的顶点渲染顺序颠倒
for (int i = 0; i < newTriangles.Length; i++)
newTriangles[newTriangles.Length - i - 1] = oldTriangles[i]; return newTriangles;
}

第三步:

重新生成镜像物的材质

    /// <summary>
/// 生成镜像材质
/// </summary>
Material GenerateMaterial(Material oldMaterial)
{
Material newMaterial = new Material(oldMaterial);
//不透明
if (_MirrorMaterialAlpha >= 1.0f)
{
SetMaterialRenderingMode(newMaterial, RenderingMode.Opaque);
if (newMaterial.HasProperty("_Color"))
{
newMaterial.SetColor("_Color", _MirrorMaterialColor);
}
}
//透明
else
{
SetMaterialRenderingMode(newMaterial, RenderingMode.Fade);
if (newMaterial.HasProperty("_Color"))
{
_MirrorMaterialColor.a = _MirrorMaterialAlpha;
newMaterial.SetColor("_Color", _MirrorMaterialColor);
}
} return newMaterial;
}

属性面板如下:

Mirror direction:镜像轴

Mirror Distance:镜像距离

Mirror Material Alpha:镜像透明度

Mirror Material Color:镜像颜色

效果图如下:

Z轴正反镜像:

 

Y轴正反镜像:

 

X轴镜像:

全方位镜像:

在角色脚底镜像之后加一层水面用做倒影其实效果还不错的,当然只能是静态物体。

-----by MeshEditor

Unity插件 - MeshEditor(八)模型镜像特效的更多相关文章

  1. Unity插件 - MeshEditor(二) 模型网格编辑器(高级)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 继先前的一篇MeshEditor之后,MeshEditor第二版发布,这次在先前的基础上加入了为模型新增顶点以及删 ...

  2. Unity插件 - MeshEditor(四) 模型融化特效

    现在的电影里有很多妖魔在死亡后身体逐渐融化并下滑最后化为一滩黑水的情景,本次出于兴趣大致研究了这个效果,原理是控制模型的顶点向一个方向坍塌,坍塌到最低点时再根据法线方向扩散形成黑水状. 第一步: 添加 ...

  3. Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器

    之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...

  4. Unity插件 - MeshEditor(七)变形动画骨骼及蒙皮

    MeshAnimation在物体的顶点比较多的情况下,悲剧是显而可见的,我一个一个的点选顶点肯定得累死,而且对于形态的调控不是很方便,应该说是很麻烦,要知道,骨骼动画因为有了骨骼以及蒙皮信息而有了灵魂 ...

  5. Unity插件 - MeshEditor(五) 网格顶点动画(变形动画)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 网格顶点动画(变形动画)是针对于物体的形状可以随意变换并记录为关键帧的动画,虽然模型的顶点数据还是应该交给GPU绘 ...

  6. Unity插件 - MeshEditor(三) 面片破碎&网格破碎

    网上的unity破碎插件很多,不过想着可以以自己的方式实现也不失为一种乐趣,虽然整体的表现性上显得有些差,但也并不会影响最终的效果,接下来我大致讲解一下破碎一个物体的流程,因为用到了协程计算碎片的原因 ...

  7. Unity插件 - MeshEditor(六) 变形动画状态机

    变形动画状态机--MeshAnimator,是针对MeshAnimation的状态管理器,有大量类似Unity animator的功能,但MeshAnimator操作会更加简便,更加直观,居家旅(zh ...

  8. Unity NGUI和UGUI与模型、特效的层级关系

    目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 ...

  9. Unity插件之NGUI学习(5)—— 创建Label图文混排及文字点击

    创建一个新的Scene,并按 Unity插件之NGUI学习(2)创建UI Root. 准备工作,制作Font.如今Project窗体创建一个Font目录.然后从系统自带字体目录中选择自己须要的字体,我 ...

随机推荐

  1. python读取excel时,数字自动转化为float

    xlrd模块去读excel时会将数字类型的自动转化为浮点数,这是一个小坑.在网上查了一下,该模块的作者也说过Excel treats all numbers as floats. In general ...

  2. JavaScript 散集合(HashArray)

    散列表和散列映射是一样的,我们已经在本章中介绍了这种数据结构. 在一些编程语言中,还有一种叫作散列集合的实现.散列集合由一个集合构成,但是插入. 移除或获取元素时,使用的是散列函数.我们可以重用本章中 ...

  3. [SDOI 2011]消耗战

    Description 题库链接 给你一棵 \(n\) 个节点根节点为 \(1\) 的有根树,有边权. \(m\) 次询问,每次给出 \(k_i\) 个关键点.询问切断一些边,使这些点到根节点不连通, ...

  4. [JLOI 2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...

  5. wows

    [问题描述]山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形水域内的炮弹 ...

  6. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  7. 【Codeforces Round 418】An impassioned circulation of affection DP

                                                            C. An impassioned circulation of affection   ...

  8. 4999: This Problem Is Too Simple!

    Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: C i x(0<=x<2^31) 表示将i节点的值改为x. Q i j x(0<=x<2^31 ...

  9. 5650 so easy

    so easy  Accepts: 512  Submissions: 1601  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6553 ...

  10. 【UOJ UNR #1】争夺圣杯

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...