1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Пересечение объетков

Тема в разделе "MAXScript", создана пользователем -VZ-, 22 апр 2007.

Модераторы: Savin Denis
  1. -VZ-

    -VZ- Активный участник

    С нами с:
    24.01.2006
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Добрый день! Подскажите пожалуйста, как программно описать проверку: пересекаются объекты на сцене или нет?
    Заранее благодарю!
     
  2. Максим Смирнов 36776

    Максим Смирнов 36776 Пользователь сайта

    С нами с:
    17.02.2007
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    2
    Я в своё время тоже искал информацию на эту тему. Стандартной функции в MAXscript я не нашёл, поэтому написал свою.
    функция проверяет пересечение треугольника с линией. В цикле подкидываем в неё треугольники и edge.

    v1,v2,v3 - координаты вершин треугольника
    norm - нормаль треугольника
    p1,p2 - координаты точек линии
    Код:
    fn checkInterestTriangAndLine v1 v2 v3 norm p1 p2 = (
    
    	r1 = dot norm (p1 - v1)
    	r2 = dot norm (p2 - v1)
    	
    	if(sgn r1 != sgn r2) then (
    
    	vector1 = (p1 + ((p2 - p1) * (-r1/(r2 - r1))))
    	
    	if( ( dot ( cross (v2 - v1) (vector1 - v1)) norm) <=0 ) then false	
    	else if( ( dot ( cross (v3 - v2) (vector1 - v2)) norm) <=0 ) then false	
    	else if( ( dot ( cross (v1 - v3) (vector1 - v3)) norm) <=0 ) then false
    	else vector1
    	) else false
    )
    
    может поможет
     
  3. -VZ-

    -VZ- Активный участник

    С нами с:
    24.01.2006
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Спасибо! Но я нашел, по моему, лучший способ:
    Функция, которая делает пересечение объектов
    Код:
    fn intersect sourseObj interObj = 
    (
    inter = (copy sourseObj) * interObj
    interData = GetTriMeshFaceCount inter
    delete inter
    )
    где sourseObj - объект который проверяем
    interObj - объект который пересекает
    inter - сюда ми записываем результат пересечения(новый объект)
    interData - сюда записываем данные пересечения

    А потом в самой программе делаем, например, вот такую проверку:
    Код:
    if interData[2] > 0 then print "1" else print "0"
    Тоесть проверяем количество вершин, которые создались после пересечения объектов.

    Попробуй, может эта функция тебе больше понравиться.
    Удачи!!!
     
  4. Максим Смирнов 36776

    Максим Смирнов 36776 Пользователь сайта

    С нами с:
    17.02.2007
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    2
    да, точно, совсем забыл про этот способ, но в моем случае он не подходил. мне надо было детектить самопересечения одной сетки после Skin модификатора
     
Модераторы: Savin Denis

Поделиться этой страницей