参考Unity粒子系统的StretchedBillboard,在保持模型的右朝向不变的情况下,尽量朝向摄像机
转化为数学问题: 一个向量在一个面上的投影
基础的Billboard的方向应为: 从中点指向摄像机
限制的平面为以right为法向量的平面
算法
Vector3 rightward = transform.parent.forward;
if (isShowLeft) rightward = -rightward;
Vector3 forward = (Camera.current.transform.position - transform.position).normalized;
if (isShowBack) forward = -forward;

float cosVal = Vector3.Dot(rightward, forward);
if (Mathf.Abs(cosVal) >= 0.999999f) return;

rightward = rightward * cosVal;
forward = forward - rightward;

//不能用forward改变,不能保证right朝向 有时候会反过来
if (cosVal > 0)
transform.rotation = Quaternion.LookRotation(forward, Vector3.Cross(rightward, forward));
else
transform.rotation = Quaternion.LookRotation(forward, Vector3.Cross(forward, rightward));

//角度旋转
if (billboardAngle != 0)
{
Vector3 oriAngle = transform.eulerAngles;
oriAngle.x += billboardAngle;
transform.eulerAngles = oriAngle;
}

x
24
 
1
            Vector3 rightward = transform.parent.forward;
2
            if (isShowLeft) rightward = -rightward;
3
            Vector3 forward = (Camera.current.transform.position - transform.position).normalized;
4
            if (isShowBack) forward = -forward;
5

6
            float cosVal = Vector3.Dot(rightward, forward);
7
            if (Mathf.Abs(cosVal) >= 0.999999f) return;
8

9
            rightward = rightward * cosVal;
10
            forward = forward - rightward;
11

12
            //不能用forward改变,不能保证right朝向 有时候会反过来
13
            if (cosVal > 0)
14
                transform.rotation = Quaternion.LookRotation(forward, Vector3.Cross(rightward, forward));
15
            else
16
                transform.rotation = Quaternion.LookRotation(forward, Vector3.Cross(forward, rightward));
17

18
            //角度旋转
19
            if (billboardAngle != 0)
20
            {
21
                Vector3 oriAngle = transform.eulerAngles;
22
                oriAngle.x += billboardAngle;
23
                transform.eulerAngles = oriAngle;
24
            }
效果: 白色为粒子系统的StretchedBillboard 红色为仿制的StretchedBillboard
 
最终计算朝向






StretchedBillboard 实现的更多相关文章

随机推荐

  1. iOS 调用系统相册 相机 时,显示中文标题

    解决手机语言已经设置显示中文 在调用系统相册.相机界面 时显示英文问题, 在 info.plist里面添加Localized resources can be mixed YES 表示是否允许应用程序 ...

  2. Iptables指南教程收集

    iptables对于任何Linux基本都适用,虽然在最新版的CentOS 7和Ubuntu上已经有代替的工具来简化iptables,但是最终还是会把规则写入iptables中. 读教程前先阅读ipta ...

  3. 使用mysql-connector-java.jar连接MySql时出现:Error while retrieving metadata for procedure columns: java.sql.SQLException: Parameter/Column name pattern can not be NULL or empty.

    错误如下: 程序实现的功能是调用一个存储过程,但是不认这个存储过程的参数. 原因是版本太高了,由于使用的是6.0.6版本的,改成5.1.38即可. POM配置如下: <!-- mysql-con ...

  4. 海康设备网络SDK 编程

    http://www.cnblogs.com/qtblog/p/5366276.html http://www.hikvision.com/Cn/download_more_401.html

  5. 专题开发十二:JEECG微云高速开发平台-基础用户权限

      专题开发十二:JEECG微云高速开发平台-基础用户权限 11.3.4自己定义button权限 Jeecg中.眼下button权限设置,是通过对平台自己封装的button标签(<t:dgFun ...

  6. android POI搜索,附近搜索,周边搜索定位介绍

    POI搜索有三种方式.依据范围和检索词发起范围检索poiSearchInbounds.城市poi检索poiSearchInCity,周边检索poiSearchNearBy. 下以周边检索为例介绍怎样进 ...

  7. srand rand 随机函数

    srand函数是随机数发生器的初始化函数.原型:voidsrand(unsigned int seed); srand和rand()配合使用产生伪随机数序列.rand函数在产生随机数前,需要系统提供的 ...

  8. HDU 2795 Billboard(宣传栏贴公告,线段树应用)

    HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意:  要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...

  9. oracle获取字符串长度函数length()和lengthb()

    oracle获取字符串长度函数length()和lengthb()   lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算st ...

  10. 开发:异常收集之 DB2建表相关问题

    第一次用DB2数据库,因为考虑到建表语句可能不一样,所以採用手动建表的办法.一个个字段去填.并勾选主键.最后发现创建失败.看了下系统生成的sql语句 sql语句例如以下: CREATE TABLE F ...