Página 1 de 1

[GTA] Como corrigir paredes invisíveis em COL do Sketchup

Enviado: 22 Mai 2021, 22:11
por Junior_Djjr
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).

Imagem

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!

Imagem

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)
)
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 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

Re: [GTA] Como corrigir paredes invisíveis em COL do Sketchup

Enviado: 16 Out 2021, 16:15
por Junior_Djjr
Eu editei o script para que 0.1 seja o padrão, e adicionei uma dica no tópico.