Render.ru

Runtime error: Vertex index in face out of range

Почемучкин

Активный участник
Рейтинг
7
#1
Здравствуйте, Знатоки!

Помогите, пожалуйста, решить проблему.
Когда я импортирую файл модели, содержащий 3 меша (тело и 2 пистолета), как один цельный меш, то все импортируется без проблем.
Однако, при попытке импорта этого же файла модели, как 3 раздельных меша, я получаю следующую ошибку:
--Runtime error: Vertex index in face out of range: [1806,1805,1804]
в строке:
Код:
newMesh = mesh name:"model" vertices:aVerts[i] faces:aTris[i] tverts:aUV[i] vnorms:aNorms[i]
При этом меш тела импортируется, а меши пистолетов нет.
Судя из ошибки, индексы вершин в гранях мешей пистолетов выходят за пределы.

Код:
aNumVerts: #(1707, 202, 202) --количество вершин в каждом раздельном меше
iTotalVerts: 2111 --общее количество вершин в цельном меше
aNumTris: #(2276, 184, 184) --количество граней в каждом раздельном меше
iTotalTris: 2644 --общее количество граней в цельном меше
Структура данных о вершинах последовательная, т.е. сперва идут данные о вершинах (1707) тела,
затем данные о вершинах 1-ого пистолета (202), затем данные о вершинах 2-ого пистолета (202).
То же самое и с данными о гранях, т.е. сперва идут данные о гранях (2276) тела,
затем данные о гранях 1-ого пистолета (184), затем данные о гранях 2-ого пистолета (184):
--тело
aTris[1][1]: [139,122,132]
aTris[1][2]: [132,146,139]
aTris[1][3]: [144,147,139]
aTris[1][4]: [136,139,147]
aTris[1][5]: [122,139,136]
aTris[1][6]: [139,146,144]
aTris[1][7]: [124,122,136]
aTris[1][8]: [124,123,122]
aTris[1][9]: [122,123,131]
aTris[1][10]: [132,122,131]
...
aTris[1][2267]: [120,161,160]
aTris[1][2268]: [162,160,161]
aTris[1][2269]: [161,163,162]
aTris[1][2270]: [121,118,130]
aTris[1][2271]: [121,130,148]
aTris[1][2272]: [129,148,130]
aTris[1][2273]: [128,148,129]
aTris[1][2274]: [128,129,125]
aTris[1][2275]: [125,126,128]
aTris[1][2276]: [127,126,125]
--пистолет 1
aTris[2][1]: [1806,1805,1804]
aTris[2][2]: [1804,1807,1806]
aTris[2][3]: [1816,1806,1807]
aTris[2][4]: [1806,1816,1817]
aTris[2][5]: [1804,1808,1807]
aTris[2][6]: [1804,1809,1808]
aTris[2][7]: [1809,1818,1808]
aTris[2][8]: [1885,1876,1875]
aTris[2][9]: [1875,1876,1867]
aTris[2][10]: [1875,1867,1868]
...
aTris[2][175]: [1766,1740,1741]
aTris[2][176]: [1741,1769,1766]
aTris[2][177]: [1768,1767,1766]
aTris[2][178]: [1766,1769,1768]
aTris[2][179]: [1748,1747,1746]
aTris[2][180]: [1746,1749,1748]
aTris[2][181]: [1892,1891,1890]
aTris[2][182]: [1890,1893,1892]
aTris[2][183]: [1888,1887,1886]
aTris[2][184]: [1886,1889,1888]
--пистолет 2
aTris[3][1]: [2087,2078,2077]
aTris[3][2]: [2077,2078,2069]
aTris[3][3]: [2077,2069,2070]
aTris[3][4]: [2069,2072,2071]
aTris[3][5]: [2071,2070,2069]
aTris[3][6]: [2071,2083,2070]
aTris[3][7]: [2083,2071,2084]
aTris[3][8]: [2008,2007,2006]
aTris[3][9]: [2006,2009,2008]
aTris[3][10]: [2018,2008,2009]
...
aTris[3][175]: [1968,1942,1943]
aTris[3][176]: [1943,1971,1968]
aTris[3][177]: [1970,1969,1968]
aTris[3][178]: [1968,1971,1970]
aTris[3][179]: [1950,1949,1948]
aTris[3][180]: [1948,1951,1950]
aTris[3][181]: [2094,2093,2092]
aTris[3][182]: [2092,2095,2094]
aTris[3][183]: [2090,2089,2088]
aTris[3][184]: [2088,2091,2090]
Как можно решить данную проблему?
 

