Unity任意轴向朝向某目标实现LookAt功能_unity lookat-程序员宅基地

技术标签: unity  Unity  

【前言】

最近做个雷达地屏的项目,需要在平面内(地面是图)踩地面场景,踩到动物(上层是动物模型)后有个伪3D的场景交互的效果,涉及到动物朝向目标(cube代替的目标点)跑的问题,最初想到最简单的transform.LookAt方法,但是实际测试之后,他会x、y、z都会相对朝向目标,这样就导致可能某次朝向目标点时,动物朝着目标点时会翻身背朝下,这样就导致了我必须要寻找一种方式去只使某一个轴旋转朝向目标即可,所以就自己参考一些资料后,写出自己的一些想法来。

在这里插入图片描述
配图:实现点击到小白兔后朝向随机cube的方向跑

【思路分析】

有人和我推荐过在LookAt之后,再将其他两个轴向重置,但这样的做法不是聪明的做法,其次,在使用了lookAt之后,是没有办法控制那个轴来实现朝向,如果他旋转朝向,旋转用的轴是你重置的轴,那么被你重置后,就又会导致朝向不对,还有人给我建议过用AI(NavMeshAgent)组件来做,我想我都做了这些功夫了,翻新做那是不可能的了。
在这里插入图片描述
配图:因为各种朝向计算导致兔子没有站立在地面上

配图有点类似于这个API的味道:public static Quaternion RotateTowards (Quaternion from, Quaternion to, float maxDegreesDelta);//描述:将旋转 from 向 to 旋转

所以我猜测他的底层应该有个最优计算旋转朝向的算法,当然我们是要去解决问题的,所以我理清了思路,参照底下的代码,大致如下:
1.首先我们要定义是那个轴去朝向目标
2.要去计算轴的向量和目标位置到自身的向量之间的夹角
3.用计算 Vector3.Cross垂直于当前方向和目标方向的轴
4.使用Quaternion.AngleAxis将当前朝向向目标方向旋转
在这里插入图片描述
配图:做到以上几点也差不多实现了一个LookAt功能了
↑↑↑由于这个算法和LookAt最大的区别就是他是能控制某个轴,可以在定义的轴上实现朝向,因为我们只需要让Y轴上旋转朝向目标方位,所以我又重置了X、Z的轴向不变↓↓↓
5.tr_self.localEulerAngles = new Vector3(0, tr_self.localEulerAngles.y, 90);//后来调试增加的,因为我想让x,z轴向不会有任何变化,只使用Y轴实现了动物的转向功能

【放出代码】

1.用某个轴去朝向物体的方法

/// <summary>
    /// 用某个轴去朝向物体
    /// </summary>
    /// <param name="tr_self">朝向的本体</param>
    /// <param name="lookPos">朝向的目标</param>
    /// <param name="directionAxis">方向轴,取决于你用那个方向去朝向</param>
    void AxisLookAt(Transform tr_self, Vector3 lookPos, Vector3 directionAxis)
    {
    
        var rotation = tr_self.rotation;
        var targetDir = lookPos - tr_self.position;
        //指定哪根轴朝向目标,自行修改Vector3的方向
        var fromDir = tr_self.rotation * directionAxis;
        //计算垂直于当前方向和目标方向的轴
        var axis = Vector3.Cross(fromDir, targetDir).normalized;
        //计算当前方向和目标方向的夹角
        var angle = Vector3.Angle(fromDir, targetDir);
        //将当前朝向向目标方向旋转一定角度,这个角度值可以做插值
        tr_self.rotation = Quaternion.AngleAxis(angle, axis) * rotation;
        tr_self.localEulerAngles = new Vector3(0, tr_self.localEulerAngles.y, 90);//后来调试增加的,因为我想让x,z轴向不会有任何变化
    }

2.Update调用朝向的代码

void Update()
{
    
AxisLookAt(this.transform, m_tr_Random[0].position, Vector3.up);//朝向目标体
}

【最后想说】

朝向的问题之前老是弄不好,网上也试过很多代码,都会或多或少有些许问题,今天刚实现后,下班后就马上更新了文章,代码简单做过测试可行,参照最上面的gif图,如果有什么不足之处多多包涵,我会认真听取您的意见。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42541751/article/details/114987971

智能推荐

选择多个文件上传<input type="file" id="myfileinput" multiple>_input= “file” 赋值多个file 对象-程序员宅基地

文章浏览阅读6.1k次。一个FileList对象通常来自于一个HTML input元素的files属性,你可以通过这个对象访问到用户所选择的文件.该类型的对象还有可能来自用户的拖放操作,查看DataTransfer对象了解详情.Gecko 1.9.2 note(Firefox 3.6 / Thunderbird 3.1 / Fennec 1.0)在Gecko 1.9.2之前,通过i_input= “file” 赋值多个file 对象

搜维尔科技:【第三期】第九届元宇宙数字人大赛,参赛小组报名确认公告-程序员宅基地

文章浏览阅读535次,点赞8次,收藏11次。为了提高大学生元宇宙虚拟人角色策划与美术设计的专业核心能力,我们特别举办了这场元宇宙数字人设计赛道,赛道主题为「AI人工智能科技」 ,只要与「AI人工智能科技」相关的议题都可以自由创意发挥,内容以不违背善良风俗为原则。本赛道旨在促进大学生对角色策划与美术设计的专业能力的掌握,培养其创新能力和设计思维,以及团队合作意识、沟通协作能力以及项目管理能力。各位参赛选手大家好,近期已收到新增报名信息如下表,请各位参赛选手确认,如果信息有误或信息不完整请电话联系赛务组工作人员进行更正。赵艺萌(组长)、巫妍。

