c++ - 如何检查 3D 点是在 vector 的左侧还是右侧

标签 c++ geometry directx directx-11

我正在使用 DirectX 基于航点图制作寻路 AI。我有一辆带有前向 vector 的汽车,可以告诉我它面向哪个方向。汽车将始终在 XZ 平面内移动,并且永远不会改变它的 Y 坐标。如果下一个航路点在右边,我想告诉汽车向右转,而在左边则相反。这是我当前的寻路功能代码,以及我目前正在做的检查是否正确(这是不正确的)

void Car::Pathfinding(XMVECTOR forwards)
{
    int nextNode;
    if(currentNode + 1 > waypoints->size())
        nextNode = 0;
else
    nextNode = currentNode + 1;

    Accelerate();
    if(onRightOf(forwards, waypoints->at(nextNode)))
        TurnLeft();
    else if(onLeftOf(forwards, waypoints->at(nextNode)))
        TurnRight();

        //SquaredDisplacement is just Pythagoras's theorem without sqrt
    if(squaredDisplacement(waypoints->at(nextNode)) < 100)
        currentNode = nextNode;
}
bool Car::onRightOf(XMVECTOR forwards, XMFLOAT3 b)
{
    forwards = XMVector3AngleBetweenVectors(forwards, XMLoadFloat3(&b));
    XMStoreFloat3(&b, forwards);
    if(b.x <= XM_PI / 4) //So it doesn't have to be exact
                         //The onLeftOf has a >= instead of <=
        return false;
    return true;
}

我知道 XMVector3AngleBetweenVectors 将始终返回正值,但如果不是的话,它会很出色。

最佳答案

让我们 vector

CB = b - CurrentPosition   

(我在您的代码中没有看到 curr.pos. 的变量)

然后找到表达式的符号(它是 vector 乘积的Y分量,如叉积)

forwards.X * CB.z -forwards.X * CB.X

如果为正,则 B 离开当前路径,如果为负 - 向右

关于c++ - 如何检查 3D 点是在 vector 的左侧还是右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23029334/

相关文章:

java - 我怎样才能将 Line2D 与 Java 中的区域相交?

algorithm - 检测位图中的三角形

api - 我应该针对哪个版本的 OpenGL/Direct3D 以获得最佳兼容性?

c++ - 为什么要为结构的多个数据成员而不是单个成员添加填充?

c++ - round 函数返回错误的双重估计

c++ - 查找所有子字符串的出现和位置

c++ - OpenCV错误使用逆

ios - 在 Swift 中动画 drawRect 圆

c++ - 计算具有旋转前位置和旋转角度的点的绝对位置

winapi - 为什么不使用 GDI 用数组中的 RGB 数据重复填充窗口?