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

news2024/11/14 22:02:03

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

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

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

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

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

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

 对应调整

 调整结果,满足要求

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

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

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

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

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

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

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

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Π,修改后终于达成预期效果

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.角色移动

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

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

Vector3 direction = (Vector3.forward * vector3.Vertical + Vector3.right * vector3.Horizontal)* speed * Time.fixedDeltaTime;

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

结果非常成功

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

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);//脑袋单独做,无所谓 磕头 转圈 歪脑袋

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1539440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark与flink计算引擎工作原理

Spark是大批量分布式计算引擎框架&#xff0c;scale语言开发的&#xff0c;核心技术是弹性分布式数据集&#xff08;RDD&#xff09;可以快速在内存中对数据集进行多次迭代&#xff0c;支持复杂的数据挖掘算法及图形计算算法&#xff0c;spark与Hadoop区别主要是spark多个作业之…

Mac 搜索工具比对 ProEverything ProFind DFind 等

对比 Windows的everything用习惯了&#xff0c;其他的搜索追之不及啊。Mac上对比了一圈&#xff0c;简单总结一下。 比较项ProEverythingProFindDFindEasyFindScherlokk是否索引方式索引遍历遍历遍历待试用费用收费 推荐88元终身版收费收费免费待试用是否可全盘全盘无法查找影…

pytest简介以及命令行执行

pytest简介以及安装 pytest简介导入第三方库修改工具类 pytest命令方式执行函数执行pytest中的参数详解 pytest简介 pytest有很多强大的插件 pytest-html &#xff08;生成html格式的自动化测试报告&#xff09; pytest-xdist &#xff08;测试用例分布式执行&#xff0c;多cpu…

利用MSF生成php,windows,Linux三类木马

一、什么是msfvenom&#xff1f; msfvenom是msf中的一个独立的负载生成器&#xff0c;它可以利用msf中的payloads和encoders来生成各种格式的木马文件&#xff0c;并在目标机上执行&#xff0c;配合meterpreter在本地监听上线。msfvenom是msfpayload和msfencode的结合体&#x…

基础:TCP四次挥手做了什么,为什么要挥手?

1. TCP 四次挥手在做些什么 1. 第一次挥手 &#xff1a; 1&#xff09;挥手作用&#xff1a;主机1发送指令告诉主机2&#xff0c;我没有数据发送给你了。 2&#xff09;数据处理&#xff1a;主机1&#xff08;可以是客户端&#xff0c;也可以是服务端&#xff09;&#xff0c…

SOPHON算能服务器SDK环境配置和相关库安装

目录 1 SDK大包下载 2 安装libsophon 2.1 安装依赖 1.2 安装libsophon 2 安装 sophon-mw 参考文献&#xff1a; 1 SDK大包下载 首先需要根据之前的博客&#xff0c;下载SDK大包&#xff1a;SOPHON算能科技新版SDK环境配置以及C demo使用过程_sophon sdk yolo-CSDN博客 …

Mysql之索引存储原理

在介绍索引实现之前&#xff0c;我们先来了解下几种树的数据结构&#xff1a; 一、二叉搜索树 二叉搜索树有以下性质&#xff1a; 1.每个节点有一个关键字 2.左右孩子至多有一个。 3.关键字大于左孩子&#xff0c;小于右孩子。 正因为二叉搜索树的特性&#xff0c;所以这种数…

ConvNext详解

1.ConvNext v1 Transformer在视觉领域大放异彩&#xff1f;以后卷积怎么办呢&#xff1f;facebook 的研究人员就探究了这样一个问题。首先&#xff0c;SwinTransformer采用分层和窗口的设计&#xff0c;取得了非常好的性能。这说明卷积这种窗口的设计也是有用的&#xff0c;因此…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌&#xff1a;每个人抓的牌放到哪里&#xff1a; 源码具体实现cardcardsTest 个人简介&#xff1a;努力学编程 每日鸡汤&#xff1a;stay foolish,stay hungry-史蒂芬.乔布斯斯…

