精华内容
下载资源
问答
  • 在做游戏开发时,场景的三角面和顶点影响着运行效率,尤其是在手机平台上,实时的知道场景的各项指标,对性能优化来说至关重要,下面我们来实现一个小功能,来实时计算场景的三角面和顶点;  如果要...

     在做游戏开发时,场景中的三角面和顶点数影响着运行效率,尤其是在手机平台上,实时的知道场景中的各项指标,对性能优化来说至关重要,下面我们来实现一个小功能,来实时计算场景中的三角面和顶点数;

         如果要知道场景中的三角面和顶点数,首先我们要得到场景中所有的物体,如下:

     

    GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];

        
        其次,在我们得到的这些Gameobject中,有的含有MeshFilter 有的不含有,我们要得到这些物体中哪些包含MeshFilter,所以:

     

     

    Component[] filters;
            filters = obj.GetComponentsInChildren<MeshFilter>();

        然后我们再在这些filters中得到每个物体的三角面和顶点数,然后再把他们相加,就是我们所要的知道的场景中所有物体的三角面的顶点总数:

     

    foreach (MeshFilter f in filters)
            {
                tris += f.sharedMesh.triangles.Length / 3;
                verts += f.sharedMesh.vertexCount;
            }

        接下来,我们需要把得到的数据显示在前端来供我们查看:

     

     

    void OnGUI()
        {
            string vertsdisplay = verts.ToString("#,##0 verts");
            GUILayout.Label(vertsdisplay);jiex
            string trisdisplay = tris.ToString("#,##0 tris");
            GUILayout.Label(trisdisplay);
        }

    在场景中运行,如下所示:

     

        源码如下:

     

    using UnityEngine;
    using System.Collections;
    
    public class CalculateVertsAndTris : MonoBehaviour
    {
        public float f_UpdateInterval = 0.5F;  //刷新间隔
        private float f_LastInterval;      //上一次刷新的时间间隔
    
        public static int verts;
        public static int tris;
    	// Use this for initialization
    	void Start () {
            f_LastInterval = Time.realtimeSinceStartup;
    	}
        /// <summary>
        /// 得到场景中所有的GameObject
        /// </summary>
        void GetAllObjects()
        {
            verts = 0;
            tris = 0;
            GameObject[] ob = FindObjectsOfType(typeof(GameObject)) as GameObject[];
            foreach (GameObject obj in ob)
            {
                GetAllVertsAndTris(obj);
            }
        }
        //得到三角面和顶点数
        void GetAllVertsAndTris(GameObject obj)
        {
            Component[] filters;
            filters = obj.GetComponentsInChildren<MeshFilter>();
            foreach (MeshFilter f in filters)
            {
                tris += f.sharedMesh.triangles.Length / 3;
                verts += f.sharedMesh.vertexCount;
            }
        }
        void OnGUI()
        {
            string vertsdisplay = verts.ToString("#,##0 verts");
            GUILayout.Label(vertsdisplay);
            string trisdisplay = tris.ToString("#,##0 tris");
            GUILayout.Label(trisdisplay);
        }
        // Update is called once per frame
        void Update()
        {
    
            if (Time.realtimeSinceStartup > f_LastInterval + f_UpdateInterval)
            {
                f_LastInterval = Time.realtimeSinceStartup;
                GetAllObjects();
            }
        }
    }
    展开全文
  • Unity3d 数字模型制作规范

    千次阅读 2016-05-04 17:40:26
    本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的。当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸、单位,模型归类塌陷、命名、节点编辑,纹理、...

    数字模型制作规范

    本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的。当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸、单位,模型归类塌陷、命名、节点编辑,纹理、坐标、纹理尺寸、纹理格式、材质球等必须是符合制作规范的。一个归类清晰、面数节省、制作规范的模型文件对于程序控制管理是十分必要的。

            

            首先对制作流程作简单介绍:
    素材采集-模型制作-贴图制作-场景塌陷、命名、展UV坐标-灯光渲染测试-场景烘培-场景调整导出 第一章  模型制作规范

    1   在模型分工之前,必须确定模型定位标准。一般这个标准会是一个CAD底图。制作人员必须依照这个带有CAD底图的文件确定自己分工区域的模型位置,并且不得对这个标准文件进行任何修改。导入到MAX里的CAD底图最好在(0,0,0)位置,以便制作人员的初始模型在零点附近。  

     

    2   在没有特殊要求的情况下,单位为米(Meters),如图所示。


    3    删除场景中多余的面,在建立模型时,看不见的地方不用建模,对于看不见的面也可以删除,主要是为了提高贴图的利用率,降低整个场景的面数,以提高交互场景的运行速度。如Box底面、贴着墙壁物体的背面等。

    4    保持模型面与面之间的距离推荐最小间距为当前场景最大尺度的二千分之一。例如:在制作室内场景时,物体的面与面之间距离不要小于2mm;在制作场景长(或宽)为1km的室外场景时,物体的面与面之间距离不要小于20cm。如果物体的面与面之间贴得太近,会出现两个面交替出现的闪烁现象。模型与模型之间不允许出现共面、漏面和反面,看不见的面要删掉。在建模初期一定要注意检查共面、漏面和反面的情况;

    5    可以复制的物体尽量复制。如果一个1000个面的物体,烘焙好之后复制出去100个,那么他所消耗的资源,基本上和一个物体所消耗的资源一样多。

    6    建模时最好采用Editable Poly面片建模,这种建模方式在最后烘焙时不会出现三角面现象,如果采用EditableMesh 在最终烘焙时可能会出现三角面的情况。如图所示。


    7模型的塌陷

    当一栋建筑模型经过建模、贴纹理之后,然后就是将模型塌陷,这一步工作也是为了下一步烘焙做准备。所以在塌陷的时候要注意一些问题:

    (1)    按照“一建筑一物体”的原则塌陷,体量特别大或连体建筑可分塌为2-3个物体,但导出前要按建筑再塌成一个物体,城中村要按照院落塌陷。

    (2)    用Box反塌物体,转成Poly模式,这时需检查贴图有无错乱;

    (3)    塌陷物体,按楼或者地块来塌陷,不要跨区域塌陷;

    (4)    按项目对名称的要求进行严格的标准的命名;

    (5)    所有物体的质心要归于中心,检查物体位置无误后锁定物体;

    备注:所有物体不准出现超过20000三角面的情况,否则导出时出错。

    8  模型命名

     不能使用中文命名,必须使用英文命名,不然在英文系统里会出问题。地块建筑模型不允许出现重名,必须按规范命名。

     

    9树的种植方法

     

    用十字交叉树或简模树。在种植树木的时候,要考虑到与周围建筑的关系,不能乱种树,要根据现状放置不同的树种、位置;重点建筑地块需种简模树,并在原地与之对应的种上十字片树(替换用);导出时模型树和与之对应的十字片树为单棵的,其它十字片树可塌一起,但面数不能超过1万。

    10模型的级别

     

        也就是模型的精细程度,有时我们在建模的时候要根据建筑所处的具体位置,重要程度对该建筑进行判断是建成何种精度的仿真模型。可以将建筑分为五个等级。

        其中,一级为最高等级,五级为最低等级。

        单个物体的面数不要太大,毕竟是做虚拟现实,而不是制作单张效果图。单个物体面数要控制到8000个面以下。

    11   镜像的物体需要修正

     

               用镜像复制的方法来创建新模型,需要加修改编辑器修正一下。

       第一步:需要选中镜像后的物体,然后进入Utilities面板中单击Reset XForm,然后单击Reset Selected;

       第二步:进入modfiy面板选取Normal命令,反转一下法线即可。

    12   烘焙的物体黑缝解决对办法

     

       在烘焙的时候,如果图片不够大的时候,往往会在边缘产生黑缝。

     

    处理小技巧 :  

       1)如果做鸟瞰楼体比较复杂可以把楼体合并成一个物体变成多重材质,然后对楼体进行整体完全烘焙;这样可以节省很多资源。

    2)对于建筑及地形,须检查模型的贴图材料平铺的比例,对于较远的地表(或者草地),可以考虑用一张有真实感的图来平铺,平铺次数少一些。对于远端的地面材料,如果平铺次数大了,真实感比较差。

     

     

     

    第二章      材质贴图规范

    1  材质和贴图类型

        我们目前使用的是Unity3D软件作为仿真开发平台,该软件对模型的材质有一些特殊的要求,在我们使用的3dsMax中不是所有材质都被Unity3D软件所支持,只有下面几种材质是被Unity3D软件所支持。

    Standard(标准材质)

         默认的通用材质球。基本上目前所有的仿真系统都支持这种材质类型。

    Multi/Sub-Object(多维/子物体材质)

         将多个材质组合为一种复合式材质,分别指定给一个物体的不同次物体选择级别。要注意的是,在VR场景制作中,Multi/Sub-Object材质中的子材质一定要是Standard标准材质。否则不被unity3d支持。我们在制作完模型进行烘焙贴图前都必须将所有物体塌陷在一起,塌陷后的新物体就会自动产生一个新的Multi/Sub-Object多维/子物体材质。因此,这种材质类型在我们的仿真制作中经常使用。

     

    2  贴图通道及贴图类型 

           Unity3D目前只支持Bitmap贴图类型,其它所有贴图类型均不支持。只支持Diffuse Color(漫反射)同self-Illumination(自发光,用来导出lightmap)贴图通道。

          Self-Illumination(不透明)贴图通道在烘焙lightmap后,需要将此贴图通道额channel设置为烘焙后的新channel,同时将生成的lightmap指向到self-Illumination。

     

    3贴图的文件格式和尺寸

         建筑的原始贴图不带通道的为JPG,带通道的为32位TGA,但最大别超过2048;贴图文件尺寸必须是2的N次方(8、16、32、64、128、256、512),最大贴图尺寸不能超过(1024×1024)。

         在烘培时将纹理贴图存为TGA 格式。

     

    4贴图和材质应用规则

        (1)    贴图不能以中文命名,不能有重名;

        (2)    材质球命名与物体名称一致;

        (3)    材质球的父子层级的命名必须一致;

        (4)    同种贴图必须使一个材质球;

        (5)    除需要用双面材质表现的物体之外,其他物体不能使用双面材质;

        (6)    材质球的ID号和物体的ID号必须一致。

        (7)    若使用CompleteMap烘焙,烘焙完毕后会自动产生一个Shell材质,必须将Shell材质变为Standard标准材质,并且通道要一致,否则不能正确导出贴图。

        (8)    带Alpha通道的贴图,在命名时必须加_al以区分。

     

    5通道纹理应用规则 

    模型需要通过通道处理时需要制作带有通道的纹理。在制作树的通道纹理时,最好将透明部分改成树的主色,这样在渲染时可以使有效边缘部分的颜色正确。通道纹理在程序渲染时占用的资源比同尺寸普通纹理要多。通道纹理命名时应以-AL结尾。 

     

     

     

    第三章      模型烘焙及导出

     

    模型烘焙

    1场景灯光

        (1)    渲染方式:采用Max自带的LightTracer光线追踪进行渲染。

        (2)    灯光效果控制:

        该项目在烘焙前会给出固定的烘焙灯光,灯光的高度、角度、参数均不可调整,可以在顶视图中将灯光组平移到自己的区块,必须要用灯光合并场景然后烘焙。

    2  烘焙贴图方式

        建筑模型的烘焙方式有两种:一种是LightMap烘焙贴方式,这种烘焙贴图渲染出来的贴图只带有阴影信息,不包含基本纹理。具体应用于制作纹理较清晰的模型文件(如地形),原理是将模型的基本纹理贴图和LightMap阴影贴图两者进行叠加。优点是最终模型纹理比较楚,而且可以使用重复纹理贴图,节约纹理资源;烘焙后的模型可以直接导出FBX文件,不用修改贴图通道。缺点是LightingMap贴图不带有高光信息;

        另一种是CompleteMap烘焙方式,这种烘焙贴图方式的优点是渲染出来的贴图本身就带有基本纹理和光影信息,但缺点是没有细节纹理,且在近处时纹理比较模糊。

    3   烘焙贴图设置

    ①    CompleteMap烘焙方式

         在进行CompleteMap烘焙设置时,应注意以下几点:

              a)     贴图通道和物体UV坐标通道必须为1通道,见图所示;



    b)     烘焙贴图文件存储格式为TGA格式;

    c)      烘焙设置见图所示。


    ②     LightingMap烘焙方式

    在进行LightingMap烘焙设置时,和CompleteMap设置有些地方不同:

    a)      贴图通道和物体UV坐标通道必须为3通道,见图所示;


    b)     烘焙时灯光的阴方式为Adv.RayTraced阴影,见图所示;


    c)      烘焙设置见图所示;


    d)     用LightingMap烘焙时,背景色要改为白色,可避免有黑边的情况;而用CompleteMap烘培时,背景色要改为与贴图近似的颜色。

     

    e)     在使用lightmap烘焙后,需要将材质改回Standard,然后将新生成的map拷贝到Standard的self-Illumination内,并设置正确的贴图通道。

     

    4  贴图UV编辑

    必须手动进行UV编辑。

    模型导出

    1、将烘培材质球改为标准材质球,通道为1,自发光100;

    2、将所有物体名、材质球名、贴图名保持一致

    3、合并顶点(大小要合适);

    4、清除场景,除了主要的有用的物体外,删除一切物件;

    5、清材质球,删除多余的材质球(不重要的贴图要缩小);

    6、按要求导出fbx(检查看是否要打组导出);




    第四章  场景模型验收

    模型制作流程


    模型验收流程


    模型验收标准



    第五章   模型备份提交标准

     

    文件标准备份模式:

    l   UV 坐标:存放地型和建筑烘培前编辑的UV坐标;

    l   导出fbx:存放最终导出的地型和建筑的fbx文件;

    l   烘培贴图:存放地型的最终贴图和建筑的最终烘培贴图,tga格式的,    同时这里面有一份转好的贴图;

    l   原始贴图:存放地型和建筑在制作过程中的所有的贴图;

    l   Max文件:原始模型,未做任何塌陷的,有UVW贴图坐标的文件。

    烘焙前模型,已经塌陷完的,展好UV的,调试好灯光渲染测试过的文件。

    烘焙后模型,已经烘培完的,未做任何处理的文件。

    导出模型,处理完烘培物体,合并完顶点,删除了一切没用物件的文件。

     

    第六章          项目命名要求

    1、建筑模型命名:区域名_jz_编号;如:SH01_01_jz_01、SH01_01_jz_02……

    2、建筑贴图命名:模型名_编号;如:SH01_01_jz_01_01……

    3、地形模型命名:区域名_dx_编号;如:SH01_01_dx_01……

    4、地形贴图命名:模型名_编号;如:SH01_01_dx_01_01……

    5、镂空贴图:要加“_al”后缀

    6、需要加特效的玻璃要加“_bl”后缀;(需要加特效的要单独一个物体烘焙)

    第七章   创建各资料路径

     

    1、航片存放路径

    2、各区域CAD导出的MAX文件

    3、照片资料

    4、公共纹理库资料

    5、客户提供的所有资料

    第七章          特殊制作要求

     

    1、            围墙、护栏、雨棚、车棚等要按实际制作。

    2、            照片与图纸不符时,以实际照片为主。

    3、            沿街店铺尽量与实际一致。

    4、            预估尺寸时尽量去借助照片中的参照物,如人、汽车、树木等。

    5、            除重点建筑外尽量简化模型,贴图做精,能用贴图表现结构的尽量用贴图表现。

    6、            绿化的种类、颜色尽量去实际一致。

    7、            建筑顶部的结构及顶部的附属设施尽量按实际制作。

    8、            建筑贴图时顶部要留出女儿墙的高度,避免出现窗户顶到建筑顶部。

    9、            建筑要制作入口。

    10、        地形、绿化要丰富。

    11、        书报亭、公交站、变电箱、烟囱、信号塔等要简单制作,以丰富场景。

    12、        所有贴图UV大小要准确,避免失真。




    展开全文
  • Unity3D UI Text得分数字增加

    万次阅读 2018-11-23 13:15:27
    Unity3D UGUI Text得分数字增加 代码 一、首先在Hierarchy创建Text组建,并绑定脚本。 using UnityEngine; using System.Collections; using UnityEngine.UI; public class Score : MonoBehaviour { ...

    Unity3D UGUI Text得分数字增加 代码

    在这里插入图片描述
    一、首先在Hierarchy中创建Text,并绑定脚本。

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;				**//导入资源库**
    
    public class Score : MonoBehaviour {
    	public static Text txt;				**//定义静态变量名以用于其他脚本内的引用**
    	public static float x = 0;
    	void Start () 
    	{
    		txt = GameObject.Find ("Text").GetComponent<Text> ();	 
    	}
    }
    
    

    二、在确定变量名指定的组建后,对得分时情况进行判断。这里进入判断绑定刚体是否碰撞的脚本。

    using UnityEngine;
    using System.Collections;
    
    public class collision2 : MonoBehaviour {
    	public GameObject bullet;	
    
    	void OnCollisionEnter(Collision col)				**//当刚体碰撞开始时**
    	{
    		if (col.gameObject.name.Equals ("Bullet(Clone)")) 
    		{
    			Instantiate (bullet,col.transform.position,Quaternion.identity);
    			Destroy(col.gameObject);  
    			Score.x += 1;				**//刚体碰撞结束后得分加1**
    			Score.txt.text = "Score : " + Score.x;				//在text文本中显示Score : x
    		}
    	}
    

    总结:这里的代码示例是以制定刚体碰撞的开始时,进行得分判断。当Bullet(Clone)与脚本绑定的刚体碰撞,便得分数 X+1 ,并在Score脚本中的txt中加上转换成文本类型后的X。

    展开全文
  • Unity3D离线版数字地球实现

    千次阅读 多人点赞 2020-12-06 13:50:34
    Unity3D离线版数字地球实现概述效果展示设计思路GIS相关计算公式(经纬度与三维坐标)GIS计算公式(瓦片,像素与经纬度)插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

    概述

    最近因为某个项目需求,要我们这边做一个类似数字地球的东西出来,但是由于某些原因限制了不能连接外部网络,所以要求做一个本地的离线版数字地球出来。因为一直在用Unity3D学做游戏开发,稍微调研了一下感觉用unity3d也应该能做出来。所以这里先开一个坑,写一下实现这个离线版数字地球的学习过程(顺便学习一下GIS)的相关知识。

    效果展示

    这里简单先展示下做出来的离线版数字地球的效果吧(上传图片大小限制在5M,看着不是很清晰):
    在这里插入图片描述

    设计思路

    设计思路还是比较清晰的:

    • 首先找个高清点的地球三维模型(这里是我上某宝买的一个unity3d地球高清模型包)
    • 然后找到不同级别的瓦片地图,这里稍微科普一下什么是瓦片地图:
      • 参考资料:国内主要地图瓦片坐标系定义及计算原理
      • 简单而言就是不同级别的瓦片数量不同,越高级别的瓦片数量越多,展示的地图越详细,某一瓦片等级地图的瓦片是由低一级的各瓦片切割成的4个瓦片组成,形成了瓦片金字塔。
    • 所以离线版数字地球的话,最重要的也就是这个不同级别瓦片的获取方法了,可以联网的话,我们是可以去申请BingMap的Key在线获取这些瓦片地图资源的。这种Key如何使用,大家可以参考一下Unity一个叫做WorldComposer的插件(某宝也有卖,当然如果可以的话大家还是支持下正版比较好啊),这个插件的使用教程Unity3D地形建模插件World Composer用法(大范围地形建模)
    • 但是目前需求是要整一个离线版的数字地球,所以没办法我们只能预先把这些瓦片地图玩意给先下下来,然后在本地去进行加载了。至于怎么搞到这些离线的瓦片地图资源: 全球瓦片数量贼多,一般想要白嫖到这些资源感觉还是有点难度的,也试了一下什么水经注,GlobalMap等一些GIS软件,好像不是要收费就是各种限制,软件入门也有点难搞。所以这里我又去某宝搜了一下,花了我几百大洋(心痛!),找了一个店家买了全球0-9级的瓦片,中国区域0-12级的瓦片资源。
    • OK,地球模型有了,离线瓦片资源也有了的情况下,我们就可以进行离线版数字地球的开发了。

    GIS相关计算公式(经纬度与三维坐标)

    简单罗列下目前可能会用到的GIS相关公式吧(注意由于使用了Unity的Mathf函数,这些函数的操作数都是float级别的,所以实际上可能计算出来会有一点点的偏差,如果可以的话最好还是用double的方式实现下这里的这些函数)。

    • 根据经纬度转三维坐标:我们需要根据给定的一个经纬度坐标,得到其在Unity世界三维点的位置:
    	/// <summary>
        /// 根据经纬度计算球面坐标
        /// </summary>
        /// <param name="longitude">经度</param>
        /// <param name="latitude">纬度</param>
        /// <returns></returns>
        private Vector3 GetSphericalCoordinates(double longitude,double latitude)
        {
            latitude = latitude * Mathf.PI / 180D;
            longitude = longitude * Mathf.PI / 180D;
            double x = EarthRadius * Mathf.Cos((float)latitude) * Mathf.Sin((float)longitude);
            double y = EarthRadius * Mathf.Sin((float)latitude);
            double z = -EarthRadius * Mathf.Cos((float)latitude) * Mathf.Cos((float)longitude);
            return new Vector3((float)x, (float)y, (float)z);
        }
    
    • 以及对应的逆变换:根据三维坐标活得其经纬度,这里要注意一下经度范围是-180到180,纬度是-90到90,注意下程序里面正负号就行了。
    	/// <summary>
        /// 根据三维坐标计算经纬度
        /// </summary>
        /// <param name="pos">目标三维坐标</param>
        /// <returns></returns>
        private Vector2 CalculateLontitudeAndLatitude(Vector3 pos)
        {
            int s = 1;
            int q = 1;
            if (pos.x < 0.0f)
            {
                s = -1;
            }        
            if(pos.y > 0.0f)
            {
                q = -1;
            }
            float latitudeAngle = Mathf.Asin(pos.y / EarthRadius);
            float latitude = latitudeAngle * 180.0f / Mathf.PI;
    
            float longtitudeAngle = Mathf.Acos(pos.z / (-1.0f * EarthRadius * Mathf.Cos(latitudeAngle)));
            float longtitude = longtitudeAngle * 180.0f / Mathf.PI;
            return new Vector2(s * longtitude, q * latitude);
        }
    
    • 简单验证一下:
      可以从高德地图这里随便点一个点的位置,然后获取这个地方的经纬度
      在这里插入图片描述
      把这经纬度输入unity里面进行计算一下,比如这里我以北京经纬度(116.541843,39.661317)为例:
      在这里插入图片描述
      在这里插入图片描述
      简单的目测位置好像差不太多,可能因为精度问题会有一些偏差,这个之后再去整理一下吧。

    GIS计算公式(瓦片,像素与经纬度)

    这部分稍微就有那么一点复杂了,主要是这涉及到一些GIS坐标投影和瓦片之间的坐标转化与计算公式,具体公式来源自国内主要地图瓦片坐标系定义及计算原理 这一篇博客,这个博客对GIS瓦片这些计算公式写的十分详解了,我这里就用代码简单的实现一下(同理精度float存在一定精度的问题)

    • 双曲函数,因为Mathf里面好像没有双曲函数Sinh,所以这里简单写一个双曲函数的计算
    	/// <summary>
        /// 双曲函数
        /// </summary>
        /// <returns></returns>
        private float Sinh(float x)
        {
            float ax = (Mathf.Exp(x) - Mathf.Exp(-1.0f * x))/2;
            return ax;
        }
    
    • 根据经纬度获取目标瓦片位置坐标
    	/// <summary>
        /// 根据经纬度获取目标瓦片位置
        /// </summary>
        /// <param name="longtitude">经度</param>
        /// <param name="latitude">纬度</param>
        /// <returns></returns>
        private Vector2 CalculateTileIndex(double longtitude,double latitude)
        {
            int x = (int)(Mathf.Pow(2, ZoomLevel - 1) * (longtitude / 180 + 1));
            int y = (int)(Mathf.Pow(2, ZoomLevel - 1) * (1 - Mathf.Log((Mathf.Tan(Mathf.PI * (float)latitude / 180) + 1/Mathf.Cos(Mathf.PI * (float)latitude / 180)), 2.7182818f) / Mathf.PI));
            return new Vector2(x, y);
        }
    
    • 根据瓦片编号获取经纬度信息
    	/// <summary>
        /// 根据瓦片编号获取经纬度信息
        /// </summary>
        /// <param name="xtile">瓦片x编号</param>
        /// <param name="ytile">瓦片y编号</param>
        /// <returns></returns>
        private Vector2 CalculateLongAndLa(int xtile,int ytile)
        {
            float n = Mathf.Pow(2, ZoomLevel);
            float longtitude = xtile / n * 360.0f - 180.0f;
            float latitude = Mathf.Atan(Sinh(Mathf.PI * (1 - 2 * ytile / n))) * 180.0f / Mathf.PI;
            return new Vector2(longtitude, latitude);
        }
    
    • 经纬度坐标转像素坐标
    	/// <summary>
        /// 经纬度坐标转像素坐标
        /// </summary>
        /// <param name="longtitude">经度</param>
        /// <param name="latitude">纬度</param>
        /// <returns>像素坐标值</returns>
        private Vector2 LongAndLaToPixel(float longtitude,float latitude)
        {
            float pixelX = (longtitude + 180 / 360) * Mathf.Pow(2, ZoomLevel) * 256 % 256;
            float pixelY = (1 - Mathf.Log(Mathf.Tan(latitude * Mathf.PI / 180) + 1 / (Mathf.Cos(latitude * Mathf.PI / 180)), 2.7182818f) / (2 * Mathf.PI)) * Mathf.Pow(2, ZoomLevel) * 256 % 256;
            return new Vector2(pixelX, pixelY);
        }
    
    • 根据瓦片上某一点的像素坐标得到经纬度坐标
    	/// <summary>
        /// 根据瓦片上某一点的像素坐标得到经纬度坐标
        /// </summary>
        /// <param name="tileX">瓦片X编号</param>
        /// <param name="tileY">瓦片Y编号</param>
        /// <param name="pixelX">目标点X像素坐标</param>
        /// <param name="pixelY">目标点Y像素坐标</param>
        /// <returns></returns>
        private Vector2 PixelToLongAndLa(float tileX,float tileY,float pixelX,float pixelY)
        {
            float longtitude = (tileX + pixelX / 256) / (Mathf.Pow(2, ZoomLevel)) * 360 - 180.0f;
            float latitude = (Mathf.Asin(Sinh(Mathf.PI - 2 * Mathf.PI * (tileY + pixelY / 256) / (Mathf.Pow(2, ZoomLevel))))) * 180 / Mathf.PI;
            return new Vector2(longtitude, latitude);
        }
    

    然后可以简单以0级瓦片和1级瓦片验算下效果对不对就行了。

    基本流程

    • 根据摄像机与地球球心(这里我是用一个标准的球形代替了地球)的距离确定当前的瓦片等级
    • 从摄像机位置朝地球球心发射一条射线,获取hit point三维坐标,转化位经纬度坐标再根据瓦片等级转化为得到该位置的目标瓦片位置
    • 根据目标瓦片位置坐标获取其上下左右斜上斜下8个位置的瓦块信息并加载出来,加载结束。

    瓦片资源包

    感觉最难的就是瓦片地图资源的获取,因为没啥经验当时找了好久才找到,也算花了不少人力物力吧,这里(提取码:7mk3 ,里面含一个中国12级的TMS瓦片和全球9级卫星TMS瓦片,以及Google road map14级瓦片,不过Google road map9-14级不太全,只有一部分,全放进去了)分享出来我弄到的瓦片地图资源,有需要的朋友可以自取,文件内容比较大(顺便也给文章点个赞吧),需要花一点时间下载。

    在这里插入图片描述

    展开全文
  • 3D数字展厅 | 线上展会应用方案

    千次阅读 2020-09-04 17:18:55
    随着数字科技的发展,3D数字展厅、线上展会、智慧展馆的展示方式开始多样化,商迪3D专注于VR/AR数字展厅,智慧展厅,云展厅和线上展厅的建设和内容设计,vr展厅设计是需用“3D虚拟现实平台软件"开发设计与"互联网...
  • 3D数学读书笔记——3D中的方位与角位移

    千次阅读 多人点赞 2014-05-12 14:35:58
    关于3D中的方位与角位移的相关知识
  • 如有系统损坏能及时报修,更好的保障消防设施的完好、提供精准的设备信息,也能实现现场人员、地理方位、实景数据等集成,并实时动态更新,现场智慧人员借助HTML5 Canvas开发的3D引擎精细化数据,能实现精准做战,...
  • 博主今天想和大家分享的是Unity3D中的动态阴影,昨天博主重温了一下自己喜欢的游戏《古剑奇谭2》,发现更新后游戏增加了三个免费的DLC。这三个DLC主要是对主线剧情的一个扩展,博主这里最喜欢的是可控角色初七。从...
  • Unity3D中的数据存储

    千次阅读 2015-02-03 17:31:05
    [Unity3D]Unity3D游戏开发之数据... 首先我们来看两段Unity3D中实现数据读写的简单代码吧: //保存数据 PlayerPrefs.SetString("Name",mName); PlayerPrefs.SetInt("Age",mAge); PlayerPrefs.SetFloat("Grade",mGr
  • unity3d中的网格

    千次阅读 2018-03-14 10:12:35
    游戏的三维物体使用网格来描述自身的形状和尺寸,一个模型由若干个网格面组成,每个面由若干个三角形组成.图1 三维网格,正方形,球形可以这么说,游戏的三维物体由三维网格组成
  • Unity3D游戏开发之Unity3D中的动态阴影

    千次阅读 2014-12-16 15:55:55
     博主今天想和大家分享的是Unity3D中的动态阴影,昨天博主重温了一下自己喜欢的游戏《古剑奇谭2》,发现更新后游戏增加了三个免费的DLC。这三个DLC主要是对主线剧情的一个扩展,博主这里最喜欢的是可控角色初七。从...
  • 一、单位,比例统一在建模型前先设置好单位,在同一场景会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例。统一单位为米。二、模型...
  • 3D max模型导入unity 3D中注意事项

    万次阅读 2016-07-13 22:30:48
    在建模型前先设置好单位,在同一场景会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例。统一单位为米。   二.模型规范 ...
  • 随着IT信息技术和移动端的发展,Html5+3D(Webgl)技术... 对工厂园区的园区、大楼、生产车间、生产设备、监控设备等进行3D建模,实现物理工厂园区到3D虚拟工厂园区的数字化、可视化的转化。使工厂生产更为流畅,减少...
  • Unity3d数字模型制作规范 本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是...一个归类清晰、面节省、制作规范的模型文件对于程序控制管理是十分必要的。   
  • 3dmax:在3dmax,优化和导入CAD图纸的详细攻略 目录 3dmax的导入与导出 导入 另存为与导出 3damx,优化和导入CAD图纸的详细攻略 1、基本删除 2、保存内部单个CAD图纸 3、全部视图归零 4、在3d...
  • 解析OBJ模型并将其加载到Unity3D场景

    万次阅读 热门讨论 2015-11-23 10:19:54
    今天想和大家交流的是解析obj模型并将其加载到Unity3D场景,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • echartGLoption各3D配置属性配置详解

    千次阅读 2018-04-02 18:39:53
    最近,接手一个项目需要实现echart各种3D图表样式,我还是一如既往的从研究echart配置项各属性含义开始入手,由于自己需要实现的是柱状图效果,类似地图3D 效果在这里不展示,直接进入自己所研究的内容1、grid...
  • 3D点云综述

    万次阅读 多人点赞 2020-01-02 19:57:51
    24页3D点云综述,共计214篇参考文献,涵盖3D形状分类,3D目标检测和跟踪,3D点云分割方向和大数据集。
  • 3D数学基础--3D中的方位与角位移(1)

    千次阅读 2015-06-29 11:35:18
    方位基本概念介绍1,什么是方位?直观地说,方位主要描述的是物体的朝向。比如:我们知道的向量,它...2,方位和角位移关系:我们知道不能用绝对坐标来描述物体的位置,要描述物体位置,必须把物体放在特定的参考系
  • unity3d中Debug.Log函数浮点精度问题

    千次阅读 2017-07-06 15:39:55
    原文地址:http://blog.sina.com.cn/s/blog_5d76edd80101iwib.html经常用Debug.Log函数来打印程序的变量值,发现它...google了一下,确认是Debug.Log函数的问题,它在把Vector转成字符串的时候截断了。 用下面的方法
  • 经常用Debug.Log函数来打印程序的变量值,发现它显示的小数位数只有一位。  这个实在太低了,像0.0xxxxx这种小数就成了0.0!!!!!!  这误差太大了也!  google了一下,确认是Debug.Log函数的问题,它在把Vector转...
  • Unity 3D 开发需要掌握的数学基础知识概要整理(一) 学习目的: 一、3D 数学基础知识介绍 二、Unity 的几种常用坐标系 三、向量的基本概念 Unity 3D 开发需要掌握的数学基础知识概要整理(一) ...
  • 在Unity3D中利用描点法画圆

    千次阅读 2018-10-20 09:54:31
    PS:for循环,i++可以改成 i=i+5等等,这样便能画出一个虚线的圆   1.利用LineRender画圆,下面是以物体position为圆心,半径为R,在xz平面上的画圆 public GameObject CirclePoint;//圆心 public ...
  • 无人驾驶3D 目标检测技术

    千次阅读 2020-02-16 09:52:40
    2020 年 2 月 12 日 14:33...在这样的背景下,我们决定将项目目标放在 Lyft 自动驾驶汽车的 3D 目标检测上。 为什么至今还没有无人驾驶汽车? 自动驾驶汽车是现代社会讨论最多的的技术之一。尽管许多公司都声称他...
  • 你应该知道,这个特性早已应用在苹果表和MacBook产品,名字叫Force Touch。它给用户交互添加了全新的维度! 如果你对Force Touch为什么被重命名为3D touch感到奇怪,并不只有你有这样的疑惑。在克雷格·费德里吉...
  • unity3d烘焙教程 持续更新【2020】

    万次阅读 多人点赞 2019-08-20 11:06:12
    很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,...
  • [Unity3D]清理material无用的的property

    千次阅读 2015-07-10 11:22:34
    摘要unity3d中的material再更换次shader后,property的信息会残留,这会导致material select depedency的时候,发现其引用了根本没用到的texture(原因是曾经用过的shader的property没有被去掉),这里提供了一...
  • 今天我们谈一下,个人的核心竞争力,每个从事IT的人,都必须有自己的核心竞争力,有了这个,你才能有不可替代性,才可以在就业,游刃有余,人的精力是有限的,不可能让自己在各个方面都有很深的研究和了解,但必须...
  • 视频3D人体姿态估计(3D human pose estimation in video) 解读Facebook AI Research in CVPR2019: 《3D human pose estimation in video with temporal convolutions and semi-supervised training》 这里写自...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,881
精华内容 27,552
关键字:

如何确定3d的中数