[GTA] Como corrigir paredes invisíveis em COL do Sketchup
Enviado: 22 Mai 2021, 22:11
English: f296-tutorial/t6557-gta-how-to-fix-invi ... etchup-col
Se você já modelou algo para o mapa do GTA utilizando Sketchup, e provavelmente outros software de modelagem CAD, notou que o modelo de colisão (colisor) cria várias faces invisíveis, como se fossem paredes invisíveis, semi aleatórias. Infelizmente são invisíveis inclusive pelo Draw Cols SA.
Elas são afetadas somente por pessoas e veículos, nem a câmera, nem a sombra é afetada, portanto é muito chato e difícil encontrá-las e compreende-las.
Isto é causado porque o Sketchup preenche as T Vertices com um triângulo no meio, e isto normalmente só é notável após exportar o modelo.
Veja abaixo, na primeira imagem vemos um T Vertice, não parece nada demais, mas se você puxar a vértice, notará que existe um triângulo ali no meio. O Sketchup faz isso para preencher a T Vertice (em vez de cortar a aresta).

Isto é o causador do bug no seu modelo de colisão. Agradecimentos ao jujubão pela explicação.
É completamente inviável corrigir cada uma manualmente, então eu procurei por uma solução automatizada: selecionar e apagar todas as faces com baixo valor de área, isto é, pequenas, finas.
Na imagem abaixo, eu selecionei todas numa região e levantei elas para vê-las. São muitas!

Para selecionar automaticamente todas essas faces, para em seguida deletá-las, eu usei o script SelectArea no 3DS Max.
Caso link se perder, aqui o script, salve em .mcr:
Aqui você tem o meu download, incluindo um script que eu editei para setar todos os materiais como diffuse branco (corrige modelo escuro e saturado na transição de LOD) e corrigir alguns materiais abrindo com opacidade 0.
Outros softwares de modelagem podem ter soluções semelhantes disponíveis.
Eu recomendo que você coloque o arquivo na pasta
Assim, na mesh selecionada, adicione o Modifier
Digite um valor baixo, eu recomendo
Dica: Na janela do script, clique no nome do objeto e em seguida em outro no scene explorer, logo ao clicar, irá se aplicar ao outro, assim você faz rapidamente em todos os objetos da cena, basta deixar selecionado a ferramenta de mover, se aparecer o pivot para mover, é porque há faces selecionadas para deletar.
Eu também notei que a exportação de col através do
Importante: isto tem que ser feito com todas as faces trianguladas, uma maneira simples de triangular é, também no
Também importante: É essencial otimizar o modelo de colisão antes de usá-lo, além de uma importante melhoria no desempenho do jogo, isso evita muitíssimo as faces invisíveis. Leia a seção "Otimizar COL" do tutorial avançado de como criar mod de mapa.
Caso ainda continue alguma face invisível, verifique novamente, seguindo atentamente os passos (inclusive, pode ser que uma nova face apareceu enquanto você mexia no modelo), e caso realmente tudo esteja certo, não haverá outro modo a não ser corrigir manualmente. Eu modelei uma pequena cidade houve dezenas, senão mais de 100 desses bugs, e após a correção, sobrou somente uma! Era em um muro reto, não tinha essa face lá, então eu simplesmente selecionei as faces no Coll Editor e cliquei em
Recomendo:
Como usar Sketchup para GTA / desenvolvimento de jogos
Se você já modelou algo para o mapa do GTA utilizando Sketchup, e provavelmente outros software de modelagem CAD, notou que o modelo de colisão (colisor) cria várias faces invisíveis, como se fossem paredes invisíveis, semi aleatórias. Infelizmente são invisíveis inclusive pelo Draw Cols SA.
Elas são afetadas somente por pessoas e veículos, nem a câmera, nem a sombra é afetada, portanto é muito chato e difícil encontrá-las e compreende-las.
Isto é causado porque o Sketchup preenche as T Vertices com um triângulo no meio, e isto normalmente só é notável após exportar o modelo.
Veja abaixo, na primeira imagem vemos um T Vertice, não parece nada demais, mas se você puxar a vértice, notará que existe um triângulo ali no meio. O Sketchup faz isso para preencher a T Vertice (em vez de cortar a aresta).

Isto é o causador do bug no seu modelo de colisão. Agradecimentos ao jujubão pela explicação.
É completamente inviável corrigir cada uma manualmente, então eu procurei por uma solução automatizada: selecionar e apagar todas as faces com baixo valor de área, isto é, pequenas, finas.
Na imagem abaixo, eu selecionei todas numa região e levantei elas para vê-las. São muitas!

Para selecionar automaticamente todas essas faces, para em seguida deletá-las, eu usei o script SelectArea no 3DS Max.
Caso link se perder, aqui o script, salve em .mcr:
SpoilerAbrir
Código: Selecionar tudo
macroScript SelectArea category:"Piranha-Bytes" buttonText:"SelectArea" toolTip:"Select Faces by Area"
(
rollout ro_SelectArea "pb Select Area"
(
pickbutton ui_SA_Obj "Pick Object" pos:[5,5] width:100 height:20 tooltip:"Pick Object"
spinner ui_SA_Area "Area: " pos:[5,30] range:[0,100,0.1] fieldWidth:40 scale:0.1 type:#float
checkButton ui_SA_AreaType "A" pos:[89,30] width:16 height:16 tooltip:"A = Average Area Size, B = Biggest Area Size"
checkButton ui_SA_Less "<" pos:[5,55] width:20 height:20 checked:true tooltip:"Select faces with SMALLER area"
checkButton ui_SA_Equal "=" pos:[25,55] width:20 height:20 checked:false tooltip:"Select faces with EQUAL area"
checkButton ui_SA_More ">" pos:[45,55] width:20 height:20 checked:false tooltip:"Select faces with GREATER area"
button ui_SA_Verts "Verts" pos:[70,55] width:35 height:20 tooltip:"Convert Faceselection to Vertexselection"
local theObj = undefined
local avgArea = 0
local biggestArea = 0
function updateAreaSelection =
(
if theObj != undefined do
(
if ((getCurrentSelection())[1] != theObj) then select theObj
if (subObjectLevel != 4) then subobjectLevel = 4
if ui_SA_AreaType.state == false then theArea = avgArea * (ui_SA_Area.value / 100.0)
if ui_SA_AreaType.state == true then theArea = biggestArea * (ui_SA_Area.value / 100.0)
selMode = 0
if ui_SA_Less.state == true then selMode = 1
if ui_SA_Equal.state == true then selMode = 2
if ui_SA_More.state == true then selMode = 3
faceCount = theObj.faces.count
newFaces = #()
for f = 1 to faceCount do
(
a = (polyOp.getFaceArea theObj f)
if ((selMode == 1) and (a < theArea)) then append newFaces f
if ((selMode == 2) and (a == theArea)) then append newFaces f
if ((selMode == 3) and (a > theArea)) then append newFaces f
)
polyOp.setFaceSelection theObj newFaces
forceCompleteRedraw()
)
)
function init_Obj =
(
faceCount = theObj.faces.count
aa = 0
areaList = #()
for f = 1 to faceCount do
(
a = (polyOp.getFaceArea theObj f)
append areaList a
aa = aa + a
)
avgArea = aa / (faceCount as float)
biggestArea = amax areaList
ui_SA_Area.value = 0.1
select theObj
subObjectLevel = 4
updateAreaSelection()
)
on ro_SelectArea open do
(
curObj = (getCurrentSelection())[1]
if curObj != undefined do
(
objBase = (classof curObj.baseobject) as string
if (objBase == "Editable_Poly") do
(
theObj = curObj
ui_SA_Obj.caption = theObj.name
init_Obj()
)
)
)
on ui_SA_AreaType changed state do
(
if state == true then ui_SA_AreaType.caption = "B"
if state == false then ui_SA_AreaType.caption = "A"
updateAreaSelection()
)
on ui_SA_Obj picked obj do
(
objBase = (classof obj.baseobject) as string
if (objBase == "Editable_Poly") then
(
theObj = Obj
ui_SA_Obj.caption = theObj.name
init_Obj()
)
else messageBox "No Editable Poly !!!"
)
on ui_SA_Area changed val do updateAreaSelection()
on ui_SA_Less changed state do
(
ui_SA_Less.state = true
ui_SA_Equal.state = false
ui_SA_More.state = false
updateAreaSelection()
)
on ui_SA_Equal changed state do
(
ui_SA_Less.state = false
ui_SA_Equal.state = true
ui_SA_More.state = false
updateAreaSelection()
)
on ui_SA_More changed state do
(
ui_SA_Less.state = false
ui_SA_Equal.state = false
ui_SA_More.state = true
updateAreaSelection()
)
on ui_SA_Verts pressed do
(
if theObj != undefined do
(
theObj.convertSelection #Face #Vertex
subObjectLEvel = 1
)
)
)
createDialog ro_SelectArea width:110 style:#(#style_sysmenu, #style_Toolwindow)
)Outros softwares de modelagem podem ter soluções semelhantes disponíveis.
Eu recomendo que você coloque o arquivo na pasta
Scripts do 3DS Max, vá em Customize > Customize User Interface > Keyboard, na Category (NÃO GROUP!) procure pelo Piranha-Bytes (criador do script), selecione o SelectArea e em Hotkey coloque algum atalho, como Alt+Shift+A.Assim, na mesh selecionada, adicione o Modifier
Editable Poly (ou converta a partir do Editable Mesh com o botão direito), abra e selecione Polygon, só em seguida pressione o atalho.Digite um valor baixo, eu recomendo
0,2, mas 0,1 pode ser o bastante, só use 0,3 para casos extremos em modelos não detalhados. Dê Enter e veja as faces selecionadas (você pode vê-las rapidamente movendo-as para cima), é importante que você não tenha selecionado nenhuma outra face importante pequena. Estando tudo certo, apague-as com Delete.Dica: Na janela do script, clique no nome do objeto e em seguida em outro no scene explorer, logo ao clicar, irá se aplicar ao outro, assim você faz rapidamente em todos os objetos da cena, basta deixar selecionado a ferramenta de mover, se aparecer o pivot para mover, é porque há faces selecionadas para deletar.
Eu também notei que a exportação de col através do
GTA Tools > Collision > Export to CST do Kam's Max Script do Gold Fish gera muito menos desse bug.Importante: isto tem que ser feito com todas as faces trianguladas, uma maneira simples de triangular é, também no
Editable Poly, ir em Vertex, selecionar todas com Ctrl+A e ir em Connect para conectar todas, só em seguida faça a seleção.Também importante: É essencial otimizar o modelo de colisão antes de usá-lo, além de uma importante melhoria no desempenho do jogo, isso evita muitíssimo as faces invisíveis. Leia a seção "Otimizar COL" do tutorial avançado de como criar mod de mapa.
Caso ainda continue alguma face invisível, verifique novamente, seguindo atentamente os passos (inclusive, pode ser que uma nova face apareceu enquanto você mexia no modelo), e caso realmente tudo esteja certo, não haverá outro modo a não ser corrigir manualmente. Eu modelei uma pequena cidade houve dezenas, senão mais de 100 desses bugs, e após a correção, sobrou somente uma! Era em um muro reto, não tinha essa face lá, então eu simplesmente selecionei as faces no Coll Editor e cliquei em
Replace by Box. Para identificar exatamente a origem do bug você pode ir apagando pedaços do modelo no Coll Editor até o bug desaparecer, assim você encontra exatamente de onde vem, e procura resolver de alguma forma, seja remodelando aquele local, apagando ou substituindo por uma caixa.Recomendo:
Como usar Sketchup para GTA / desenvolvimento de jogos