zoukankan      html  css  js  c++  java
  • Unity3D学习笔记(五):坐标系、向量、3D数学

    Unity复习

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    public class Question : MonoBehaviour {
        int a = 100;
        Transform target;
        #region Question
        // 1、有哪些事件函数
        // Awake Start Update FixedUpdate LateUpdate OnEnable OnDisable OnDestroy OnGUI
        // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col)
        // OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o)
    
    
        // 2、如何查找场景中游戏物体
        // GameObject obj = GameObject.Find("ObjName/ChildObjName")
    
    
        // 3、将自己设置为 找到的那个游戏物体的 父物体
        // obj.transform.parent = transform;
    
    
        // 4、挂载脚本的必要条件
        // 继承MonoBehaviour 、所有的代码无错误、文件名和类名一致、不能是抽象类
    
    
        // 5、物体的移动、旋转
    
    
        // 改变位置的移动
        // 1)、往世界的前方移动
        // transform.position += Vector3.forward;
        // 2)、往自身的前方移动
        // transform.position += transform.forward;
    
    
        // API移动
        // 1)、往世界的前方移动
        // transform.Translate(Vector3.forward, Space.World);
        // 2)、往自身的前方移动
        // transform.Translate(transform.forward, Space.World);
        // transform.Translate(Vector3.forward, Space.Self);
    
    
        // 使物体旋转  (自身)
        // 改变欧拉角的形式 来旋转
        // 世界的Y轴转
        // transform.eulerAngles += Vector3.up;
        // 自身的Y轴转
        // transform.eulerAngles += transform.up;
    
    
        // API
        // 世界的Y轴转
        // transform.Rotate(Vector3.up, Space.World)
        // 自身的Y轴转
        // transform.Rotate(transform.up, Space.World)
        // transform.Rotate(Vector3.up)
    
    
        // 使物体旋转  (绕其他物体)
        // GameObjet obj; (被绕的游戏物体)
        // 绕Y轴转(世界的)
        // transform.RotateAround(obj.transform.position, Vector3.up, 1);
        // 绕Y轴转(被绕的游戏物体)
        // transform.RotateAround(obj.transform.position, obj.transform.up, 1);
    
    
        // 6、如何生成、销毁游戏物体?
    
    
        // 生成(需要有预制体)  BulletPrefab
        // public GameObject bulletPrefab;    // 引用资源中的预制体
        // Transform spawnTrans;   // 生成的位置及方位
        // Instantiate(bulletPrefab, spawnTrans.position  /*位置 Vector3*/, Quaternion.identity /*spawnTrans.rotation*/ /*方位 Quaternion*/)
    
    
        // 销毁
        // 不要循环调用
        // 销毁当前的脚本组件
        // 销毁的时机: 在 Update 之后,渲染之前
        // Destroy(this);
        // 销毁当前的游戏物体
        // Destroy(gameObject);
        // 5秒以后销毁 当前脚本组件
        // Destroy(this, 5); 
    
    
        // 7、物体之间发生碰撞的必要条件
        // 1)、双方都必须有碰撞器 2)、至少有一个非休眠的刚体 3)、如果一方是运动学刚体,另一个必须是非运动学刚体
        // 触发的事件函数  双方的
        // OnCollisionEnter(Collision col) OnCollisionStay(Collision col) OnCollisionExit(Collision col)
        // 如果勾选了 IsTrigger 会?    在所有的 Collider上
        // 会变成触发器,不会再有碰撞效果了
    
    
        // 什么情况下会触发 触发器
        // 1)双方都有碰撞器,至少有一方勾选了IsTrigger 2)、至少有一个有刚体
        // 触发的事件函数  双方的
        // OnTriggerEnter(Collider o) OnTriggerStay(Collider o) OnTriggerExit(Collider o)
        #endregion
        // Use this for initialization
        void Start () {
            Destroy(this);
            a = 200;
                       
           }
           
           // Update is called once per frame
           void Update () {
                  
           }
    }

    发生碰撞(触发)的必要条件

     
    3D数学
    3D数学:利用数学的方式解决计算机几何的问题。
    坐标系:
    一维坐标系(线性坐标系):线性变化
    二维坐标系(笛卡尔2D坐标系):笛卡尔发明的
    坐标点的分量,代表坐标点距离轴的距离(相当于轴的偏移量)
    三维坐标系
    标量:只有大小
    矢量:大小和方向,坐标系(向量),物理学(力)
     
    向量:
    概念:有大小有方向的矢量放在坐标系中就可以称之为向量。
    特点:没有位置的概念,放在哪都是这个向量(仅表示方向和大小,可以平行移动)。
     
    两个坐标系相加无意义
    两个坐标系相减:A(3,1) - B(2,0) = c(3-2,1-0) = c(1,1)
    坐标大写,向量小写
    数学计算:各分量分别相减
    几何意义:得到的是一个新的向量,这个向量由B点指向A点,大小是A点和B点之间的距离。
    向量方向:从减数指向被减数
     
    坐标和向量相加:A(1,1) + b(1,1) = C(2,2)
    数学计算:各分量分别相加
    几何意义:得到的是一个新的坐标位置,由A坐标点,沿着b向量的方向,移动b向量的长度的距离,得到的新坐标。
    A坐标,沿着b向量的方向,移动b向量的长度,得到C坐标
     
    向量和向量相加有意义
    向量和向量相加:a(1,1) + b(2,1) = c(3,2)
    数学计算:各分量分别相加
    几何意义:得到的是一个新的向量,让ab向量首尾相连,得到c向量,从a向量的起点指向b向量的终点。
    向量相加,平形四边形的对角线
    坐标:transform,position
    向量:new Vector3(0,0,1)或Vector3.forward
     
    向量和向量相减:a(1,1) - b(1,-1) = c(0,2)
    数学计算:各分量分别相减
    几何意义:得到的是一个新的向量,让ab向量起点重合,得到c向量,从减数向量的终点指向被减数向量的终点。
    已知入射光线l,和法向量n,求反射光线r。r = l + 2n
     
    向量和标量相乘:a(1,1) * 2 = c(2,2)
    数学计算:标量分别乘以各分量
    几何意义:得到的是一个新的向量,让原向量在原有方向的基础上,让原向量进行了标量倍数的缩放。
     
    勾股定理:直角三角形中,斜边的平方等于两条直角边的平方和。
    向量的各分量有什么几何意义:描述这个向量在各个轴向上的投影的长度
    向量的模(模长):向量的长度,向量的各分量的平方和再开方
    零向量(0,0,0):长度为0,方向任意(模长为零,没有方向)
    单位向量:模长为1的向量叫单位向量。
    用单位向量表示方向,用标量表示速度,用标量的缩放可以控制速度。
     
    向量的标准化:把一个非单位向量变成一个单位向量
    让这个向量的各分量分别除以模长(根号2=1.414 根号3=1.732 根号5=2.236)
    不是单位向量的向量让各分量分别除以这个向量的模长,就变成了原有方向不变的单位向量。
    我们把不是单位向量的向量变成单位向量的过程叫向量的标准化。
    向量的标准化后的模长为1
    复杂写法

    简单写法,用normalized函数

     
    作业1:Normalized和normalized区别
    共同点:实现规范化,让一个向量保持相同的方向,但它的长度为1.0,如果这个向量太小而不能被规范化,一个零向量将会被返回。
    不同点:
    Vector3.normalized的特点是改变当前向量,也就是当前向量长度是1
    Vector3.Normalized的特点是当前向量是不改变的并且返回一个新的规范化的向量;
    magnitude:取标准化后的模长
     
    负向量:让一个向量* -1,得到一个新的向量,新的向量和原向量互为负向量(成对出现)。
     
    向量和向量的乘法:
    点乘(内积)
    叉乘(外积)
    transform.Translate(Vector3 dir , Space space):同理适用于transform.Rotate()
    1、当第一个参数是Vector3.forward的时候,第二个参数如果不填或者填self,结果是沿着自身的前方移动;如果填world,结果是沿着世界的前方移动
    2、当第一个参数是Transform算出来的时候,第二个参数必须填world,否则就乱了
    这样写会转两次方向
     
    作业2:做一个第一人称视角漫游,加个摄像机
     
    Unity场景切换
    同步加载(当前场景会卡主)和异步加载(加载新的场景,不阻塞当前场景的运行)
    新建两个场景
    1、把需要切换的场景全部添加到Build Setting
    2、添加命名空间using UnityEngine.SceneManagement;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;   // 场景管理
    public class MenuControl : MonoBehaviour {
        public float w = 100;
        public float h = 50;
           // Use this for initialization
           void Start () {
                  
           }
           
           // Update is called once per frame
           void Update () {
                  
           }
        void OnGUI()
        {
            //  w h    Sceen.Width Sceen.Height       x =  (Screen.width - w)/2    y = (Screen.height - h)/2
            float x = (Screen.width - w) / 2;
            float y = (Screen.height - h) / 2;
            if (GUI.Button(new Rect(x, y, w, h), "开 始 游 戏"))
            {
                // 切换到 游戏场景    同步加载(当前场景会卡主)   异步加载(不会阻塞当前场景的运行)
                SceneManager.LoadScene("GameScene");//可以添加Build Setting里的字符串
            }
            if(GUI.Button(new Rect(x, y + 2 * h, w, h), "退 出 游 戏"))
            {
                Application.Quit();  // 退出游戏 发布以后才有作用 编辑器状态无效
            }
        }
    }
  • 相关阅读:
    Mongodb 利用mongoshell进行数据类型转换
    利用Cordova开发移动应用程序
    mongodb Capped Collections 固定集合
    ubuntu desktop使用中遇到的问题
    php session 锁机制和基本安全设置
    mongodb update
    mongodb query
    mongodb Insert 、 remove 、操作原子性(atomicity)
    mongodb index(索引)
    mongodb笔记 getting started
  • 原文地址:https://www.cnblogs.com/vuciao/p/10362800.html
Copyright © 2011-2022 走看看