unity3d - 倾斜物理射线投射实现
问题描述
对于我的 3d 汽车游戏,我正在做物理射线投射来检测障碍物并基于检测向左或向右转。目前,我正在做直接的光线投射,我无法检测到左右两侧存在的障碍物。
所以我决定做一点倾斜的光线投射来检测左右两侧的东西。下图更好地解释了我的问题:
此代码目前正在运行:
Ray rayRight = new Ray(thisTransform.position + Vector3.up * 0.2f + thisTransform.right * detectAngle * 0.5f + transform.right * detectAngle * 0.0f * Mathf.Sin(Time.time * 50), transform.TransformDirection(Vector3.forward) * detectDistance);
Ray rayLeft = new Ray(thisTransform.position + Vector3.up * 0.2f + thisTransform.right * -detectAngle * 0.5f - transform.right * detectAngle * 0.0f * Mathf.Sin(Time.time * 50), transform.TransformDirection(Vector3.forward) * detectDistance);
Debug.DrawRay(rayRight.origin, rayRight.direction * detectDistance, Color.red);
Debug.DrawRay(rayLeft.origin, rayLeft.direction * detectDistance, Color.red);
现在请指导我进行倾斜物理射线投射以检测障碍物。
解决方案
使用与 Vector3.forward 不同的方向?
在您的类中定义两个 Vector3 字段(下面的名称是建议),然后Start()
像初始化它们一样
float angle = 15.0f //or whatever you need.
leftRayDirection = Quaternion.AngleAxis(-angle, Vector3.up) * Vector3.forward;
rightRayDirection = Quaternion.AngleAxis(angle, Vector3.up) * Vector3.forward;
并使用它们而不仅仅是 Vector3.foward(你仍然需要使用 transform.transformDirection 来转换它们)。
或者,如果您希望它们扫描,只需将它们计算在Update()
.
编辑:另一种选择是将2个四元数存储在一个字段中并使用它们来旋转transform.forward
(与 相同transform.transformDirection(Vector3.forward)
)。
//Field
Quaternion leftRayRotation;
//in Start()
leftRayRotation = Quaternion.AngleAxis(-angle, Vector3.up);
//before Raycasting
Ray leftRay = new Ray(transform.position + leftRayOffset, leftRayRotation * transform.forward);
推荐阅读
- flutter - 无法“发布升级”颤振工具
- scala - 通过键对大型数据集进行重新分区并为每个组逐批应用函数的内存有效方法
- django - 从用户名切换到电子邮件后,Django createsuperuser 命令不起作用
- javascript - 如何从网站 URL 中获取 body 元素的用户可读文本
- php - 根据购物车中的当前产品类型在 WooCommerce 中禁用新帐户电子邮件通知
- spring - RestTemplate 交换在 GET 调用上失败,但适用于 CURL
- c# - 在运行时实体框架核心中动态选择具有连接的列
- python - Python:csv_writer 在单独的单元格中写入 1 个数字问题
- .net - 通过控制台输入以控制字节值
- python - 没有这样的元素,Python 3.7