You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中使用glm(experimental)计算2D向量夹角的问题

GLM orientedAngle 2D向量夹角计算问题解析

问题背景

使用GLM的experimental模块计算两个2D向量的夹角,初始代码如下:

#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/vector_angle.hpp>
...
glm::vec2 A = glm::vec2(0, SCREEN_HEIGHT - 250);
glm::vec2 B = glm::vec2(30, SCREEN_HEIGHT - 250);
float res = glm::orientedAngle(glm::normalize(A), glm::normalize(B));

运行结果为:-0.0535194

问题1

若从y轴测量角度结果应为π/2,从x轴测量应为0,为何实际结果与预期不符?

仅修改B向量的x坐标后,代码如下:

glm::vec2 A = glm::vec2(0, SCREEN_HEIGHT - 250);
glm::vec2 B = glm::vec2(100, SCREEN_HEIGHT - 250);
float res = glm::orientedAngle(glm::normalize(A), glm::normalize(B));

运行结果为:-0.176709

问题2

为何沿x轴移动B向量会得到不同的夹角结果?


问题解析

问题1:预期不符的核心原因

  1. 向量方向认知错误:你定义的向量A是(0, SCREEN_HEIGHT - 250),若SCREEN_HEIGHT远大于250,该向量沿y轴正方向;向量B是(30, SCREEN_HEIGHT - 250),归一化后是向右上方倾斜的向量,并非沿x轴正方向。你的预期(从y轴测为π/2、x轴测为0)基于“B沿x轴”的错误假设,自然和实际结果不符。
  2. orientedAngle的计算逻辑:GLM的orientedAngle计算的是从第一个向量旋转到第二个向量的有符号角度,2D场景下遵循右手坐标系(逆时针旋转为正,顺时针为负)。由于A沿y轴正方向,B向右上方,从A顺时针旋转到B的角度很小,因此返回负的小数值。

问题2:x坐标变化导致角度变化的原因

修改B的x坐标时,向量B的方向发生了改变:

  • 当x=30时,B归一化后更偏向y轴正方向,与A的夹角较小;
  • 当x=100时,B归一化后更偏向x轴正方向,与A的夹角更大。

orientedAngle返回的是两个向量之间的旋转角度,向量方向改变,角度结果自然不同。用三角函数验证:向量与y轴的夹角为arctan(x分量/y分量),x从30增大到100时,这个夹角的绝对值会变大,和你得到的结果(绝对值从0.0535变为0.1767)完全匹配。


内容的提问来源于stack exchange,提问作者Jimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:43:39