【问题标题】:Find slope in degrees between two vector3查找两个向量3之间的度数斜率
【发布时间】:2026-01-18 14:40:01
【问题描述】:

嗨, 我找到了大量参考资料,但无法根据我的需要进行调整。 根据附图,我的角色处于给定位置。角色脚下是一个新平面 ()。使用鼠标滚轮,我沿 Y 轴向上移动角色,平面随之移动。然后我将角色拖到任意位置,并用 Gizmos 线加入三个 vector3s。现在我需要知道起点(红点)和角色新位置之间的斜率。我尝试使用 Vector3.Angle 或 Atan2 以及周围的许多示例,但是当您旋转角色时,尽管斜率始终相同,但它们都返回不同的值。例如charAngle = Vector3.Angle (initialCharPos - character.transform.position, Vector3.left) 仅在该特定方向上返回正确的值,我可以获得左、右、前、后 4 个点。但是对于这些以外的方向?我想知道对于 360 个点中的每一个是否有必要根据方向进行检查,或者是否有更快的方法来获取这个值。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    你可以使用Vector3.Angle,你只需要在向下和从新脚位到开始脚位的方向之间取,然后从90中减去结果:

    Vector3 newFeetPosition;
    Vector3 startFeetPosition;
    
    // direction of "down", could be different in a zero g situation for instance
    Vector3 downDirection = Vector3.down:
    
    float slopeDegrees = 90f - Vector3.Angle(newFeetPosition - startFeetPosition, downDirection);
    

    如果您出于其他原因需要上升/运行,您可以在使用矢量数学自己计算角度的过程中获取它们:

    Vector3 newFeetPosition;
    Vector3 startFeetPosition;
    
    // direction of "up", could be different in a zero g situation for instance
    Vector3 upDirection = Vector3.up:
    
    Vector3 feetDiff = newFeetPosition - startFeetPosition:
    
    float riseMagnitude = Vector3.Dot(feetDiff, upDirection);
    
    Vector3 riseVector = riseMagnitude * upDirection;
    
    float runMagnitude = (feetDiff - riseVector).magnitude;
    
    float slopeDegrees = Mathf.Rad2Deg * Mathf.Atan2(riseMagnitude, runMagnitude);
    

    【讨论】: