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

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

Тема в разделе "MAXScript", создана пользователем McST, 12 фев 2008.

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

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    Давно волновал вопрос, а сейчас назрело желание этим заняться.

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

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Индекс это просто порядковый номер ячейки в массиве точек.
     
  3. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    да, я в курсе,
    но меня волнует вопрос можно ли как-то на более глубоком уровне перераспределить этот массив: сказать вертексу с индексом 3 поменяться индексом с вертексом 5.
     
  4. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Индесы менять нельзя, все остальное можно.
    Можеш обменяться координатами для этих вертексов.
    Лучше сразу пиши что хочеш получить.
     
  5. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    хочется что-то восстанавливающее структуру меша для морфтаргетов и любых других задач, где требуется взаимнооднозначное соответствие между вертексами, по референсному мешу например.
     
  6. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Просто копируется базовая и вертексам назначаются новые координаты.
    Задачка поинтересней найти соответствие вертексов, как минимум у них должно быть что-то обшее:
    1. позиция вертексов
    2. развертка
    3. топология фейсов
     
  7. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    -общим может быть позиция например,
    -топология желательно чтоб сохранялась
    -и тут же надо учитывать что нужно чтобы и UV координаты вертексов после перестановки оказались на правильных местах, чтоб мапинг не слетел.

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

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

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Тебе сегодня везет , откопал скриптик у себя в архивах, когдато писал на эту тему:

    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
    
     
  9. McST

    McST Знаток

    С нами с:
    01.06.2002
    Сообщения:
    609
    Симпатии:
    1
    Баллы:
    28
    Большое спасибо, за помощь
     
Модераторы: Savin Denis

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