Unity插件 - MeshEditor(八)模型镜像特效

时间:2022-09-10 13:31:13

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

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

Unity插件 - MeshEditor(八)模型镜像特效

渲染顺序为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;
}

属性面板如下:

Unity插件 - MeshEditor(八)模型镜像特效

Mirror direction:镜像轴

Mirror Distance:镜像距离

Mirror Material Alpha:镜像透明度

Mirror Material Color:镜像颜色

效果图如下:

Z轴正反镜像:

Unity插件 - MeshEditor(八)模型镜像特效 Unity插件 - MeshEditor(八)模型镜像特效

Y轴正反镜像:

Unity插件 - MeshEditor(八)模型镜像特效 Unity插件 - MeshEditor(八)模型镜像特效

X轴镜像:

Unity插件 - MeshEditor(八)模型镜像特效

全方位镜像:

Unity插件 - MeshEditor(八)模型镜像特效

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

-----by MeshEditor

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

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

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

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

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

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

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

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

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

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

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

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

    网上的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. C&num; Word生成PDF

    //Word转换成pdf /// <summary> /// 把Word文件转换成为PDF格式文件 /// </summary> /// <param name=&quo ...

  2. python 中的map&lpar;&rpar;&comma; reduce&lpar;&rpar;&comma; filter

    据说是函数式编程的一个函数(然后也有人tucao py不太适合干这个),在我看来算是pythonic的一种写法. 简化了我们的操作,比方我们想将list中的数字都加1,最基本的可能是编写一个函数: I ...

  3. 我的第一篇Markdown博客

    我的第一篇Markdown博客 这是我第一次用Markdown写博客,发现还是比较好用的,加上Marsedit也支持了Markdown的博客预览,博客园也加了Markdown的格式支持,就更加方便了, ...

  4. 异步编程设计模式Demo - PrimeNumberCalculator

    using System; using System.Collections; using System.Collections.Specialized; using System.Component ...

  5. 为什么switch&period;&period;&period;case语句比if&period;&period;&period;else执行效率高

    在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...

  6. 学习MySQL(上)

    具体实例 1.PHP 服务器组件 对于初学者建议使用集成的服务器组件,它已经包含了 PHP.Apache.Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程. Window 系统可以使用 ...

  7. Shiro 自定义角色 认证

    转载,原博文的地址在:https://ailongni.iteye.com/blog/2086022 由于Shiro filterChainDefinitions中 roles默认是and,/** = ...

  8. 审计系统---堡垒机项目之strace追踪ssh

    strace 追踪ssh的进程ID,记录操作的命令[实际上是内核里面记录的东西],进行操作日志的Py解析达到效果. 修改ssh源码添加访问标志位 源码下载:[本文示例:openssh-7.4p1.ta ...

  9. Java中的方法重载

    一.什么是方法重载? 方法重载就是两个或多个方法的方法名相同,但是方法的形参类型,数量,顺序不同. 上面提到的三点也就是一个方法的特征标,只要有一点不相同,则该方法就不相同,就可以实现重载. 在这里的 ...

  10. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...