租用阿里云2核2G服务器配置报价,61元和99元

阿里云2核2G服务器配置优惠价格61元和99元&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff0c;99元服务器是ECS云服务器经济型e实例2核2G、3M固定带宽、40G ESSD entry 系统盘。活动 aliyunfuwuqi.com/go/aliyun 阿里云服务器网aliyunfuwuqi.com根据上面的官…

武汉星起航:引领卖家征战亚马逊海外市场,树立跨境电商新标杆

在风起云涌的跨境电商大潮中&#xff0c;武汉星起航电子商务有限公司凭借其深厚的行业经验和卓越的企业实力&#xff0c;始终站在市场的最前沿&#xff0c;为国内新手卖家铺就了一条通往亚马逊海外市场的成功之路。作为国内首批进入跨境电商市场的企业之一&#xff0c;星起航不…

心脏滴血漏洞详解(CVE-2014-0160)

参考链接&#xff1a;心脏滴血漏洞利用&#xff08;CVE-2014-0160&#xff09;_cve-2014-0160漏洞禁用443端口-CSDN博客 目录 OpenSSL简介 漏洞原理 影响版本 漏洞复现 漏洞利用 修复方案 OpenSSL简介 OpenSSL是一个开放源代码的软件库包&#xff0c;提供了一组加密和认…

安捷伦Agilent N1021B差分TDR/TDT探头

181/2461/8938产品概述&#xff1a; N1021B 是一款符合人体工程学设计的手持式探头&#xff0c;可在缺少常用同轴高频连接器的情况下将 TDR/TDT 模块连接到印刷电路板&#xff08;PCB&#xff09;和元器件。 内置滚轮可以调节差分探针的间距&#xff0c;以便与间距为零到典型 …

力扣题库88题:合并两个有序数组(c语言)

解法&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1m-1;int l2n-1;int l3mn-1;while(l1>0&&l2>0){if(nums1[l1]>nums2[l2]){nums1[l3--]nums1[l1--];}else{nums1[l3--]nums2[l2--];}}while(l2>0)…

数字孪生底层技术框架

数字孪生是一种将现实世界中的物理实体、过程或系统数字化并映射到计算机模型中的方法。它在数学建模与仿真方面具有重要作用&#xff0c;为了实现数字孪生&#xff0c;以下是一些底层技术框架和方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业…

LinuxYUMVimg++/gccgdbGit使用

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;前面的文章给大家介绍了Linux的基础命令和权限&#xff0c;学会了命令行的模式使用Linux&#xff0c;今后要开始在Linux上写代码了&#xff0c;在这篇文章将介绍YUM、vim、gdb、git等常用的工具。 先来看看Linux如何安装软…

JavaEE 初阶篇-多线程属性和方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 创建线程对象并命名 2.0 线程属性 2.1 线程属性 - ID 2.2 线程属性 - 名称 2.3 线程属性 - 后台线程 2.4 线程属性 - 判断 PCB 是否存活 2.5 线程属性 - 终止线程…

数据库管理-第163期 19c重建ADG的两个方法(20240323

数据库管理163期 2024-03-23 数据库管理-第163期 19c重建ADG的两个方法&#xff08;20240323&#xff09;1 ORA-081032 新办法1 关闭MRP2 恢复备库3 其他操作4 启动备库5 启动MRP 3 老办法4 预告总结 数据库管理-第163期 19c重建ADG的两个方法&#xff08;20240323&#xff09;…

Stompy:一款针对时间戳的Timestomp工具

关于Stompy Stompy是一款功能强大的时间戳管理工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员能够轻松对指定文件或目录的时间戳进行修改和操作。该工具基于PowerShell开发&#xff0c;并且支持对目标目录中的所有文件执行递归时间戳操作。 功能介绍 1、修改独立…