我一直在研究Unigine并试图编写一个飞行计划数周,我需要找到两个虚拟节点之间的方向,这样我就可以用这个方向来旋转飞机的机翼。任何解释都将不胜感激。
答案 0 :(得分:2)
首先,您必须计算P1和P2之间距离的长度。
distance = abs(P2(y) - P1(y))
然后你可以使用角度函数来计算角度。
a = sin(distance / length(P12))
答案 1 :(得分:0)
如果在方向下,则表示角度为w.r.t. 任意向量(让它为(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 ++,但简单公式的实现很简单。
答案 2 :(得分:0)
如评论中所述,从P1到P2的向量由P = P2-P1给出。
方向可以通过两种方式实现 1.直接计算angle = tan_inverse(P.y()/ P.x())。
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))
现在你可以通过这个单位向量计算点积来获得任意向量的投影。
答案 3 :(得分:0)
我只是随机遇到了这个问题,因此其他人在这里阅读一些更有用的信息可能会很有用,不管这个问题多年前就被问到过。 目前,没有公认的答案,这可能意味着不太清楚 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
将弧度转换为度数。