Unity之四元数计算

四元数相乘

#region 四元数相乘
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;
#endregion

四元数乘向量

Vector3 v = Vector3.forward;
print(v);
//四元数乘向量的顺序不能改变,也就是说不能用向量去乘四元数,只能是四元数乘向量
v = Quaternion.AngleAxis(45,Vector3.up) * v;
print(v);
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v);

例一

模拟飞机发射不同类型子弹的方法,单发,双发,扇形,环形

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public enum E_FireType
{One,Two,Three,Round
}
public class AirPlane : MonoBehaviour
{private E_FireType nowType;public GameObject bullet;public int roundNum = 4;// Start is called before the first frame updatevoid Start(){nowType = E_FireType.One;}// Update is called once per framevoid Update(){//切换开火方式if (Input.GetKeyDown(KeyCode.Alpha1)){nowType = E_FireType.One;}else if (Input.GetKeyDown(KeyCode.Alpha2)){nowType = E_FireType.Two;}else if (Input.GetKeyDown(KeyCode.Alpha3)){nowType = E_FireType.Three;}else if (Input.GetKeyDown(KeyCode.Alpha4)){nowType = E_FireType.Round;}if(Input.GetKeyDown(KeyCode.Space)){Fire();}}private void Fire(){switch (nowType){case E_FireType.One:Instantiate(bullet,transform.position,transform.rotation);break;case E_FireType.Two://让发射位置分别向两边的方向偏移一点Instantiate(bullet, transform.position - transform.right * 1, transform.rotation);Instantiate(bullet, transform.position + transform.right * 1, transform.rotation);break;case E_FireType.Three:Instantiate(bullet, transform.position, transform.rotation);Instantiate(bullet, transform.position - transform.right * 1, transform.rotation * Quaternion.AngleAxis(-20, Vector3.up));Instantiate(bullet, transform.position + transform.right * 1, transform.rotation * Quaternion.AngleAxis(20, Vector3.up));break;case E_FireType.Round:float angle = 360/roundNum;for(int i = 0; i < roundNum; i++){Instantiate(bullet, this.transform.position, this.transform.rotation * Quaternion.AngleAxis(i * angle, Vector3.up));}break;}}
}

练习二

用3D数学知识实现摄像机跟随效果

1.摄像机在人物斜后方,通过角度控制倾斜率

2.通过鼠标滚轮控制摄像机距离人物的距离(有最大最小限制)

3.摄像机看向任务头顶上方的一个位置(可调节)

4.Vector3.Lerp实现相机跟随任务

5.Quaternion.Slerp实现摄像机看向人物

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraMove2 : MonoBehaviour
{//目标对象public Transform target;//相对头顶偏移多少public float headOffsetH = 1;//倾斜角度public float angle = 45;//默认的摄像机里观测点的距离public float dis = 5;//距离必须是3和10之间 public float minDis = 3;public float maxDis = 10;//当前摄像机应该在的位置private Vector3 nowPos;private Vector3 nowDir;private float time;private Vector3 startPos;private Vector3 endPos;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//鼠标中键滚动控制摄像机远近的逻辑dis += Input.GetAxis("Mouse ScrollWheel");dis = Mathf.Clamp(dis, minDis, maxDis);//向头顶偏移位置nowPos = target.position + target.up * headOffsetH;//往后方偏移位置 nowDir = Quaternion.AngleAxis(angle, target.right) * -target.forward;nowPos = nowPos + nowDir * dis;//直接把算出来的位置赋值if(endPos != nowPos) { startPos = this.transform.position;endPos = nowPos;time = 0;}time += Time.deltaTime;//this.transform.position = nowPos;//先快后慢//this.transform.position = Vector3.Lerp(this.transform.position,nowPos,Time.deltaTime*dis);//匀速this.transform.position = Vector3.Lerp(startPos, endPos, time);Quaternion.LookRotation(nowDir);this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(-nowDir),Time.deltaTime);}
}

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

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

相关文章

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中&#xff0c;使用 aop 增强&#xff0c;不仅可以很优雅地扩展功能&#xff0c;还可以让一写多用&#xff0c;避免写重复代码&#xff0c;例如&#xff1a;记录接口耗时&#xff0c;记录接口日志&#xff0c;接口权限&…

C# byte转int:大小端读取

参考&#xff1a;byte[]数组和int之间的转换 文章目录 Byte转为INT小端存储方式转int大端存储方式转int 大端模式和小端模式是计算机存储多字节数据时的两种方式。内存地址从小往大增长。 大端模式&#xff1a;最高有效&#xff08;最高位&#xff09;的字节存放在最小地址上&…

python 自动化模块 - pyautogui初探

python 自动化模块 - pyautogui 引言一、安装测试二、简单使用三、常用函数总结 引言 在画图软件中使用pyautogui拖动鼠标&#xff0c;画一个螺旋式的正方形 - (源码在下面) PyAutoGUI允许Python脚本控制鼠标和键盘&#xff0c;以自动化与其他应用程序的交互。API的设计非常简…

限流算法之流量控制的平滑之道:滑动时间窗算法

文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中&#xff0c;流量控制是一个重要的组件&#xff0c;用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法&#xff0c;并分析其优缺…

【设计模式 行为型】策略模式

