#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;