物体方位判断以及上坡/下坡道路坡度计算
物体方位计算:
如跑酷游戏,主角在任意方向的曲线跑道上移动,通常会限定主角在水平方向只能在跑道中心左右一定范围内移动,避免主角移出跑道。这时就需要计算主角此时的位置是在跑道中心点的左侧还是右侧,以及距离中心点的距离,如果超过了左右两侧的临界点就不再向对应的方向移动。
离跑道中心的距离就可以这样计算:
float offsetX = Vector3.Dot(pathNormal, transform.position - pathPoint);
其中pathPoint是此时主角距离跑道路径最近的点,pathNormal是该点法线向量,这个法线向量就是指向跑道的右边,如果主角是始终朝向道路前方的,也可以使用主角的transform.right来代替。主角当前的位置减去离路径最近的点就得到了主角相对路径中心的方向,然后用主角的右向量点乘主角相对路径中心的方向就得到了此时玩家距离中心点的左右偏移距离,偏移值小于0表示在中心点左边,大于0表示在中心点右边。
![](/assets/blank.gif)
上下坡/道路坡度计算:
CharacterController有个Slope Limit属性,即道路坡度不高于Slope Limit 时 CharacterController都能移动过去。也有很多人遇到斜坡过于陡峭时不让CharacterController继续移动的需求,此时CharacterController自带的功能就无法完成这一需求了。
根据CharacterController与地面碰撞的法线向量和当前路径点的朝向就可以计算出两个向量的夹角角度。
如图当在水平道路上移动时,碰撞法线与道路方向垂直,夹角为90度。
上坡时碰撞法线与道路方向的夹角大于90度。
下坡时碰撞法线与道路方向的夹角小于90度。
所以坡度就可以得出:
float slopeAngle = Vector3.Angle(hit.normal, transform.forward) - 90f;
private void OnControllerColliderHit(ControllerColliderHit hit){if (hit.collider.CompareTag("Ground")){float slopeAngle = Vector3.Angle(hit.normal, transform.forward) - 90f;if (slopeAngle > 10){Log.Info("上坡中...");}else if (slopeAngle < -10){Log.Info("下坡中...");}}}
物体方位判断以及上坡/下坡道路坡度计算相关推荐
- ML:机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率)
ML:机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率) 目录 机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率)
- 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角
序言 还是那句话,学习是为了应用.书到用时方恨"用得少" 1. 计算两条直线的交点 直线一般式方程 A x + B y + C = 0 Ax+By+C = 0 Ax+By+C=0 ...
- java 判断日期是周末_java计算两个日期之前的天数实例(排除节假日和周末)
如题所说,计算两个日期之前的天数,排除节假日和周末.这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天. 不够很坑的是每个日期都要查询数据库,感觉很浪费时间. 原 ...
- 素数:素数判断、找素数、计算素数和、素数求和
有关素数的基础算法 素数测试 package 素数;import java.util.ArrayList; import java.util.HashMap; import java.util.Map ...
- 【Java】判断是否是工作日、计算工期(去除周末)
这里主要是通过java util包中的Calendar,来判断是否是工作日.计算工期(去除周末) /*** @ Author:yl1794* @ Date:2019/10/14 16:03* @ De ...
- matlab判断矩阵不可约,用Matlab计算二元域GF(2)上的不可约多项式
1 二元域 GF(2) 上的不可约多项式 二元域 GF(2)={0,1} 上的运算规则如下: 加法:+ 0 1 0 0 1 1 1 0 乘法:⋅ 0 1 0 0 0 1 0 1 二元域 GF(2) 上 ...
- opencv计算物体姿态旋转_OpenCV轮廓检测,计算物体旋转角度
效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...
- 如何判断链表有环并计算环的长度
总体思路: 给出题目:检测单链表中是否存在环. 可以遍历这个链表,遍历过的节点标记为Done,如果当目前准备遍历的节点为Done的时候,那么存在环,否则准备检测的节点为Null时,遍历完成,不存在环. ...
- python判断是否构成三角形并计算面积
三角形面积 ...
最新文章
- Js获取宽高度的归纳总结
- Load average in Linux的精确含义
- 【渗透过程】嘉缘网站 --测试
- Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
- odoo10参考系列--测试模块
- three.js两个点给线条加宽度_2020湘乡线条立体逼真方兴装饰诚信服务
- java 修改源码_再谈给应用程序diy启动画面和java源代码补丁修改
- UVA11219 How old are you?【日期】
- 初学css常用属性整理
- 英语学习网站超级大全(转载自豆瓣网)
- 企业必须面对云计算时代
- 《美人天下》颠覆小公主之死 李治掌控全局_0
- loj#6100. 「2017 山东二轮集训 Day1」第一题 主席树+二分
- C++数组初始化及定义
- fpm工作流程(转)--写的很完整很明白
- C++鲜为人知的符号
- 分数一定是有理数吗?
- java测试类要画UML图吗,如何从Java代码生成UML图(尤其是序列图)?
- CAD Electrical 项目管理器不能打开
- Java项目源码下载S2SH基于WEB的网上购物系统的设计与实现|电商购物商城
热门文章
- 图神经网络综述 Survey on Graph Neural Network
- 绘图、Core Animation与硬件架构
- 利用BIOS的硬件信息编程(1)
- 戴尔poweredge r730服务器配置以及系统安装
- 旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板 学生DW网页设计作业成品
- DeeplabV3+解码器复现
- linux pkill窗口,Linux基础:pkill命令总结
- 计算机 屏幕花屏,电脑显示器画面花屏一直抖动的五种修复方法
- 上海python培训比较好的机构
- aleve计算机科学,多伦多大学alevel要求 多伦多大学有哪些专业