Помогите, пожалуйста, решить проблему.
Когда я импортирую файл модели, содержащий 3 меша (тело и 2 пистолета), как один цельный меш, то все импортируется без проблем.
Однако, при попытке импорта этого же файла модели, как 3 раздельных меша, я получаю следующую ошибку:
--Runtime error: Vertex index in face out of range: [1806,1805,1804]
При этом меш тела импортируется, а меши пистолетов нет.
Судя из ошибки, индексы вершин в гранях мешей пистолетов выходят за пределы.
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Так если импортировать как три разных объекта, то вершины надо переиндексировать для объектов, кроме первого. Номера вершин каждого последующего объекта должны быть уменьшены на величину, равную количеству вершин предыдущих объектов.
Не могли вы привести пример кода, а то я все еще балбес в макссриптинге и не понимаю, как это сделать?
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"
)
В сообщении об ошибке указано, что сетка не имеет вершин с текстурными координатами. Из чего можно было бы предположить проблему с массивом [ICODE]aUV[/ICODE]. Возможно он пустой?..
Однако, сейчас такое сообщение будет выводиться при любой ошибке внутри блока [ICODE]try[/ICODE]. Имеет смысл временно убрать [ICODE]try-catch[/ICODE], чтобы увидеть системное сообщение об ошибке.
LastJediИмеет смысл временно убрать [ICODE]try-catch[/ICODE], чтобы увидеть системное сообщение об ошибке.
Временно убрал и смог найти ошибку. Оказалось, что это моя оплошность.
Я забыл изменить [ICODE]aTris[t][/ICODE] на [ICODE]aTris[t][/ICODE], чтобы для каждого меша использовались свои грани.Теперь текстурные вершины импортируются нормально для каждого меша.
Огромное вам спасибо за помощь! Вы уж извините, если мои вопросы показались глупыми.
Я не программист, просто увлекаюсь в свободное от работы время реверс инженерингом и макскриптингом как хобби. 🙂
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Почемучкин
Помогите, пожалуйста, решить проблему.
Когда я импортирую файл модели, содержащий 3 меша (тело и 2 пистолета), как один цельный меш, то все импортируется без проблем.
Однако, при попытке импорта этого же файла модели, как 3 раздельных меша, я получаю следующую ошибку:
в строке:
При этом меш тела импортируется, а меши пистолетов нет.
Судя из ошибки, индексы вершин в гранях мешей пистолетов выходят за пределы.
Структура данных о вершинах последовательная, т.е. сперва идут данные о вершинах (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
Почемучкин
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
Однако, сейчас такое сообщение будет выводиться при любой ошибке внутри блока [ICODE]try[/ICODE]. Имеет смысл временно убрать [ICODE]try-catch[/ICODE], чтобы увидеть системное сообщение об ошибке.
Почемучкин
Я забыл изменить [ICODE]aTris[t][/ICODE] на [ICODE]aTris[t][/ICODE], чтобы для каждого меша использовались свои грани.Теперь текстурные вершины импортируются нормально для каждого меша.
Огромное вам спасибо за помощь! Вы уж извините, если мои вопросы показались глупыми.
Я не программист, просто увлекаюсь в свободное от работы время реверс инженерингом и макскриптингом как хобби. 🙂