c# - 查找两个向量之间的斜率3
问题描述
嗨,我找到了大量参考资料,但无法根据我的需要进行调整。根据附图,我的角色处于给定位置。角色脚下是一个新平面 ()。使用鼠标滚轮,我沿 Y 轴向上移动角色,平面随之移动。然后我将角色拖到任意位置,并用 Gizmos 线连接三个 vector3。现在我需要知道起点(红点)和角色新位置之间的斜率。我尝试使用 Vector3.Angle 或 Atan2 以及周围的许多示例,但是当您旋转角色时,尽管斜率始终相同,但它们都返回不同的值。例如charAngle = Vector3.Angle (initialCharPos - character.transform.position, Vector3.left)
仅在该特定方向上返回正确的值,我可以获得左、右、前、后 4 个点。但是对于这些以外的方向?我想知道对于 360 个点中的每一个是否有必要根据方向进行检查,或者是否有更快的方法来获得这个值。
解决方案
您可以使用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);
推荐阅读
- asp.net - 如何将框架 4.6.1 类库转换为核心 3.1?
- c# - 如何使用 C# 在 SQLite 中获取最后插入的 id?
- android - 收到错误 MockKException: no answer found for: Observer(#8).onChanged Android
- php - 在可排序网格行为中添加项目
- apache-spark - 具有 Pubsub-BigTable 性能问题的 Spark Streaming
- appkit - 在 macOS 11 Big Sur 中具有自定义视图的 NSMenuItem
- react-native - AsyncStorage.getItem 需要 500 毫秒
- git - Git diff 可以查看未修改的行吗?
- javascript - 使用 javascript python selenium 按键
- javascript - 查询选择器如何跳过一个 td 并将其用作部分名称