определение, находится ли значение в диапазоне с проблемой 0 = 360 градусов - PullRequest
1 голос
/ 13 июня 2010

Я делаю кусок кода для приложения DirectX. Это значит не показывать лица, которые не видны. Обычно это был бы просто использование Z-буфера, но я делаю много ходов и вращений меша, поэтому я хотел бы не делать их и экономить вычислительную мощность. Я опишу это на кубе. Вы смотрите спереди, поэтому вы видите только одно лицо, и вам не нужно поворачивать 5, что осталось. Если бы у вас была одна сторона куба из 100 * 100 мешей, было бы здорово, если бы вам не приходилось переворачивать мешы размером в 50 Кб, которые вам действительно не нужны. Итак, я сохранил X, Y, Z вращение камеры (Z вращение я не использую), а также X, Y, Z вращение граней. В этом упрощенном кубе я вижу лица, которые делают это утверждение верным:

cRot //camera rotation in degrees

oRot //face rotation in degrees

if(oRot.x > cRot.x-90 && oRot.x < cRot.x+90
    && oRot.y > cRot.y-90 && oRot.y < cRot.y+90)

Но возникает проблема. Если я поверну вокруг, камера может получить значение 330, например. В этом состоянии я бы увидел переднюю и правую часть куба. Правая сторона имеет вращение 270, так что все правильно в утверждении IF. Проблема с 0 вращением передней грани, что также на 360 градусов.

Поэтому мой вопрос заключается в том, как заставить это утверждение работать, потому что, когда я использую модуль по модулю, он потерпит неудачу для этой правой стороны и таким образом не будет работать для 0 = 360.

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Вы хотите проверить, отличается ли oRot от cRot хотя бы на 90 градусов?

<code>//integral
if ((360 + cRot - oRot) % 360 >= 90) ...</p>

<p>//floating point
diff = abs(cRot - oRot);
if (diff >= 90 && diff <= 270) ...
0 голосов
/ 13 июня 2010

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

...