LastJedi

Знаток
Рейтинг
27
#2
Так если импортировать как три разных объекта, то вершины надо переиндексировать для объектов, кроме первого. Номера вершин каждого последующего объекта должны быть уменьшены на величину, равную количеству вершин предыдущих объектов.
 

Почемучкин

Активный участник
Рейтинг
7
#3
Так если импортировать как три разных объекта, то вершины надо переиндексировать для объектов, кроме первого. Номера вершин каждого последующего объекта должны быть уменьшены на величину, равную количеству вершин предыдущих объектов.
Не могли вы привести пример кода, а то я все еще балбес в макссриптинге и не понимаю, как это сделать?
UPD: Спасибо за подсказку. Сделал перерасчет номеров вершин при составлении граней.
Код:
--исправляем нумерацию вершин в каждой сетке
        append aFix 0 --добавляем значение 0 в массив aFix, нужно для пересчета номеров вершин
        join aFix aNumVerts --присоединяем все элементы массива aNumVerts к массиву aFix
        
        for i = 2 to iNumMeshes do --не трогаем первые 2 элемента массива aFix
        (
            aFix[i + 1] = (aFix[i] + aFix[i + 1]) --пересчитываем остальные элементы начиная с 3-го
        )   
        
        for i = 1 to iNumMeshes do
        (
            local aTemp = #() --создаем массив для хранения граней в сетке[i]
                      
            for n = 1 to aNumTris[i] do
            (
                --читаем грань в сетке[i] и добавляем в массив aTemp
                append aTemp [(readShort bs + 1) - aFix[i], (readShort bs + 1) - aFix[i], (readShort bs + 1) - aFix[i]]
            )   
            
            append aTris aTemp --добавляем массив aTemp в массив aTris
Теперь все меши импортируются раздельно, как и хотел.
Однако, теперь я столкнулся с новой проблемой - не импортируются текстурные вершины и появляется сообщение об ошибке: "ERROR! BuildTVFaces: Mesh has no texture vertices!"
Код:
    for i = 1 to iNumMeshes do
        (            
            newMesh = mesh name:"model" vertices:aVerts[i] faces:aTris[i] tverts:aUV[i] vnorms:aNorms[i]
            newMesh.wireColor = color (random 0 255) (random 0 128) (random 0 255)
            
            try
            (               
                BuildTvFaces newMesh false
                
                for t = 1 to aTris[i].count do
                (
                    setTvFace newMesh t aTris[t]
                )
                
                update newMesh
            )   
            catch
            (
                format "ERROR! BuildTVFaces: Mesh has no texture vertices!\n"
            )
Что я делаю не так и как это можно исправить?
 
Последнее редактирование:

LastJedi

Знаток
Рейтинг
27
#4
В сообщении об ошибке указано, что сетка не имеет вершин с текстурными координатами. Из чего можно было бы предположить проблему с массивом aUV[i]. Возможно он пустой?..

Однако, сейчас такое сообщение будет выводиться при любой ошибке внутри блока try. Имеет смысл временно убрать try-catch, чтобы увидеть системное сообщение об ошибке.
 

Почемучкин

Активный участник
Рейтинг
7
#5
Имеет смысл временно убрать try-catch, чтобы увидеть системное сообщение об ошибке.
Временно убрал и смог найти ошибку. Оказалось, что это моя оплошность.
Я забыл изменить aTris[t] на aTris[i][t], чтобы для каждого меша использовались свои грани.Теперь текстурные вершины импортируются нормально для каждого меша.

Огромное вам спасибо за помощь! Вы уж извините, если мои вопросы показались глупыми.
Я не программист, просто увлекаюсь в свободное от работы время реверс инженерингом и макскриптингом как хобби. :)
 
Сверху