Render.ru

изменение индексации вертексов

McST

Знаток
Рейтинг
28
#1
Давно волновал вопрос, а сейчас назрело желание этим заняться.

Собственно, можно ли как-то изменить номер индекса у вертекса?
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Индекс это просто порядковый номер ячейки в массиве точек.
 

McST

Знаток
Рейтинг
28
#3
да, я в курсе,
но меня волнует вопрос можно ли как-то на более глубоком уровне перераспределить этот массив: сказать вертексу с индексом 3 поменяться индексом с вертексом 5.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Индесы менять нельзя, все остальное можно.
Можеш обменяться координатами для этих вертексов.
Лучше сразу пиши что хочеш получить.
 

McST

Знаток
Рейтинг
28
#5
хочется что-то восстанавливающее структуру меша для морфтаргетов и любых других задач, где требуется взаимнооднозначное соответствие между вертексами, по референсному мешу например.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#6
Просто копируется базовая и вертексам назначаются новые координаты.
Задачка поинтересней найти соответствие вертексов, как минимум у них должно быть что-то обшее:
1. позиция вертексов
2. развертка
3. топология фейсов
 

McST

Знаток
Рейтинг
28
#7
-общим может быть позиция например,
-топология желательно чтоб сохранялась
-и тут же надо учитывать что нужно чтобы и UV координаты вертексов после перестановки оказались на правильных местах, чтоб мапинг не слетел.

просто, второй проблемой у меня как раз стоит еще именно как определить соответсиве UV-вертекса к самому вертексу, потому как когда я пробовал, у меня не получилось найти способ, т.е. есть индекс вертекса: как найти индекс UV-вертекса которому он соответсвует и наоборот?

P.S. а просто копирование референсного меша не подходит т.к. в обычной ситуации я так бы и поступил, хочется именно решение замены, с учетом того что этот меш может быть уже связан разными зависимостями с другими вещами в сцене: модификаторы, констрейны, кастомные атрибуты и пр....
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#8
Тебе сегодня везет , откопал скриптик у себя в архивах, когдато писал на эту тему:

Copy Map to Dest

Скрипт копирует исправленную карту текстурных координат UV Map
на объект отличающийся индексацией вершин, но со сходной топологией,
одинаковым числом вершин и совпадающими локальными координатами вершин.
Замечание: Не допускаются такие ошибки как расположенные в одном и том же
месте вертексы или слишком близко расположенные точки.



Код:
-- Copy Map to Dest.ms
-- Create:
-- By Denis Savin (denis_savin@mail.ru)
-- v 1.00

threshold = 0.001
Obj_Source = $Object01
Obj_Dest   = $Object02

num_verts = Obj_Source.numverts 
num_faces = Obj_Source.numfaces
tvnum = Obj_Source.numtverts 

vertToDest = #()

-- Search reference index array source Vert to Dest Verts

for i = 1 to num_verts do
(
 local p_src
 in coordsys local p_src = getVert Obj_Source i
 local fStop = true
	for j = 1 to num_verts while fStop do
	(
		local p_dst
		in coordsys local p_dst = getVert Obj_Dest j
		local d = distance p_src p_dst
		if d < threshold then (fStop = false; append vertToDest j)
	)
	if fStop do format "Error: Not Foind for Source Vertex:%   Equivalent Destination Vertex !\n" i
)

fn getFaceFrom3Verts obj verts = (
local a1 = meshop.getFacesUsingVert   obj verts[1]
local a2 = meshop.getFacesUsingVert   obj verts[2]
local a3 = meshop.getFacesUsingVert   obj verts[3]
local r = (a1 * a2 *a3)
if r.numberset != 1 do (
format "Error: fn getFaceFrom3Verts !\n"
format "verts:%\n a1:% a2:% a3:% r:%\n" verts a1 a2 a3 r
select obj.verts[#{verts[1],verts[2],verts[3]}]
subobjectLevel = 1
update obj
)
(r as array)[1]
)

fn point3ToDest p = [vertToDest[p.x],vertToDest[p.y],vertToDest[p.z]]

------------------
-- Copy Texture Coord

setNumTVerts  Obj_Dest tvnum

for j= 1 to tvnum do 
( 
local t = getTVert Obj_Source j 
setTVert  Obj_Dest j t
) 


------------------
-- Copy Texture Face Index

for i = 1 to num_faces do
(

local sFace = getFace Obj_Source i
--local t = getTVert mObj j 
local sMatid = getTVFace Obj_Source i
local dFace = point3ToDest sFace
local dFaceNum = getFaceFrom3Verts Obj_Dest dFace
setTVFace Obj_Dest dFaceNum sMatid
)

update Obj_Dest
 
Сверху