unity UGUI 正交相机实现图片的透视旋转效果
UI透视效果常见的就是绕x轴或y轴旋转,来达到近大远小的效果。正经要做透视UI的话肯定直接用透视相机,如果透视效果用的极少(就一张图)不改动相机类型才按这种思路进行。
最简单直接的想法就是把矩形的图片顶点扭成梯形,在PS里面扭一下很直观的就是透视效果嘛。但是在unity里面不行,一个矩形实际是两个三角面,改了顶点位置之后明显是能看出来扭曲的,所以要按照径向方向再切分,来削弱扭曲效果。
大概切8刀(分成9份)效果就还不错了,当然如果放一个正方形、圆形这种标准图形还是能明显看出来 需要再提高切分次数。
贴出主要思路 要用的话需要再补全一下
public class UIRawImagePerspective : BaseMeshEffect
{
[SerializeField]
private float m_DeltaRate = 0.1f;
[SerializeField]
private int m_SplitCount = 8;
// Properties 略
private Graphic m_Graphic;
private Vector3 m_LastRotation;
protected override void OnEnable()
{
base.OnEnable();
m_LastRotation = transform.rotation.eulerAngles;
m_Graphic = this.GetComponent<Graphic>();
}
private void Update()
{
if (!IsActive()) return;
Vector3 rotation = transform.rotation.eulerAngles;
if (rotation != m_LastRotation)
{
m_LastRotation = rotation;
m_Graphic.SetVerticesDirty();
}
}
private override void ModifyMesh(VertexHelper vh)
{
if (!IsActive()) return;
if (m_SplitCount <= 0) return;
Vector3 rotation = m_LastRotation;
if (rotation.x == 0 && rotation.y == 0) return;
if (vh.currentVertCount > 4)
{
// 不是单个矩形的不处理
return;
}
// 这个函数是自定义的,因为直接用GetUIVertexStream()比较讨厌,写法也很别扭,实际逻辑就是取出数据
List<UIVertex> vertices = vh.GetUIVerticesEx();
List<int> indices = new List<int>();
UIVertex v;
if (rotation.x != 0)
{
float left = vertices[0].position.x;
float right = vertices[2].position.x;
Vector4 uvLeftBottom = vertices[0].uv0;
Vector4 uvRightBottom = vertices[3].uv0;
float delta = Mathf.Sin((rotation.x / 180) * Mathf.PI) * m_DeltaRate;
float length = right - left;
UIVertex tempBottom = vertices[0];
UIVertex tempTop = vertices[1];
vertices.Clear();
int parts = m_SplitCount + 1;
float topLeft = left + delta * length * 0.5f;
float bottomLeft = left - delta * length * 0.5f;
for (int i = 0; i < m_SplitCount + 2; i++)
{
float partFactor = (float)i / parts;
float uvx = uvLeftBottom.x + partFactor * (uvRightBottom.x - uvLeftBottom.x);
v = tempBottom;
v.position.x = bottomLeft + partFactor * length * (1 + delta);
v.uv0.x = uvx;
vertices.Add(v);
v = tempTop;
v.position.x = topLeft + partFactor * length * (1 - delta);
v.uv0.x = uvx;
vertices.Add(v);
if (i > 0)
{
int count = vertices.Count;
indices.Add(count - 4);
indices.Add(count - 3);
indices.Add(count - 1);
indices.Add(count - 1);
indices.Add(count - 2);
indices.Add(count - 4);
}
}
}
else
{
// 绕y轴旋转 换个方向再来一遍 略
}
vh.Clear();
// 这个函数是自定义的,也是因为AddUIVertexStream()用起来比较讨厌
vh.SetFullData(vertices, indices);
}
}
unity UGUI 正交相机实现图片的透视旋转效果的更多相关文章
- Unity 3D 正交相机(Orthographic)
1. Camera.aspect 表示摄像机显示区域的纵横比.宽高比,摄像机初始化的时候会默认设置成当前屏幕的宽高比,可以更改,也可以通过 Camera.ResetAspect 来重置. 2. Cam ...
- Unity UGUI实现鼠标拖动图片
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- Unity UGUI暂停按钮切换图片代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- Unity正交相机智能包围物体(组)方案
Unity正交相机智能包围物体(组)方案 目录 Unity正交相机智能包围物体(组)方案 一.技术背景 二.相关概念 2.1 正交摄像机 2.2 正交相机的Size 2.3 相机的Aspect 2.4 ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI实现图文混排
目前在unity实现图文混排的好像都是通过自定义字体然后在文本获取字符的位置,用图片替换掉图片标签,这样对于支持英文来说,并没有什么影响.然后对于中文来说就是一个相当麻烦的事了,毕竟图文混排多用于游戏 ...
- Unity UGUI
超详细的基础教程传送门:(持续更新中) Unity UGUI之Canvas&EventSystem:http://blog.csdn.net/qq992817263/article/detai ...
- Unity UGUI Layout自动排版组件用法介绍
Unity UGUI布局组件 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...
随机推荐
- 4.5 x64dbg 探索钩子劫持技术
钩子劫持技术是计算机编程中的一种技术,它们可以让开发者拦截系统函数或应用程序函数的调用,并在函数调用前或调用后执行自定义代码,钩子劫持技术通常用于病毒和恶意软件,也可以让开发者扩展或修改系统函数的功能 ...
- Vmware安装Deepin20
一.搭建环境 虚拟机:Vmware Workstation pro 17 Windows版本 镜像:Deepin 20 二.创建虚拟机 1.点击创建新的虚拟机,选择典型 2.选择稍后安装 3.选择li ...
- Visual Studio Code调试和发布ASP.NET Core Web应用
前言 上一篇文章主要讲了Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VS Code中调试和发布AS ...
- 云储存选择做Hexo博客图床(腾讯云、七牛云、网易云)
前言 博客里需要添加很多图片作为内容的补充,但是把图片放在本地博客文件夹里,上传到网上后,加载这些图片就是一个很大的问题,他们会拖累网页加载的速度,所以建议把图片放图床里,通过外链来访问和加载这些图片 ...
- modulemap的使用方法
modulemap的作用 modulemap 文件是用来解决 C,Object-C,C++ 代码在 Swift 项目中集成的问题的. 在 Swift 项目中,如果需要使用 C,Object-C 或 ...
- Unity UGUI的EventSystem(事件系统)组件的介绍及使用
Unity UGUI的EventSystem(事件系统)组件的介绍及使用 1. 什么是EventSystem组件? EventSystem是Unity UGUI中的一个重要组件,用于处理用户输入事件, ...
- opencv-python中 boundingRect(cnt)以及cv2.rectangle用法
矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来.还有一个带旋转的矩形,面积会更小,效果见下图 首先介绍下cv2.boundingRect(img)这个函数 ...
- Wampserver64 报错:无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。
缺少环境配置, 程序下载地址如下: https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679 点击下载,下载完成后,双击程 ...
- Win11 开启 telnet
'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件. 首先我们打开底部"开始菜单",如图所示.接着打开其中的"设置". 然后进入左边的&quo ...
- 青少年CTF平台 Web签到
题目说明 Web一星简单题,Web签到. 直接启动环境,等待30秒左右访问题目链接. 做题过程 进入后,题目好像没有告诉我们什么有用的信息, F12,看遍了题目源码,也没有发现flag,正当我怀疑这个 ...