【问题标题】:How do I keep raycast relative to the object its bound to?如何保持光线投射相对于其绑定的对象?
【发布时间】:2020-12-31 21:32:30
【问题描述】:

我有一个汽车游戏,我想使用 raycast 来检测其他障碍物并在射线击中时做一些事情。 问题是在汽车进行 90 度转弯后,光线投射以一种我不希望他们这样做的方式移动,就像这样:

但是当我将汽车旋转 90 度时,它看起来像这样:

无论汽车旋转如何,我都希望光线保持在第一张图像中的样子。

以下是投射光线和绘制光线的代码:

 private void OnDrawGizmos()
{
    sensorStartPosition1 = transform.position + new Vector3(1f, 0.6f, 0f);
    sensorStartPosition2 = transform.position + new Vector3(-1f, 0.6f, 0f);
    Gizmos.DrawRay(sensorStartPosition1, transform.TransformDirection(Vector3.right) * 3.5f);
    Gizmos.DrawRay(sensorStartPosition2, transform.TransformDirection(Vector3.left) * 3.5f);
}

 private void RunSensors()
{
    RaycastHit hit1;
    sensorStartPosition1 = transform.position + new Vector3(1f, 0.6f, 0);
    //dTS = detect traffic signs
    Ray dTS = new Ray(sensorStartPosition1, transform.TransformDirection(Vector3.right));

    if(Physics.Raycast(dTS, out hit1, sensorLen ))
    {

    }
    Debug.DrawRay(sensorStartPosition1, transform.TransformDirection(Vector3.right) * 3.5f);

    RaycastHit hit2;
    sensorStartPosition2 = transform.position + new Vector3(-1f, 0.6f, 0);
    // dLIT1 = detect left incoming traffic
    Ray dLIT1 = new Ray(sensorStartPosition2, transform.TransformDirection(Vector3.left));
    if(Physics.Raycast(dLIT1, out hit2, sensorLen))
    {

    }
    Debug.DrawRay(sensorStartPosition1, transform.TransformDirection(Vector3.left) * 3.5f);
}

我做错了什么?..提前谢谢

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您计算两个起始位置,沿全局世界空间 X 轴有一个偏移量,而不考虑旋转

    sensorStartPosition1 = transform.position + new Vector3(1f, 0.6f, 0f);
    
    //...
    
    sensorStartPosition2 = transform.position + new Vector3(-1f, 0.6f, 0f);
    

    而不是像这样计算它们

    sensorStartPosition1 = transform.position + transform.right * 1f + transform.up * 0.6f;
    
    //...
    
    sensorStartPosition2 = transform.position + transform.right * -1f + transform.up * 0.6f;
    

    或者干脆

    sensorStartPosition1 = transform.position + transform.rotation * new Vector3(1f, 0.6f, 0f);
    
    //...
    
    sensorStartPosition2 = transform.position + transform.rotation * new Vector3(-1f, 0.6f, 0f);
    

    顺便说一句,而不是

    transform.TransformDirection(Vector3.right)
    transform.TransformDirection(Vector3.left)
    

    你也可以简单地使用

    transform.right
    -transform.right
    

    【讨论】:

    • 啊我现在明白了.. new vector3 是相对于全局定位的,而对变换成员的操作是相对于脚本附加到的对象.. 谢谢
    • transform.right 基本上等于transform.TransformDirection(Vector3.right) .. 另一个乘以对象的旋转,因此它基本上采用新向量但根据对象的方向旋转它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多