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