我一直在研究 Unigine 并尝试编写飞行程序好几个星期,我需要找到两个虚拟节点之间的方向,这样我就可以使用这个方向来旋转飞机的机翼。任何解释将不胜感激。
4 回答
首先,您必须计算 P1 和 P2 之间的距离长度。
distance = abs(P2(y) - P1(y))
然后您可以使用角度函数来计算角度。
a = sin(distance / length(P12))
如评论中所述,从 P1 到 P2 的向量由 P = P2 - P1 给出。
可以通过两种方式获得方向。
1. 直接计算 angle = tan_inverse( Py() / Px() )。
In this method however, 1st quadrant and 3rd quadrant are treated in the same way as the signs cancel out.
2.你可以对这个向量进行归一化得到一个单位向量。这是首选方式,因为它可以缓解象限问题。
P(normalized) = P / (mod(p))
现在你可以通过计算这个单位向量的点积来得到任何向量在这个方向上的投影。
如果在方向下您的意思是角度 wrt 一个任意向量(让它成为 (p1,p3)),那么您可以使用以下方法计算角度:
angle = arcos( (p1,p2) * (p1,p3) / (modulus((p1,p2)) * modulus((p1,p3)) ))
*
点积在哪里。角度将以弧度表示。要将其更改为度数,您可以将其乘以180/PI
(PI=3.1415926...)。模是向量的长度:
modulus((p1,p2))=square root((p1,p2) * (p1,p2)).
答案是关于数学而不是 C++,但简单公式的实现很简单。
我只是随机遇到了这个问题,因此其他人在这里阅读一些更有用的信息可能会很有用,不管这个问题在几年前就被问过了。目前,没有公认的答案,这可能意味着 OP 的要求不是很清楚,所以我将在这里遇到两个问题。
- 寻找向量的方向
我对 C++ 不是很流利,所以我将在下面进行一个抽象并编写 C。考虑以下函数
double get_vector_direction (vector v)
{
return atan2(v.q.y - v.p.y, v.q.x - v.p.x); /* atan(ratio) */
}
就这么简单!另外,我喜欢这样定义向量:
typedef struct POINT { double x, y; } point;
typedef struct VECTOR { point p, q; } vector;
函数族atan
返回反正切,该函数返回向量的方向,这是它与水平线所成角度的度量(以弧度为单位)。这里的答案中有一个图表,将水平线显示为向量的 x 分量。这是笛卡尔到极坐标转换的简单实现。
- 寻找起点和终点之间的距离
您可能还想知道向量的大小,可以使用距离公式获得:sqrt(pow(v.q.x-v.p.x, 2)+pow(v.q.y-v.p.y, 2));
这两个函数组成direction()
,distance()
是游戏开发过程中处理代数时最重要的两个函数。如果要向玩家显示角度,我还建议vectoradd
,甚至可能甚至vectorsub
当然,将弧度转换为度数。radtodeg