Render.ru

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

ENGine

Пользователь сайта
Рейтинг
2
#1
Подскажите пожалуйста, как нужно сравнивать 2 объекта(геометрия) в максе:
objArray = #()

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

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

RENDERATOR

Активный участник
Рейтинг
15
#2
Естественно не работает, ты же сравниваешь ссылки на обьекты, а они естественно разные.
Чтобы сравнить геометрию необходимо перебирать вершины у обоих обьектов и сравнивать их координаты.
В общем что-то вроде

Код:
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
 

ENGine

Пользователь сайта
Рейтинг
2
#4
Спасибо работает, вот как я делаю
Код:
              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 чайниками и одним боксом) Вначале я вообще думал макс завис, а оказывается это была вот это проверочка. Что действительно получается лучше экспортировать всю сцену ?
 

RENDERATOR

Активный участник
Рейтинг
15
#5
Перепиши m1 = objArray.mesh на m1 = copy objArray.mesh - быстрее будет. И потом если у двух объектов разное количество вершин, то они уж точно не одинаковы, зачем еще сравнивать у них координаты вершин? - Сразу переходи к сравнению следующей пары. Тоже самое и со сравнением самих координат вершин - если уже попались две не равные вершины- зачем после этого сравнивать все остальные - тоже сразу переходи к сравнению следующей пары. В общем у тебя много ненужного делается в скрипте - убери весь мусор будет летать даже с миллионом объектов.
 
Сверху