2021-05-25开发2D特效遇到Quaternion.LookRotation使用的坑
发布日期:2022-03-03 10:43:59 浏览次数:8 分类:技术文章

本文共 2398 字,大约阅读时间需要 7 分钟。

【6.·16日补充】

最近发现,美术做的单个模型的特效都喜欢是水平x轴正向,思来想去没必要去对那个forward向量,正常forward向量是朝向屏幕内部的,这使得我们使用api Quaternion.LookRotation 不太顺手,但是我们还是有其他方法来操作旋转的,这种情况下可以去旋转transform.right 。。但是如果美术做的特效是水平向上的那么就要旋转transform.up 所以下面定义了一个参数upDirType  

对transform扩充一下 

 public static float FaceToTargetPos(this Transform trans,Vector3 targetDir,int upDirType = 1)

    {
        float angle = 0;
        var crossVal = CrossVec2(targetDir, Vector3.right);
        if (crossVal > 0)
        {
            angle = Vector3.Angle(targetDir, Vector3.right);
        }
        else if(crossVal <= 0)
        {
            angle =  -Vector3.Angle(targetDir, Vector3.right);
        }
        var vec = Quaternion.AngleAxis(angle, Vector3.forward) * Vector3.right;
        if(upDirType == 1)
        {
            trans.right = vec;
        }
        else if(upDirType == 2)
        {
            trans.up = vec;
        }
        return angle;
    }
调用

另外这种也是可以做插值得 4元数插值

 public static void LerpFaceToTargetPos(this Transform trans, Vector3 targetDir,float lerpValue)

    {
        float angle = 0;
        var crossVal = CoreUtility.CrossVec2(targetDir, Vector3.right); // 见下文函数定义
        if (crossVal >= 0)
        {
            angle = Vector3.Angle(targetDir, Vector3.right);
        }
        else if (crossVal < 0)
        {
            angle = -Vector3.Angle(targetDir, Vector3.right);
        }
        var tarQua = Quaternion.AngleAxis(angle , Vector3.forward) ;
        trans.rotation = Quaternion.Lerp(trans.rotation, tarQua, lerpValue);
    }

下面的文章是我踩坑的点,继续保留吧。做运动旋转不算那么容易吧要考虑的东西还真不少,

美术做的特效可能是水平向右的,也可能是竖直向上。假如我们需要让特效斜右上方射出去怎么办。如果就是简单使用api  Quaternion.LookRotation 会有什么现象呢 

那么可能的做法是什么,我觉得应该算出最终的四元素旋转。充分使用好Quaternion.AngleAxis

(欧拉角(可正负),轴(比如+x轴(1,0,0))的向量vetor3) 如图所示,我们就是

var totalQua=  Quaternion.AngleAxis(0+60,Vector3.right);  这是一个逆时针的旋转,因为旋转角是正的。旋转角的正负需要用向量的叉乘来判断。代码如下 a和b叉乘 ,比如b就是+x轴,那么只要a向量在x轴上面那么叉乘就是正的,否则就是负的。这正好和旋转角的正负是对应的。利用好这个性质。上面封装的函数也必须依赖这个原理函数的调用 ,注意这里用到了向量的叉乘表达 不是aXbXsin(@)的表达

public static int CrossVec2(Vector3 a, Vector3 b)

    {
        float val = a.x * b.y - a.y * b.x;
        if (val < 0)
        {
            return 1; // 如果a是普通向量  b是水平向量 那么 这里a在1、2象限 
        }
        else if (val > 0)
        {
            return -1;
        }
        else
        {
            return 0; // 说明2个向量平行 
        }
    }

最近写一个飞剑的特效,遇到了坑,以前写特效的时候可能是因为轴向正好对上了没有遇到啥坑。这里记录一下。

如下图所示 右边世界是正x轴 上边世界是正y轴  屏幕里为正z轴 蓝色的轴表示飞剑的forward 红色的为飞剑的right  绿色的是飞剑的up 

我们的飞剑需要走一个xy平面的曲线运动路线,所以这里应该是沿着z轴去旋转,如果是顺时针转动那么是负角度,否则是正角度,首先声明这点(正负不清楚的可以取查阅其他资料,比如左右定则,或者向量的叉乘)。

这样的问题就是 我们看上去的前向方向是up方向向量,这就导致我们使用Quaternion.LookRotation(前向向量,上向量)的时候 导致角度出现各种奇怪的问题,注意飞剑的forward向量实际是朝向屏幕里的,

解决办法是调整子节点飞剑的旋转,然后将父节点ef_feijian的forward调整为向上,这样再次使用Quaternion.LookRotation(前向向量,上向量) 的时候就没有问题了 ,但是这里注意up的值是vector3.back。

以上都基于我们项目的特效都在xoy平面内

调整成这种后 这样再次使用Quaternion.LookRotation(前向向量,上向量)

转载地址:https://blog.csdn.net/yangjie6898862/article/details/117263079 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:给单个预制体批量设置sprite为内置的uimask精灵
下一篇:unity ugui toggle组件的坑

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月18日 15时35分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

代理查询 mysql_查询数据库代理设置 2019-04-21
mysql dif_mysqldiff实现MySQL数据表比较 2019-04-21
mysql 允许其他主机访问权限_允许其他主机访问本机MySQL 2019-04-21
druid不能close mysql连接_alibaba druid mysql连接问题 2019-04-21
mysql 设置按天分表_MySQL 优化实战记录 2019-04-21
java连接mysql 不推荐_java连接mysql 2019-04-21
mysql数据库 quota_shell脚本抓取用户存储quota写道mysql并展现到grafana面板 2019-04-21
idea测试连接mysql报错08001_IDEA连接MySQL错误 2019-04-21
layui导入模板数据_layui表格-template模板的三种用法 2019-04-21
mysql分组显示行号_mysql 显示行号,以及分组排序 2019-04-21
MySQL常见的主从复制架构_如何搭建经典的MySQL 主从复制架构 2019-04-21
编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为3.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?... 2019-04-21
python 公众号引流_公众号引流方法有哪些? 2019-04-21
java 减少内存_java中减少内存占用小技巧 2019-04-21
centos 7 mysql图形界面_centos7-vnstat图形界面搭建 2019-04-21
java 防渗透_「java、工程师工作经验怎么写」-看准网 2019-04-21
java中跳出当前循环怎么做_在java中,如何跳出当前的多重循环? 2019-04-21
java程序中执行maven_java – 将一个enviornment变量传递给Maven中的已执行进程 2019-04-21
java16下载_java lombok下载 2019-04-21
python 图像处理与识别书籍_Python图像处理之识别图像中的文字(实例讲解) 2019-04-21