它允许在运行时根据需要选择算法的行为。该模式通过将算法封装成独立的类&#xff0c;使得它们可以相互替换&#xff0c;而不影响使用算法的客户端代码。 策略模式主要包含以下角色&#xff1a; 环境&#xff08;Context&#xff09;&#xff1a;环境对象持有一个策略对象的引…

基于Abaqus的三种钢筋混凝土梁数值模拟对比研究

混凝土结构抗压强度高&#xff0c;而抗拉强度大约只有其十分之一&#xff0c;在受到竖向荷载&#xff08;包括自重&#xff09;作用下&#xff0c;梁下部会产生拉应力&#xff0c;上部产生压应力&#xff0c;而由于其抗拉强度低&#xff0c;因此很小的荷载即可导致梁下部开裂&a…

pytorch学习(二)、网络的构建和卷积层

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、nn.Module&#xff08;网络的构建&#xff09;二、torch.nn.functional.conv2d&#xff08;卷积运算&#xff09;三、神经网络--卷积层&#xff08;一层卷积…

Mysql中的日志系统

文章目录 1. 慢查询日志&#xff08;Slow Query Log&#xff09;1.1 是否开启慢查询日志1.2 开启慢查询日志&#xff0c;设置时间阈值1.2.1 修改文件my.ini1.2.2 重启mysql后配置生效 1.3 查看慢查询日志1.3.1 直接用文本编辑器打开1.3.2 使用mysqldumpslow进行分析 2. InnoDB …

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…

【音视频原理】图像相关概念 ③ ( RGB 色彩简介 | RGB 排列 | YUV 色彩简介 | YUV 编码好处 )

文章目录 一、RGB 色彩1、RGB 色彩简介2、RGB 排列 二、YUV 色彩1、YUV 色彩简介2、YUV 编码好处 一、RGB 色彩 1、RGB 色彩简介 RGB 是 计算机 中的 颜色编码方法 , 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 可以设置不同的值 , 每个 通道 的 颜色值都可以取值 0 ~ 255 ,…

【已解决】namespace “Ui“没有成员 xxx

先说笔者遇到的问题&#xff0c;我创建一个QWidget ui文件&#xff0c;然后编辑的七七八八后&#xff0c;想要用.h与.cpp调用其&#xff0c;编译通过&#xff0c;结果报了这个错误&#xff0c;本方法不是普适性&#xff0c;但是确实解决了这个鸟问题。 问题来源 搭建ui后&…

数据分析师不加班的秘密,三行代码教你Python自动发送邮件

作为一名数据分析师&#xff0c;每天除了做数据日报&#xff0c;还要编写邮件正文和添加数据日报附件&#xff0c;发送给对应的负责人及销售个人&#xff0c;一般一封邮件应包含邮箱账户名、邮箱密码、发送人邮箱、邮件主题以及邮件正文。 本文借助Python工具&#xff0c;使用y…

MyBatis框架基础到进阶

1、为什么要学习MyBatis 如果没有MyBatis框架&#xff0c;我们依靠JDBC和连接池已经能够很好的和数据库进行交互了&#xff0c;而学习MyBatis框架最核心的原因是为了减少SQL语句对代码的侵入性。 因为在过往不管是使用连接池还是JDBC Templete&#xff0c;所有的SQL语句都写在代…

java.sql.SQLException: Failed to fetch schema of XXX 问题

遇到问题&#xff1a;java.sql.SQLException: Failed to fetch schema of pay_record表 i.s.r.d.s.s.c.AbstractTableMetaCache : get table meta of the table pay_record error: Failed to fetch schema of pay_record 原因分析&#xff1a; springcloud项目中使用了se…

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;创业板指跌近1%&#xff0c;北证50指数跌超3%。旅游、零售板块全天强势&#xf…

200. 岛屿数量(js)

示例 1&#xff1a; 输入&#xff1a;grid [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"…

Angular 表单的validation校正学习

概念&#xff1a; Angular中的表单valid是指表单中的输入项是否符合预设的规则和条件。在Angular中&#xff0c;可以通过使用表单控件的属性和方法来判断表单的valid状态&#xff0c;例如使用form.valid属性来判断整个表单是否valid&#xff0c;或者使用formControl.valid属性来…

记自动化测试发现的一个因表空间不足引发的BUG

0 背景介绍 这是一个BS架构的项目&#xff0c;数据库是SQL Server&#xff0c;前端浏览器呈现数据&#xff0c;操作数据。 1 现象介绍 功能为发送消息&#xff0c;类似广播&#xff0c;相关人员在系统中都可以接收到。之前功能都正常&#xff0c;这两天跑自动化测试时&#x…

python类继承之__init__函数覆盖问题

目录 1.问题描述 2.代码演示 3.总结 在Python这个广受欢迎的编程语言中&#xff0c;类继承是一项强大而精巧的特性。通过类继承&#xff0c;我们可以构建出更加灵活、可重用和易维护的代码&#xff0c;同时实现代码的模块化和扩展性。 但是如果对于熟悉C和java的人而言&…

R语言学习 case2:人口金字塔图

step1&#xff1a;导入库 library(ggplot2) library(ggpol) library(dplyr)step2&#xff1a;读取数据 data <- readxl::read_xlsx("data_new.xlsx", sheet 1) datareadxl::read_xlsx() 是 readxl 包中的函数&#xff0c;用于读取Excel文件。 step3&#xff1…