Отсечение

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Отсечение

Сообщение GLEB » 01.02.2006 (Ср) 20:53

Как можно проверить попадает ли прямоугольник в пирамиду камеры.
Как проверить попадание точки или сферы я знаю, тут все просто.
А как быть с прямоугольником.
Проверяю последовательно его 8 вершин, если одна из них попала в обзор, значит - попадает.
А если он больших размеров и камера упирается в него, то ни одна вершина не попадает в камеру... и что тогда делать?

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 02.02.2006 (Чт) 9:42

Код: Выделить всё
Public Function BOXFR2(x1 As Single, y1 As Single, z1 As Single, x2 As Single, y2 As Single, z2 As Single) As Boolean
Dim i As Integer
For i = 0 To 5
 
    If m_frustumPlanes(i).m_normal.x * x1 + _
      m_frustumPlanes(i).m_normal.y * y1 + _
      m_frustumPlanes(i).m_normal.z * z1 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x2 + _
      m_frustumPlanes(i).m_normal.y * y1 + _
      m_frustumPlanes(i).m_normal.z * z1 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x1 + _
      m_frustumPlanes(i).m_normal.y * y2 + _
      m_frustumPlanes(i).m_normal.z * z1 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
     ' continue;

    If m_frustumPlanes(i).m_normal.x * x2 + _
      m_frustumPlanes(i).m_normal.y * y2 + _
      m_frustumPlanes(i).m_normal.z * z1 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x1 + _
      m_frustumPlanes(i).m_normal.y * y1 + _
      m_frustumPlanes(i).m_normal.z * z2 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x2 + _
      m_frustumPlanes(i).m_normal.y * y1 + _
      m_frustumPlanes(i).m_normal.z * z2 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x1 + _
      m_frustumPlanes(i).m_normal.y * y2 + _
      m_frustumPlanes(i).m_normal.z * z2 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    If m_frustumPlanes(i).m_normal.x * x2 + _
      m_frustumPlanes(i).m_normal.y * y2 + _
      m_frustumPlanes(i).m_normal.z * z2 + m_frustumPlanes(i).m_distance > 0 Then GoTo L1
      'continue;

    BOXFR2 = False
    Exit Function
L1:
Next
 
BOXFR2 = True
End Function


Вот нашел если еще может кому надо.
А есть в VB аналог continue и вообще что он делает, вроде продолжает выполнение цикла перепрыгивая через то что после него или нет.
И что тут можно оптимизировать. Функция довольно тормозная.
Будет ли толк, если написать на VC++, скомпилить в DLL и вызвать из VB. Или без толку это.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

    TopList