zoukankan      html  css  js  c++  java
  • U3d开发个人总结

    1.  坐标系的分类和转化:

      1. — World Space(世界坐标):标准的D3D左手坐标系,旋转方向是左手法则包括法向量方向,背面剔除逆时针的。我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在transform.position可以获得该位置坐标。例如:MainCamera的坐标系是  (0,0,-10);

          2. — Screen Space(屏幕坐标,鼠标坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),

      3. — 绘制GUI界面的坐标系或NGUI:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

      4. — ndc space, ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,屏幕中心为[0.5,0.5],z值保留了透视投影中的正值但是值的大小是世界坐标系的值。不同于D3D中的[-1,-1,0]到[1,1,1],也不同于OGL中的[-1,-1,-1]到[1,1,1]。

      

      世界坐标→屏幕坐标:

      camera.WorldToScreenPoint(transform.position);

      屏幕坐标→世界坐标

      camera.ScreenPointToWorld(transform.position);

      屏幕坐标→视口坐标:

      camera.ScreenToViewportPoint(Input.GetTouch(0).position);  这样可以将屏幕坐标转换为视camera为场景中的camera对象。

      视口坐标→屏幕坐标:

      camera.ViewportToScreenPoint();

      视口坐标→世界坐标:
      camera.ViewportToWorldPoint(); 

    2.  坐标获取(鼠标点击或者手指触摸位置点的坐标)

       世界坐标点(3d游戏三维坐标)

        通过射线技术获取三维坐标,代码如下:

          Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
          RaycastHit hit;
          if (Physics.Raycast (ray, out hit))

           {
             //碰撞信息保存在hit中,如:
             //hit.point 碰撞点
             //hit.collider.gameObject //碰撞对象
           }

         

      屏幕坐标点(平面游戏二位坐标)

        Input.mousePosition

     3. U3D对象分类、组成和操作

                 分类:在U3d hierarchy 面板中出现的对象属于GameObject对象。通俗的说,就是当前场景(ps: 在游戏开发过程中,一个游戏可能有多个场景,通过切换场景达到切换关卡的效果)中出现的元素。组成场景的元素,也就是gameobject对象分为三类,一个是地形(2d开发中相当于背景),一个是角色模型(2d中相对于人物图片,术语为精灵),还一个是环境,如灯光、摄像机之类的。这与实际电影拍摄需要环境,演员,道具是一样的道理。

          

         组成: 一个GameObject对象由一个或多个组件构成,比如,一个对象需要受重力加速度的影响,需要添加 RigidBody 组件,如果该gameobject需要受玩家控制,就需要Script组件,通过代码控制游戏对象。通过GetComponent<xx>()方法获取绑定在GameObject对象上面的组件。

           

      GameObject的基本操作:

        1. GameObject.CreatePrimitive (PrimitiveType.xx);  //创建一个u3d固有对象,如方块,球,胶囊体等等

        2. GameObject.Instantiate (xx);   //实例化一个自定义的对象,预制对象

        3. GameObject.Find("xx")   //查找一个游戏中存在的对象

        4. GameObject.Destroy(xx);  //摧毁游戏中存在的对象,还有一个重载 GameObject.Destroy(xx,delaytime),即延迟多久摧毁游戏对象。

    4.  基本游戏对象的操作。

        1. 直接操作

          gameObject.transform.translate(Vector3.forward * Time.delaytime * speed);  // 控制角色的前后左右移动

          gameobject.transform.rotate(Vector3.up * Time.delayTime * speed);   //控制角色的旋转,通过左手定则(大拇指指向(如: Vector.up 就是向上)标记的方向, 四个手指弯曲的方向就是旋转的方向)

          gameobject.transform.localScale = new Vector3(x,y,z)  表示xyz三个方向是缩放

               2.通过绑定Character Controller组件进行控制

           CharacterController controller = gameobject.getComponent<CharacterController>();  //获取对象自身绑定的 角色控制器对象

           //通过射线技术在鼠标点击的位置

           Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
             RaycastHit hit;
             if (Physics.Raycast (ray, out hit))

              {
             //获取物体移动的向量 = 鼠标点击空间坐标 - 物体当前空间坐标

             Vector direcPoint = Vector3.ClampMagnitude (hit.point  - gameObject.transform.position, 0.3f);

             controller.move(direcPoint );
            }

        3. 通过绑定Nav Mesh Agent组件进行空间寻址

          通过此方式可以通过点击屏幕位置,角色对象会自动规划一条路线并进行移动,而制作重点在于bake(烘焙地图)。

          1》   在菜单栏Window->Navigation中调出烘焙设置窗口,如下:

          

         2.》 在Hierarchy窗口中选择相关的gameobject对象分别进行烘焙处理,比如说:(胶囊体为控制角色,长方体为静止物体,胶囊体不能从中穿过或从上跳过)

           

          则需要对平面和长方体进行烘焙处理,保证能为胶囊体的运动自动开辟出一条路线,烘焙的关键在于Navigation Area参数的选择

          Plane的烘焙设置:

          

        

             Cube(长方体)

                    

        3》 在Capsule(胶囊体)上添加组件Script组件,选择相应的脚本文件进行控制。      

          Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
          RaycastHit hit;
          if (Physics.Raycast (ray, out hit))

           {
            GameObject hitObj = hit.collider.gameObject;
            if (hitObj.name == "Plane")

             {
              Vector3 endpoint = hit.point;
              agent.SetDestination (endpoint);
            }

          }

        ps:  Vector3 是一个三维对象类,既可以表示一个三维坐标点,又可以表示一个空间向量。

               参考资料:http://blog.csdn.net/blues1021/article/details/49009951

          

     

          

        

       

      

        

  • 相关阅读:
    使用JAVA API 解析ORC File
    spark Graph 的PregelAPI 理解和使用
    流程图引擎
    JMX
    Spring走向注解驱动编程
    java@ 注解原理与使用
    Maven打包SpringBoot
    Java根据实体快速生成对象
    VBA基础出发
    “嗝嗝老师”
  • 原文地址:https://www.cnblogs.com/android-er/p/6015473.html
Copyright © 2011-2022 走看看