<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在uGUI正交相機中實現旋轉透視效果

      正常uGUI使用正交相機的話,旋轉是沒有透視效果的,但如果能實現較簡單的透視,

      對一些效果表現來說還是不錯的;見下圖(左為透視效果):

      正常思路感覺各種麻煩。

      因為uGUI使用unity的x和y方向表示寬高,z方向自然就是縱深,我們可以直接拿z值作為系數進行縮放處理,

      達到偽透視的效果(美中不足,細看會有弧度感)。

       

      但是,直接對z軸進行縮放會出現扭曲問題:

       

      這種情況可以通過頂點細分來解決,一般細分一次即可。頂點越多,UV插值產生的扭曲影響就越小:

       

      再擴展一下可支持Text組件:

       

       

      最后上代碼:

      namespace Hont
      {
          using UnityEngine;
          using UnityEngine.UI;
      
          [ExecuteInEditMode]
          public class UiPerspectiveFx : BaseMeshEffect
          {
              [Header("Only Image")] public int subdivision = 2; //有的材質細分2次,有的需3-4次。
              public float perspectiveScale = 1.0f;
              public Transform referencePoint;//z軸參考對象,賦予自身即可
              public bool alwaysRefresh = true;
      
              private void Update()
              {
                  if (alwaysRefresh)
                      graphic.SetVerticesDirty();
              }
      
              private void CalcPerspectiveScale(ref Vector3 point)
              {
                  if (referencePoint)
                  {
                      var vertexWS = transform.TransformPoint(point);
                      vertexWS.z -= referencePoint.position.z;
                      var vertexZ = vertexWS.z * perspectiveScale;
                      point *= 1f + vertexZ;
                  }
              }
      
              public override void ModifyMesh(VertexHelper vh)
              {
                  RectTransform rectTransform = transform as RectTransform;
      
                  if (graphic is Image image)
                  {
                      vh.Clear();
      
                      var sizeDelta = rectTransform.sizeDelta;
                      Vector2 begin = -sizeDelta * 0.5f;
                      Vector2 cell = sizeDelta / subdivision;
                      float uvCell = 1f / subdivision;
      
                      // Get the sprite from the Image component
                      Sprite sprite = image.sprite;
                      if (sprite == null)
                          return;
      
                      // Calculate the texture rect in normalized coordinates
                      Rect textureRect = sprite.textureRect;
                      textureRect.x /= sprite.texture.width;
                      textureRect.y /= sprite.texture.height;
                      textureRect.width /= sprite.texture.width;
                      textureRect.height /= sprite.texture.height;
      
                      for (int x = 0; x < subdivision; ++x) //TODO:可進一步做緩存優化
                      {
                          for (int y = 0; y < subdivision; ++y)
                          {
                              Vector3 p0 = new Vector3(begin.x + cell.x * x, begin.y + cell.y * y);
                              Vector3 p1 = new Vector3(begin.x + cell.x * x, begin.y + cell.y * (y + 1));
                              Vector3 p2 = new Vector3(begin.x + cell.x * (x + 1), begin.y + cell.y * (y + 1));
                              Vector3 p3 = new Vector3(begin.x + cell.x * (x + 1), begin.y + cell.y * y);
      
                              Vector2 uv0 = new Vector2(textureRect.x + x * uvCell * textureRect.width, textureRect.y + y * uvCell * textureRect.height);
                              Vector2 uv1 = new Vector2(textureRect.x + x * uvCell * textureRect.width, textureRect.y + (y + 1) * uvCell * textureRect.height);
                              Vector2 uv2 = new Vector2(textureRect.x + (x + 1) * uvCell * textureRect.width, textureRect.y + (y + 1) * uvCell * textureRect.height);
                              Vector2 uv3 = new Vector2(textureRect.x + (x + 1) * uvCell * textureRect.width, textureRect.y + y * uvCell * textureRect.height);
      
                              CalcPerspectiveScale(ref p0);
                              CalcPerspectiveScale(ref p1);
                              CalcPerspectiveScale(ref p2);
                              CalcPerspectiveScale(ref p3);
      
                              vh.AddUIVertexQuad(new UIVertex[]
                              {
                                  new() {position = p0, color = graphic.color, uv0 = uv0},
                                  new() {position = p1, color = graphic.color, uv0 = uv1},
                                  new() {position = p2, color = graphic.color, uv0 = uv2},
                                  new() {position = p3, color = graphic.color, uv0 = uv3}
                              });
                          }
                      }
                  }
                  else if (graphic is Text)
                  {
                      for (int i = 0, iMax = vh.currentVertCount; i < iMax; i++)
                      {
                          UIVertex vertex = default;
                          vh.PopulateUIVertex(ref vertex, i);
                          CalcPerspectiveScale(ref vertex.position);
                          vh.SetUIVertex(vertex, i);
                      }
                  }
              }
          }
      }

       

      掛載到Image/Text組件下即可:

       

      posted @ 2022-03-06 16:33  HONT  閱讀(1240)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲乱色熟女一区二区蜜臀| 老色鬼在线精品视频在线观看| 五月丁香激激情亚洲综合| 国产三级视频网站| 同仁县| 精品国产一区二区在线视| 94人妻少妇偷人精品| 无码人妻久久久一区二区三区| 潮喷无码正在播放| 亚洲av日韩av综合在线观看| 毛茸茸性xxxx毛茸茸毛茸茸| 91麻豆精品国产91久| 草裙社区精品视频播放| 精品国产污污免费网站| 亚洲欧洲无码av电影在线观看| 四虎永久免费高清视频| 尤物yw193无码点击进入| 亚洲男人第一无码av网站| 亚洲AV成人一区国产精品| 久久99精品久久久久久9| 高清在线一区二区三区视频| 大地资源免费视频观看| 推油少妇久久99久久99久久| 亚洲国产精品一二三四五| 日产国产一区二区不卡| 激情内射亚洲一区二区三区| 亚洲天堂精品一区二区| 2020年最新国产精品正在播放| 日本黄漫动漫在线观看视频| 香蕉久久久久久av成人| 无码免费大香伊蕉在人线国产| 南丹县| 正在播放肥臀熟妇在线视频| 18禁午夜宅男成年网站| 精品无码久久久久久尤物| 风流老熟女一区二区三区| 久久亚洲精品中文字幕波多野结衣| 海门市| 色偷偷亚洲女人天堂观看| 国产成人午夜福利在线播放| 亚州中文字幕一区二区|