如何获得两个矢量方向(p1,p2)?

时间:2013-10-24 11:07:41

标签: c++ vector game-physics

我一直在研究Unigine并试图编写一个飞行计划数周,我需要找到两个虚拟节点之间的方向,这样我就可以用这个方向来旋转飞机的机翼。任何解释都将不胜感激。

enter image description here

4 个答案:

答案 0 :(得分:2)

首先,您必须计算P1和P2之间距离的长度。

distance = abs(P2(y) - P1(y))

然后你可以使用角度函数来计算角度。

a = sin(distance / length(P12))

Calculation

答案 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 将弧度转换为度数。