将静态模型(带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. java中的强大的枚举(基本没人用)

    枚举的概念和多例设计模式相似,多例设计模式详见:多例设计模式代码模型 范例:简单枚举类 通过emu关键字定义一个枚举 package com.java.demo; enum Color{ RED,BL ...

  2. 【转】C++ STL快速入门

    转自:https://www.cnblogs.com/skyfsm/p/6934246.html 冠军的试炼 悟已往之不谏,知来者之可追 博客园 首页 新随笔 联系 订阅 管理 随笔 - 60  文章 ...

  3. 二哥的xss游戏

    断断续续做完了,收获挺多的. 地址:http://xsst.sinaapp.com/xss/ 二哥的xss游戏 第一题http://xsst.sinaapp.com/xss/ext/1.php?umo ...

  4. 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1554  Solved: ...

  5. [Codeforces 946G]Almost Increasing Array

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) .现在准许你删除任意一个数,删除之后需要修改最小的次数使序列单调递增.问最小次数. \(1\leq n\leq 200 ...

  6. [WC 2005]友好的生物

    Description $W$ 星球是一个和地球一样气候适宜.物种聚集的星球.经过多年的研究,外星生物学家们已经发现了数万种生物,而且这个数字还在不断增大. $W$ 星球上的生物很有趣,有些生物之间很 ...

  7. [Jsoi2011]分特产

    Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...

  8. hdu 5724 SG+状态压缩

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  9. hdu 5478 (数论)

    ⋅n+b1⋅n−k2+1 = 0 (mod C)(n = 1, 2, 3, ...)  (1<=a, b <C) 1.  当n = 1时, a^(k1+b1) + b = 0 ( mod ...

  10. [BZOJ]3243 向量内积(Noi2013)

    小C做了之后很有感觉的题目之一,但因为姿势不对调了很久. Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即 ...