首页 > 解决方案 > 倾斜物理射线投射实现

问题描述

对于我的 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);

现在请指导我进行倾斜物理射线投射以检测障碍物。

标签: unity3d

解决方案


使用与 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);

推荐阅读