Показать сообщение отдельно
Старый 08.10.2005, 19:17   #19
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Я игрой (Bombers3D) занялся серьезно только этим летом, хотя задумал написать ее еще полтора года назад когда у меня Blitz появился

А пока вот усовершенствованная функция-генератор террейна:
Function GenerateTerrain%(SizeX#,SizeZ#,MaxHeight#,HeightMapFile$,DetailX%=0,DetailZ%=0,VertexColorsMap$="")
;#Region Собственно генератор террейна
	Local HeightMapImage%=LoadImage(HeightMapFile$)
	DetailX%=Abs(DetailX%): DetailZ%=Abs(DetailZ%)
;Автоматический выбор детализации используя HeightMap
	If DetailX%=0 Then
 DetailX%=ImageWidth(HeightMapImage%)
	EndIf
	If DetailZ%=0 Then
 DetailZ%=ImageHeight(HeightMapImage%)
	EndIf
;Это чтобы упростить нахождение высоты вертекса	при несоответствии HeightMap'a
;указанной детализации
	If DetailX%<>ImageWidth(HeightMapImage%) Or DetailZ%<>ImageHeight(HeightMapImage%) Then
 ResizeImage(HeightMapImage%,DetailX,DetailZ)	
	EndIf
	
	Local StepX#=SizeX#/Float#(DetailX-1)
	Local StepZ#=SizeZ#/Float#(DetailZ-1)
	Local Mesh%=CreateMesh()
	Local Surface%=CreateSurface(Mesh)
	Local X#,Z#,H#,K#=3*255
	Local I#,J#
	
;Расположение вертексов
	SetBuffer ImageBuffer(HeightMapImage%)
	For I=0 To DetailZ-1
 Z=SizeZ#*0.5-I*StepZ#
 For J=0 To DetailX-1
 	GetColor(J,I)
 	H#=(ColorRed()+ColorGreen()+ColorBlue())/K ;H = 0 .. 1
 	X=-SizeX#*0.5+J*StepX#
 	AddVertex(Surface,X,MaxHeight#*H#,Z,J/Float#(DetailX-1),I/Float#(DetailZ-1))
 Next
	Next
	SetBuffer BackBuffer()
	FreeImage(HeightMapImage%)
	
;Создание поверхности
	For I=0 To DetailZ-2
 For J=0 To DetailX-2
 	AddTriangle (Surface%,DetailX*I+J, DetailX*I+J+1, J+1+DetailX*(I+1))
 	AddTriangle (Surface%,DetailX*I+J, J+1+DetailX*(I+1), J+DetailX*(I+1))
 Next
	Next
;#End Region

;#Region Раскрашивание вертексов
	If VertexColorsMap$<>"" Then
 Local ColorImage%
 EntityFX Mesh%,2;Использование режима 'use vertex colors instead of brush color'
 ColorImage%=LoadImage(VertexColorsMap$)
	;Изменение размера ColorMap при несовпадении с детализацией
 If DetailX%<>ImageWidth(ColorImage%) Or DetailZ%<>ImageHeight(ColorImage%) Then
 	ResizeImage(ColorImage%,DetailX,DetailZ);Это чтобы упростить нахождение цвета вертекса	
 EndIf
 SetBuffer ImageBuffer(ColorImage%)
 For I=0 To DetailZ-1
 	For J=0 To DetailX-1
  GetColor(J,I)
  VertexColor(Surface%,DetailX*I+J,ColorRed(),ColorGreen(),ColorBlue())
 	Next
 Next
 SetBuffer BackBuffer()
 FreeImage(ColorImage%)
	EndIf
;#End Region
	UpdateNormals(Mesh%)
	Return Mesh%	
End Function
Решил что так будет универсальнее...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием