unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难,而且需要自己写。

1.相机可以转xy两个位置,可以点头和转圈。注意这里有一个if判断(后面返回来发现了这些问题)

2.角色不能点头,只能转圈

难得是移动方向,因为移动方向(位置)和转向是相关联的

3.先做相机的移动,相机除了和角色做同向的水平转动,还要以角色为锚点做圆弧运动。

3.1移到背后,z应该是负值,这东西再着急也没用,最好的办法就是一步一步做。

对应调整

调整结果,满足要求

3.2当角色和相机发生"转圈"时(绕y轴旋转),相机要已角色为轴做圆弧运动。也就是要把-4这个距离分到x轴和z轴上

确实是转了,但是转的速度是不一样的,调整转动角度用的是y角度的差值,而不是y角度的数值

把scene调成下边这样,也可以很快发现问题,现在是擦着背后和相机初始位置做圆周运动

不加距离的时候确,相机和角色确实是同朝向的,相机的朝向没问题,相机的问题有问题!不过有了俯视图这种思维问题很快应该就能解决了

如下代码后,相机确实绕着小人做圆周运动了但转速太快了

cs 复制代码
mainCamera.transform.position = model.transform.position + new Vector3(-4 * Mathf.Sin(mainCamera.transform.eulerAngles.y)+0, 0, -4 * Mathf.Cos(mainCamera.transform.eulerAngles.y));

应该是把角度和弧度给弄混了!改成弧度以后确实是同速度了

cs 复制代码
mainCamera.transform.position = model.transform.position + new Vector3(-4 * Mathf.Sin(mainCamera.transform.eulerAngles.y/180*2*Mathf.PI)+0, 0, -4 * Mathf.Cos(mainCamera.transform.eulerAngles.y / 180 * 2 * Mathf.PI));

但是相机的旋转角度有问题,并不是一直朝向小人背后

是 /360*2Π,修改后终于达成预期效果

cs 复制代码
mainCamera.transform.position = model.transform.position + new Vector3(-4 * Mathf.Sin(mainCamera.transform.eulerAngles.y/360*2*Mathf.PI)+0, 0, -4 * Mathf.Cos(mainCamera.transform.eulerAngles.y / 360 * 2 * Mathf.PI));

4.角色移动

现在存在的问题是:角色的移动是按照坐标轴的绝对方向为基准进行移动的,我需要的是按照当前朝向进行相对移动。

当前的角色移动代码如下:

cs 复制代码
Vector3 direction = (Vector3.forward * vector3.Vertical + Vector3.right * vector3.Horizontal)* speed * Time.fixedDeltaTime;

在两句之间来一个向量旋转即可,问题不大,绕着y轴转

结果非常成功

5.角色控制器的整体代码如下:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JoystickPlayerExample : MonoBehaviour
{
    public static float speed;//这个可以在unity中赋值的
    public static float rotationSpeed;
    public VariableJoystick vector3;
    public VariableJoystick quaternion4;
    public Rigidbody rb;
    public static GameObject model;//这个需要赋值,在登录过程中只赋值本地玩家自身
    public static Camera mainCamera;
    public void FixedUpdate()
    {
        //Debug.Log(variableJoystick.Vertical);
        //Debug.Log(variableJoystick.Horizontal);
        //计算方向差  正负以后再说
        Vector3 direction = (Vector3.forward * vector3.Vertical + Vector3.right * vector3.Horizontal)* speed * Time.fixedDeltaTime;
        //direction = (Vector3.forward * quaternion4.Vertical + Vector3.right * quaternion4.Horizontal) * speed * Time.fixedDeltaTime;
        //rb.AddForce(direction * speed * Time.fixedDeltaTime, ForceMode.VelocityChange);//重力体不满足条件
        direction = Quaternion.Euler(0, mainCamera.transform.eulerAngles.y, 0)* direction;//绕着y轴转--这里的前后顺序不能颠倒
        //1.模型位置
        model.transform.position = model.transform.position + direction;
        //model.transform.rotation = model.transform.rotation + rotation;
        //Debug.Log(model.GetInstanceID());
        //Debug.Log(model.transform.position);
        //实测是一直刷新的,所以我觉得相机写在这里也是可以的
        //一个模型一个相对相机位置的参数
        //2.相机位置--需要做到背后朝向
        //mainCamera.transform.position = model.transform.position+ new Vector3(0, 1.5f,-4);//其实就是maincamera,
        //mainCamera.transform.position = model.transform.position + new Vector3(-4 * Mathf.Cos(mainCamera.transform.eulerAngles.y), 1.5f, -4 * Mathf.Sin(mainCamera.transform.eulerAngles.y));
        //mainCamera.transform.position = model.transform.position + new Vector3(0,0,-4);
        mainCamera.transform.position = model.transform.position + new Vector3(-4 * Mathf.Sin(mainCamera.transform.eulerAngles.y/360*2*Mathf.PI)+0, 0, -4 * Mathf.Cos(mainCamera.transform.eulerAngles.y / 360 * 2 * Mathf.PI));//-4 分到 x轴和z轴上
        //mainCamera.transform.position = model.transform.position;
        //从这里开始是旋转
        // 获取用户的输入轴(例如:鼠标移动)


        //3.相机旋转
        float horizontal = quaternion4.Horizontal * rotationSpeed * Time.deltaTime;
        float vertical = quaternion4.Vertical * rotationSpeed * Time.deltaTime;//抬头--这里z小于零时会出现反向旋转异常

        // 创建一个绕相机上方轴旋转的Quaternion
        Quaternion horizontalRotation = Quaternion.AngleAxis(horizontal, Vector3.up);//三角函数值
        // 创建一个绕相机右方轴旋转的Quaternion
        Quaternion verticalRotation = Quaternion.AngleAxis(vertical, mainCamera.transform.right);//旋转角度和旋转轴
        Debug.Log(mainCamera.transform.eulerAngles.y);
        if (Mathf.Abs(mainCamera.transform.eulerAngles.y)<90|| Mathf.Abs(mainCamera.transform.eulerAngles.y) > 270)//整整弄了一天,欧拉角判定,rotation是弧度
        {
            //Debug.Log("负重前行");
            //Debug.Log(mainCamera.transform.eulerAngles.y);
            verticalRotation = Quaternion.AngleAxis(vertical*-1, mainCamera.transform.right);//但愿不要跳屏
        }
        //不能歪头,还有一个轴必须做成固定不动的

        // 应用这两个旋转
        mainCamera.transform.rotation *= horizontalRotation;
        mainCamera.transform.rotation *= verticalRotation;

        mainCamera.transform.eulerAngles = new Vector3(mainCamera.transform.eulerAngles.x, mainCamera.transform.eulerAngles.y, 0);
        //Debug.Log(mainCamera.transform.rotation);//实测,
        //水平拖拽是第二个位置(三角函数值0-1),竖直拖拽是第一个位置,
        //第三个位置最好是0,第四个位置最好是1


        //模型同时设置水平旋转--unity脚本这么看来还是很方便的
        //model.transform.eulerAngles= new Vector3(mainCamera.transform.eulerAngles.x, mainCamera.transform.eulerAngles.y, 0);
        //4.模型旋转(ok)
        model.transform.eulerAngles = new Vector3(0, mainCamera.transform.eulerAngles.y, 0);//脑袋单独做,无所谓 磕头 转圈 歪脑袋

    }
}
相关推荐
kyrie_sakura1 小时前
python学习笔记15 -- Anaconda,Jupyter,numpy
python·学习·jupyter·numpy
小小数媒成员3 小时前
如何优化代码适应托管内存?
游戏·unity·游戏引擎
PC2005-cloud4 小时前
Rust学习笔记:控制流——if、loop、while、for与match
笔记·学习·rust
彧azz4 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
kyrie_sakura5 小时前
python学习笔记14 -- FastAPI
笔记·python·学习·fastapi
来两个炸鸡腿5 小时前
【Datawhale2609】算子开发实战 task01-熟悉沐曦GPU
人工智能·学习·大模型
传奇开心果编程5 小时前
【Xilem 0.4 基础语法学与练】第11课(深入篇):为什么其他 Rust 框架不是一切皆设计图
学习·rust·前端框架
爱吃苹果的日记本5 小时前
JAVA十三(练习课)
java·学习
平凡シンプル6 小时前
TCP UDP 网络通信插件 SL-Uniplugin-Tcp-Udp
网络·学习·uniapp·记录
RisunJan6 小时前
【地球脉动】地球日报 · 2026-09-14(过去24小时,非头条视角)
学习