Python入门难吗?30年前的编程语言,为什么现在这么火?_vb语言和python语言-程序员宅基地

文章浏览阅读203次。开发圈内流传着这么一句话“流水的语言,铁打的 Python”,虽然诞生于80年代末、90年代初的 Python 已经不算年轻了,但是丝毫不影响 Python 成为现今再主流不过的编程语言之一。再过去的很长一段时间, C、C++、C# 和 Java 等编程语言在各大排行榜的头部位置上上下下。然而,在近几年,Python 越来越受到关注。最近几个月 Python 在 Tiobe 的编程语言指数中长期领先于 Java、C#、C++ 和 Visual Basic 等语言,占据榜单第二的位置。如最新的20._vb语言和python语言

英语高考迎来“人机对话”新场景 云课堂专业版显露“真功夫”-程序员宅基地

文章浏览阅读107次。2017年是新一轮教育综合改革试点全面实施的第一年,数十万名高中毕业生参加了英语口语“人机对话”的新高考。“人机对话”如何考呢?电脑将代替考官的角色,考生根据计算机指令回答问题,计算机自动进行录音并保存。相比于传统的“人人对话“,人机对话过程不介入任何人为因素。考试结束后,系统自动智能评分,大大提高了测评的效率和公平性。计算机教室地位转变,“主考..._是想了解用云教室安装讯飞高考中考英语系统的可行性

WinRAR一直自动关闭怎么回事_winrar闪退-程序员宅基地

文章浏览阅读4.7k次。很多用户都习惯使用WinRAR来压缩解压文件,但是有小伙伴跟小编反映自己的WinRAR老是一直闪退,这是怎么回事?下面就来看看WinRAR软件闪退的解决办法吧。2、在应用和功能右侧找到【WinRAR】,然后点击选择【卸载】按钮将其卸载。1、将系统中的WinRAR卸载,Win+I打开设置,然后单击【系统】。3、卸载后重新下载官方个人版的WinRAR免费版安装即可。_winrar闪退

【软件工程】面向过程的软件设计方法_面向过程方法主要采用的分析设计工具和方法有哪些-程序员宅基地

文章浏览阅读3.5k次。软件设计的目标和任务:根据 用 信 息 域 表 示 的 软 件 需 求, 以 及 功 能 和 性 能 需 求 , 进行:数据 设 计;系统 结 构 设 计;过程 设 计 软件设计任务:从工程管理的角度来看,软件设计分为两步完成:概要设计;详细设计软件 设 计 过 程 :1.制 定 规 范 2. 软 件 系 统 结 构 的 总 体 设 计 3.处 理 方 式 设 _面向过程方法主要采用的分析设计工具和方法有哪些

随便推点

RTP的接收程序分析_rtp_session_set_jitter_compensation-程序员宅基地

文章浏览阅读4k次。// 程序名:rtprecv.c// 类型:学习笔记#include #include #include #ifndef _WIN32#include #include #include #endifint cond=1; //变量cond控制着while循环。void stop_handler(int sign_rtp_session_set_jitter_compensation

MFC组合框控件总结及用法示例_mfc复合控件-程序员宅基地

文章浏览阅读1.8w次,点赞7次,收藏57次。Combo Box (组合框)控件很简单,可以节省空间。从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的。用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本。编程时用到了组合框,这个控件用得不是很多,现将组合框控件的属性和方法做一个小结,供后续参考。组合框控件既可以进行输入,也可以在列表框组成部分中进行选择。打开组合框控件的属性窗口,下图所示:_mfc复合控件

Linux命令窗口快捷键_哪个命令可以查看linuk操作当前窗口-程序员宅基地

文章浏览阅读1.7k次。常用的快捷键:Tab:命令或路径补全键移动光标快捷键:Ctrl+a:光标回到命令行首Ctrl+e:光标回到命令行尾Ctrl+f:光标向右移动一个字符(相当于方向键右键)Ctrl+b:光标向左移动一个字符(相当于方向键左键)剪切、粘贴、清除快捷键:Ctrl+Insert:复制选中命令行内容Shift+Insert:粘贴复制的命令行内容Ctrl+k:剪切(删除)光标处到行尾的字符Ctrl+u:剪切(删除)光标处到行首的字符Ctrl+w:剪切(删除)光标前的一个单词(用空格隔开的字符)C_哪个命令可以查看linuk操作当前窗口

php连接mysql速度慢的问题解决-程序员宅基地

文章浏览阅读2.2k次。2019独角兽企业重金招聘Python工程师标准>>> ..._php 连接mysql 很慢

使用ggsci包中的scale_color_jco函数指定可视化图像的配色符合jco临床肿瘤学杂志配色要求_r语言jco设置-程序员宅基地

文章浏览阅读82次。最后,我们使用print函数显示了图形。ggplot2包的默认配色方案在大多数情况下都能满足需求,但有时候我们需要使用特定的配色方案来符合特定的需求,比如符合临床肿瘤学杂志(Journal of Clinical Oncology,简称JCO)的配色要求。为了使用JCO杂志的配色方案,我们可以使用ggsci包,它是一个基于ggplot2的扩展包,提供了许多精美的配色方案。通过使用ggsci包中的scale_color_jco函数,我们可以轻松地将可视化图像的配色方案设置为符合JCO临床肿瘤学杂志的要求。_r语言jco设置

【JAVA集合篇】ArrayList源码详解_java arraylist源码-程序员宅基地

文章浏览阅读412次。ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。在ArrayList集合里面可以存储任何类型的数据, 而且它是一个顺序容器,存放的数据顺序就是和我们放入的顺序是一致的,而且它还允许我们放入null元素。_java arraylist源码

推荐文章

热门文章

相关标签