首页 > 解决方案 > 查找两个向量之间的斜率3

问题描述

坡

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

标签: c#unity3d

解决方案


您可以使用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);

推荐阅读