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.rhkb.cn/news/287657.html

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

相关文章

爬虫实践(1)

这一篇只提登录模拟&#xff0c;主要介绍chrome开发者窗口的使用&#xff0c;实际上相关接口调用都是用到cookie&#xff0c;需要再加一篇从token到cookie&#xff0c;以保证实践的完整性 以migu登录为例&#xff0c;分析其登录过程&#xff0c;之后可以使用任意语言模拟登录&…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

springboot基本使用七(静态资源映射)

第一种方式通过配置文件设置&#xff1a; 实现方式&#xff1a;springboot基本使用二&#xff08;resources目录简单介绍&#xff09;-CSDN博客文章浏览阅读907次&#xff0c;点赞25次&#xff0c;收藏22次。再次访问&#xff1a;location:8099/index.html。两个静态资源目录中…

【No.20】蓝桥杯简单数论下|寻找整数|素数的判断|笨小猴|最大最小公倍数|素数筛|埃氏筛|欧氏线性筛|质数|分解质因子(C++)

寻找整数 【题目描述】 有一个不超过 1 0 1 7 10^17 1017的正整数n&#xff0c;知道这个数除以2至49后的余数如下表所示&#xff0c;求这个正整数最小是多少 解法一&#xff1a;模拟 暴力法&#xff1a;一个个检验 1 … 1 0 17 1\dots 10^{17} 1…1017的每个数 由于这个数n…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

2024品牌私域运营:「去中心化」正在成为企业决胜关键

越来越多的品牌选择以DTC模式与消费者互动和销售。通过与消费者建立紧密联系&#xff0c;不仅可提供更具成本效益的规模扩张方式&#xff0c;还能控制品牌体验、获取宝贵的第一方数据并提升盈利能力。许多企业采取的DTC私域策略以交易为中心的方法往往导致了成本上升和运营复杂…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

模板方法模式(继承的优雅使用)

目录 前言 UML plantuml 类图 实战代码 AbstractRoutingDataSource DynamicDataSource DynamicDataSourceContextHolder 前言 在设计类时&#xff0c;一般优先考虑使用组合来替代继承&#xff0c;能够让程序更加的灵活&#xff0c;但这并不意味着要完全抛弃掉继承。 …

2024/3/26 C++作业

定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#xff1a;int…

Python批量提取图像灰度共生矩阵(GLCM)、支持批量处理、任意图像格式

目录 一、介绍 二、实现 1、特征计算 2、批量处理 3、结果 一、介绍 灰度共生矩阵(Grey Level Co-occurrence Matrix)也叫做空间灰度级依赖矩阵(SGLDM),它是一种基于统计的纹理特征提取的方法。 一般包括四个方向&#xff1a; (a,b)(1,0)&#xff0c;像素对是水平的&am…

基于javaweb(springboot+mybatis)生活美食分享平台管理系统设计和实现以及文档报告

基于javaweb(springbootmybatis)生活美食分享平台管理系统设计和实现以及文档报告 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 …

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 包(----------transfer--transfer--------)------delay--------包(----------transfer--transfer--------) TKEEP和TSTRB共同决定了是哪种数据流

Github简单入门教程

文章目录 使用前提查看项目内容查看项目介绍打包下载项目查看项目作者项目搜索复制项目分支项目创建向项目中添加文件对项目进行评论 使用前提 想要使用Github&#xff0c;首先需要学会科学上网&#xff0c;不然用国内的网在正规情况下是无法访问Github滴~ 查看项目内容 打开…

鸿蒙Harmony应用开发—ArkTS-ForEach:循环渲染

ForEach基于数组类型数据执行循环渲染。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 接口描述 ForEach(arr: Array,itemGenerator: (item: Array, index?: number) > void,keyGenerator?: (item: Array, index?: number): string …

批量重命名文件名,一键翻译重命名并复制到指定文件夹,高效整理无烦恼

在信息爆炸的时代&#xff0c;高效、智能的文件管理已成为职场和生活中的必备技能。然而&#xff0c;传统的文件管理方法往往耗时且繁琐。现在&#xff0c;我们带来了一款全新的解决方案&#xff0c;让您可以轻松实现文件的翻译、重命名和复制到指定文件夹&#xff0c;为您的文…

Vue3+.NET6前后端分离式管理后台实战(七)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(七)已经在订阅号发布有兴趣的可以关注一下&#xff01; 有兴趣的可以关注一下&#xff1a;

基于单片机的智能汽车防盗系统设计

摘要:本文介绍了一种以汽车专用单片机飞思卡尔MC68HC908QT4CPE 作为底层主控芯片,人体远红外热释传感器、防闯入光幕墙及振动传感器作为检测装置的汽车防盗系统。单片机将检测到的防盗传感器开关信号,通过数据分析,系统可以设置布防和解除布防模式,在布防模式下,当检测到…

mysql安装及操作

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB&#xff1f; DB的全称是database&#xff0c;即数据库的意思。数据库实际上就是一个文件集合&#xff0c;是一个存储数据的仓库&#xff0c;数据库是按照特定的格式把数据存储起来&#xff0c;用户可以对存储的数据进行…