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

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

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小于零时会出现反向旋转异常// 创建一个绕相机上方轴旋转的QuaternionQuaternion horizontalRotation = Quaternion.AngleAxis(horizontal, Vector3.up);//三角函数值// 创建一个绕相机右方轴旋转的QuaternionQuaternion 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.hqwc.cn/news/562606.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unicloud 云函数 介绍及使用

普通云函数 callFunction方式云函数&#xff0c;也称之为普通云函数。 uni-app的前端代码&#xff0c;不再执行uni.request联网&#xff0c;而是通过uniCloud.callFunction调用云函数。 callFunction方式避免了服务器提供域名&#xff0c;不暴露固定ip&#xff0c;减少被攻击…

浅析扩散模型与图像生成【应用篇】(十一)——DDIBs

11. Dual Diffusion Implicit Bridges for Image-to-Image Translation 该文提出一种双扩散隐式桥&#xff08;Dual Diffusion Implicit Bridges&#xff0c; DDIBs&#xff09;方法用于图像转换&#xff0c;其最大的特点在于处理源域图像的模型和处理目标域图像的模型是彼此分…

软考 网络工程师 每日学习打卡 2024/3/22

学习内容 第9章 网络操作系统与应用服务器 本章主要讲解&#xff1a;了Windows和Linux操作系统的基础知识&#xff0c;并详细讲述了常用的各种服务器的 配置方法。这一章的内容主要是在具体操作方面&#xff0c;网络工程师要能够熟练地配置各种网络服务 器&#xff0c;排除网络…

Mysql数据库深入理解

目录 一、什么是数据库 二、Mysql基本架构图 1.Mysql客户端/服务器架构 2.客户端与服务器的连接过程 3.服务器处理客户端请求 4.一条查询SQL执行顺序 4.1连接器 4.2查询缓存 4.3解析器 4.4执行器 4.4.1预处理阶段 4.4.2优化阶段 4.4.3执行阶段 5.一条记录如何存…

基于springboot+vue的物资仓储物流管理系统(源码+论文)

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

自动驾驶感知新范式——BEV感知经典论文总结和对比(一)

自动驾驶感知新范式——BEV感知经典论文总结和对比&#xff08;一&#xff09; 博主之前的博客大多围绕自动驾驶视觉感知中的视觉深度估计&#xff08;depth estimation&#xff09;展开&#xff0c;包括单目针孔、单目鱼眼、环视针孔、环视鱼眼等&#xff0c;目标是只依赖于视…

(2023,图像放大与超分辨率,扩散,缩放堆叠表示,多分辨率混合,多尺度联合抽样)Ten 的生成能力

Generative Powers of Ten 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 4. 方法 4.1. 缩放堆叠表示 4.2. 多分辨率混合 4.3. 多尺度一致抽样 4.4. 基于照片…

飞鸟写作怎么用 #经验分享#学习方法#学习方法

飞鸟写作是一款非常好用的论文写作工具&#xff0c;它不仅能够帮助用户写作论文&#xff0c;还可以检测论文的原创性和查重率&#xff0c;是许多学生和研究人员的首选工具。 使用飞鸟写作非常方便&#xff0c;用户只需将论文复制粘贴到工具中&#xff0c;就能够快速得到论文的原…

【并发编程】锁相关公平锁和非公平锁?可重入锁锁的升级乐观锁和悲观锁版本号机制CAS 算法乐观锁有哪些问题?

目录 ​编辑 锁相关 公平锁和非公平锁&#xff1f; 可重入锁 锁的升级 乐观锁和悲观锁 版本号机制 CAS 算法 乐观锁有哪些问题&#xff1f; 锁相关 公平锁和非公平锁&#xff1f; 公平锁 : 锁被释放之后&#xff0c;先申请的线程先得到锁。性能较差一些&#xff0c;因…

[ESP32]:基于HTTP实现百度AI识图

[ESP32]&#xff1a;基于HTTP实现百度AI识图 测试环境&#xff1a; esp32-s3esp idf 5.1 首先&#xff0c;先配置sdk&#xff0c;可以写入到sdkconfig.defaults CONFIG_IDF_TARGET"esp32s3" CONFIG_IDF_TARGET_ESP32S3yCONFIG_PARTITION_TABLE_CUSTOMy CONFIG_PA…

SpringBoot 文件上传(一)

应用场景 文件上传是指将本地图片、音频、视频等文件上传至服务器的过程&#xff0c;应用场景非常多。 比如&#xff1a;更新头像、交作业上传作业文件、发微博微信时上传图片等。 前端页面三要素 上图显示前端页面的三要素以及对应的页面样式 前端页面三要素&#xff1a; …

Python爬取歌曲宝音乐:轻松下载Jay的歌

歌曲宝是一个不用付费就能听jay的歌曲&#xff0c;但是每次都只能播放一首不方便&#xff0c;于是今天想把它下载下来&#xff0c;本地循环播放&#xff0c;它所用到的接口是某我的还不错哈 获取搜索接口 分析html请求接口&#xff0c;获取到的数据是直接渲染好的HTML内容&…