Как скрыть / не рисовать часть модели

#c# #3d #xna-4.0

#c# #3D #xna-4.0

Вопрос:

У меня есть анимированная модель, которая вращается.

Я хочу скрыть / не рисовать какую-либо часть модели, У которой Y<0

какими способами я могу это сделать?

идеи:

1) нарисуйте гигантский прямоугольный прямоугольник прямо под y = 0

2) настройте матрицу камеры так, чтобы y<0 находился за пределами плоскости отсечения (но я понятия не имею, как)

может кто-нибудь указать мне правильное направление? =)

Ответ №1:

Чисто математический подход:

  • Не рисуйте полигоны, у которых все y меньше 0.
  • Нарисуйте полигоны, у которых все y больше или равно 0.
  • Обрежьте остальные полигоны плоскостью y = 0 и нарисуйте их.

Если полигоны, составляющие модель, являются треугольниками, их обрезка довольно тривиальна. Вам нужно обрезать две стороны, пересекающиеся с плоскостью y = 0, и заменить исходные вершины, у которых y меньше 0, на точки пересечения этих двух сторон с плоскостью отсечения.

Используйте линейные уравнения:
(x-x1) = (x2-x1) *(y-y1)/(y2-y1)
(z-z1) = (z2-z1) *(y-y1)/(y2-y1)

где 1 и 2 — это вершины стороны, обрезанной плоскостью y = 0. Подставьте их координаты (x1, y1, z1, x2, y2, z2) и y = 0 в уравнения, чтобы получить x и z точки пересечения. Используйте координаты этой точки вместо вершин 1 или 2 (в зависимости от того, у кого y < 0).

Если полигоны сопоставлены с текстурой, вам нужно будет пересчитать координаты текстуры для вершин, которые вы получили в результате обрезки. Вы делаете это таким же образом.

Комментарии:

1. я здесь немного запутался, поэтому мне нужно обрезать вершины модели? если да, то какие функции я буду вызывать, чтобы обрезать их?

2. @Krispy: возможно, вам придется реализовать их самостоятельно, если в используемых библиотеках нет ничего подходящего.

Ответ №2:

Похоже, вам нужно ввести ограничивающее усечение MSDN

Вот хороший учебник с сайта GameDev от Nic.