Unity3D之如何创建正确的像素比在屏幕上

    关于这篇文章的命名,实在不知道怎么命名好,大概功能就是:比如一张宽高为100x100的图片显示在屏幕上,那2D摄像头的Size值为多少时,屏幕上显示出来图片大小和图片的实际像素一致。该文章来自 【狗刨学习网】

    这里涉及到一个GL坐标和像素坐标值的转换比,这个比值我们可以自己设置~之后我们设置面上顶点的大小也是依据这个来设置的。
    
   
    比如上面的图的坐标系是世界坐标,而摄像机的坐标在原点(0,0,0),而且摄像机的Size属性为1那么我们在Size为1,而且屏幕的宽高比为3:2的情况下,摄像机所能看到的范围就如上图中橙色框框那样,也就是所能看到的高度y的世界坐标范围是-1到1,宽度x的世界坐标范围是-1.5到1.5 。那么我们就可以算出世界坐标和像素坐标的比值了。如果我们的屏幕宽高是480x320 (也是3:2的屏幕),那么如果显示在这个屏幕下,上图中,AB两点的高度是320,那么世界坐标高度就和屏幕的高度有个比值,即 2:320 再举个例子,假如有张宽高为100x100的图片,要显示在屏幕上,那它相对的世界坐标是的宽高又是多少呢?根据上面的比值可以算出来:

     100 * 2 / 320 = 0.625;
      
    有这个比值,我们在用顶点生成面的时候就用图片的实际像素宽高乘以这个比值就能得到世界坐标的值鸟~

    再写个程序简单的显示一张128x128的贴图在2D摄像头的size为1的境况测试下吧
  1. <font face="新宋体" size="2">using UnityEngine;
  2. using System.Collections;

  3. public class SimpleSprite : MonoBehaviour {
  4.      
  5.     //标准摄像头的高度//
  6.     public float standardCameraSize;
  7.      
  8.     //标准屏幕的高度//
  9.     public float standardHeight;
  10.      
  11.      
  12.     private float glTopixelRatio;
  13.      
  14.      
  15.      
  16.     //素材求//
  17.     public Material spriteMaterial;
  18.      
  19.     //顶点数//
  20.     private int verticesCount = 4;
  21.      
  22.      
  23.      

  24.     // Use this for initialization
  25.     void Start () {
  26.         //计算像素和世界单位的比值//
  27.         glTopixelRatio = standardCameraSize * 2.0f / standardHeight;
  28.         initSprite();
  29.     }
  30.      
  31.     // Update is called once per frame
  32.     void Update () {}
  33.      
  34.     //根据宽高生成对应的面//
  35.     private void initSprite(){
  36.          
  37.         //获取图片的像素宽高//
  38.         int pixelHeight = spriteMaterial.mainTexture.height;
  39.         int pixelWidth = spriteMaterial.mainTexture.width;
  40.          
  41.         Debug.Log("pixeW:" + pixelWidth + ",pixeH:" + pixelHeight);
  42.          
  43.         //得到MeshFilter对象//
  44.         MeshFilter meshFilter = gameObject.GetComponent();
  45.         if(meshFilter == null){
  46.             //为null时,自动添加//
  47.             meshFilter = gameObject.AddComponent();
  48.             MeshRenderer meshRenderer = gameObject.AddComponent();
  49.             meshRenderer.sharedMaterial = spriteMaterial;
  50.         }
  51.         //得到对应的网格对象//
  52.         Mesh mesh = meshFilter.mesh;
  53.          
  54.         //三角形顶点的坐标数组//
  55.         Vector3[] vertices = new Vector3[verticesCount];

  56.         //得到三角形的数量//
  57.         int trianglesCount = verticesCount - 2;

  58.         //三角形顶点数组//
  59.         int[] triangles   = new int[verticesCount *3];
  60.          
  61.          
  62.         float glWidth = pixelWidth * glTopixelRatio;
  63.         float glHeight = pixelHeight * glTopixelRatio;
  64.          
  65.          
  66.          
  67.         //以当前对象的中心坐标为标准//
  68.         vertices[0] = new Vector3(0, 0, 0);
  69.         vertices[1] = new Vector3(0, glHeight, 0);
  70.         vertices[2] = new Vector3(glWidth, 0, 0);
  71.         vertices[3] = new Vector3(glWidth, glHeight, 0);
  72.          
  73.         mesh.vertices = vertices;
  74.          
  75.          
  76.         //绑定顶点顺序//
  77.         triangles[0] = 0;
  78.         triangles[1] = 1;
  79.         triangles[2] = 2;
  80.         triangles[3] = 1;
  81.         triangles[4] = 3;
  82.         triangles[5] = 2;      
  83.          
  84.          
  85.         mesh.triangles = triangles;
  86.          
  87.         mesh.uv = new Vector2[]{new Vector2(0,0), new Vector2(0,1), new Vector2(1,0), new Vector2(1,1)};
  88.          
  89.          
  90.     }  
  91.      
  92. }</font>
复制代码

    上面是个简单显示一张图片的代码~

    下面是测试结果,用ps加张图片(红色圈圈)比比看显示出来的图片宽高是不是和实际像素一样,结果大小是一样的~

      

1354034633_6891.png (69.91 KB, 下载次数: 0)

下载附件  保存到相册

9 小时前 上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值