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

Сравнение объектов

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

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

    ENGine Пользователь сайта

    С нами с:
    27.01.2006
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    2
    Подскажите пожалуйста, как нужно сравнивать 2 объекта(геометрия) в максе:
    objArray = #()

    for obj in geometry do
    if ( obj == obj_const ) then print "Равны" пусть будет так

    но вот у меня в сцени два бокса, один является клоном другого и все равно не работает -( ?
     
  2. RENDERATOR

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

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Естественно не работает, ты же сравниваешь ссылки на обьекты, а они естественно разные.
    Чтобы сравнить геометрию необходимо перебирать вершины у обоих обьектов и сравнивать их координаты.
    В общем что-то вроде

    Код:
    m1 = copy obj_const.mesh
    m2 = copy obj.mesh
    if m1.numVerts != m2.numVerts then return false
    for i = 1 to m2.numVerts do
    (
    v1 = getVert m1 i
    v2 = getVert m2 i
    if v1 != v2 then return false
    )
    return true
    
     
  3. ENGine

    ENGine Пользователь сайта

    С нами с:
    27.01.2006
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    2
    спасибо буду разбираться =-)
     
  4. ENGine

    ENGine Пользователь сайта

    С нами с:
    27.01.2006
    Сообщения:
    25
    Симпатии:
    0
    Баллы:
    2
    Спасибо работает, вот как я делаю
    Код:
                  objArray = #()
    	
    		for obj in geometry do
    			if (obj.name != "SceneBox") then append objArray obj
    									
    		for i = 1 to objArray.count-1 do
    			for j = i+1 to objArray.count do
    			(
    				if ( (objArray[i] != undefined) and (objArray[j] != undefined) ) then 
    				(
    					m1 = objArray[i].mesh
    					m2 = objArray[j].mesh
    					if ( m1.numVerts == m2.numVerts ) then
    					(
    						b = true
    						for i = 1 to m1.numVerts do 
    						( 
    							v1 = getVert m1 i 
    							v2 = getVert m2 i 
    							if ( v1 != v2 ) then b = false 
    						) 
    					)
    					if ( b == true ) then objArray[j] = undefined
    				)
    			)
    
    Я хотел сделать просто чтобы при экспорте моделей из макса была проверка одинаковых моделей и если таковые имеются экспортировал одну из них. Все работает, но теперь я думаю что такая проверка занимает ещёё больше времени, чем экспорт тупо всех объектов =( (доказательство тому элементарная сцена с 4 чайниками и одним боксом) Вначале я вообще думал макс завис, а оказывается это была вот это проверочка. Что действительно получается лучше экспортировать всю сцену ?
     
  5. RENDERATOR

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

    С нами с:
    27.01.2003
    Сообщения:
    83
    Симпатии:
    0
    Баллы:
    12
    Перепиши m1 = objArray.mesh на m1 = copy objArray.mesh - быстрее будет. И потом если у двух объектов разное количество вершин, то они уж точно не одинаковы, зачем еще сравнивать у них координаты вершин? - Сразу переходи к сравнению следующей пары. Тоже самое и со сравнением самих координат вершин - если уже попались две не равные вершины- зачем после этого сравнивать все остальные - тоже сразу переходи к сравнению следующей пары. В общем у тебя много ненужного делается в скрипте - убери весь мусор будет летать даже с миллионом объектов.
     
Модераторы: Savin Denis

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