Проблема с вычислением точек усечения и плоскостей

#c #graphics

Вопрос:

У меня возникли трудности с вычислением 8 точек для квадратного усеченного конуса и последующих плоскостей. Моя реализация приведена ниже вместе с небольшой функцией для проверки того, находится ли точка внутри усеченного конуса. По какой-то причине все и вся точки рассчитываются так, чтобы существовать внутри него…

     float NPD = 1;
    float FPD = 1000;
    float fov = 180 * (PI_VAL / 180);
    float viewRat = 1;

    Vec3 up(0, 1, 0);
    Vec3 right(1, 0, 0);
    Vec3 view(0, 0, 1);
    Vec3 NPC = position - Vec3(0, 0, 1) * NPD;
    Vec3 FPC = position - Vec3(0, 0, 1) * FPD;
    float NH = 2 * tan(fov / 2) * FPD;
    float FH = 2 * tan(fov / 2) * FPD;
    float NW = NH * viewRat;
    float FW = FH * viewRat;

    Vec3 ftl = FPC   up * (FH * 0.5) - right * (FW * 0.5);
    Vec3 ftr = FPC   up * (FH * 0.5)   right * (FW * 0.5);
    Vec3 fbl = FPC - up * (FH * 0.5) - right * (FW * 0.5);
    Vec3 fbr = FPC - up * (FH * 0.5)   right * (FW * 0.5);

    Vec3 ntl = NPC   up * (NH * 0.5) - right * (NW * 0.5);
    Vec3 ntr = NPC   up * (NH * 0.5)   right * (NW * 0.5);
    Vec3 nbl = NPC - up * (NH * 0.5) - right * (NW * 0.5);
    Vec3 nbr = NPC - up * (NH * 0.5)   right * (NW * 0.5);

    Vec3 pl1, pl2, pl3, lpNorm, tpNorm, rpNorm, bpNorm, crossP;

    pl1 = nbl;
    pl2 = fbl;
    pl3 = ftl;
    crossP = cross(pl2 - pl1, pl3 - pl2);
    lpNorm = norm(crossP);
    planes[0].normal = lpNorm;

    pl1 = ntl;
    pl2 = ftl;
    pl3 = ftr;
    crossP = cross(pl2 - pl1, pl3 - pl2);
    tpNorm = norm(crossP);
    planes[1].normal = tpNorm;

    pl1 = ntr;
    pl2 = ftr;
    pl3 = fbr;
    crossP = cross(pl2 - pl1, pl3 - pl2);
    rpNorm = norm(crossP);
    planes[2].normal = rpNorm;

    pl1 = nbr;
    pl2 = fbr;
    pl3 = fbl;
    crossP = cross(pl2 - pl1, pl3 - pl2);
    bpNorm = norm(crossP);
    planes[3].normal = bpNorm;
 

Метод проверки того, находится ли точка внутри усеченного конуса…где расстояние-это точечное произведение нормали плоскости и точки для проверки.

     for (int i = 0; i < 6; i  )
        {
            if (planes[i].distance(targetPosition) < 0)
            {
                return false;
            }
        }
    return true;