zoukankan      html  css  js  c++  java
  • unity3D 使用欧拉角控制视野注意点

    变量声明:

    1  public PlayerInput p;                  //表示控制代码用来获得用户是否按下
    2     public float rotateSpeed = 50f;              //旋转速度
    3     private GameObject playerHandle;        //游戏物体的父节点
    4     private GameObject cameraHandle;      //相机节点
    5     public float euler=15;                          //X轴的初始旋转角度
    View Code

    在学习中,使用欧拉角控制物体视野左右平移没有什么可注意的简单一句就可以

     playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);

    让主角视野上下移动并且设定一个范围时,比如旋转角在【-40,30】之间,则

    1  cameraHandle.transform.Rotate(Vector3.right, -p.Dup2 * rotateSpeed * Time.deltaTime);
    2         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(cameraHandle.transform.localEulerAngles.x,-40,30), 0, 0);
    View Code

    如此做是不是就可以完成了?

    大错特错!

    只有在【0,30】角度变换时运行效果如你所愿,但旋转角度一旦小于0,结果会出乎意料直接变成30.知道为什么吗?

    在unity中旋转角(个人理解,错了请指出。)只能是正数。什么意思呢?

    我们通过cameraHandle.transform.localEulerAngles.x 获得的X轴旋转角度只会是正数。那么负数如何表示呢?在unity中当其值为负数时,会再加360°,自然转换为正数。因为-30°效果和330°一样。所以当我们cameraHandle.transform.localEulerAngles.x获得-40时,其实获得到的是320,自然会转换成30(Mathf.Clamp())。

    解决方法:

    很简单,既然不能直接获取localEulerAngles.x的负数值,那么我们直接自定义一个Float值在每帧进行旋转角度计算。如下:

    1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
    2         euler = Mathf.Clamp(euler, -40, 30);
    3         cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
    View Code

    如果简写成如下:

    1  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
    2         //euler = Mathf.Clamp(euler, -40, 30);
    3         //cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
    4         cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(euler, -40, 30), 0, 0);
    View Code

    虽然看起来简洁,其实实际运行不好,因为euler的值,在我们一直按下旋转键时,会一直变化,只是transform.localEulerAngles值只会在【-40,30】,当euler过大,等于100时,当我按下向下视角时只有等到euler的数值变为小于30,才会发生变化,反之亦然。用户体验太差。

    小白自我记录,有错之处请多包涵。

  • 相关阅读:
    python 进程
    python 网络编程
    Tensorflow学习教程------参数保存和提取重利用
    Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_利用训练好的模型进行分类
    Tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_训练模型
    Tensorflow学习教程------tensorboard网络运行和可视化
    Tensorflow学习教程------过拟合
    Spring的@Value注解为静态变量赋值
    Linux使用scp远程拷贝使用ssh免密登录
    Mysql升级5.7.10后GROUP BY语句出错解决方法
  • 原文地址:https://www.cnblogs.com/unknown6248/p/10964922.html
Copyright © 2011-2022 走看看