forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Ланшафт (http://forum.boolean.name/showthread.php?t=2818)

Fant 27.02.2007 17:49

Ланшафт
 
Сущесвует несколько методов создания ландшафта

Можно командами:
createterrain(32,32)
createPlane()

а дальше просто подгрузить карту высот

Но меня интересует немножко другой вариант (конечно я сомневаюсь в его реальности)

Можно ли сделать террайн следующим способом:

как-то через команду data

если

data
1,1,1
1,1,1
1,1,1

то это ландшафт размером 3 на 3 без возвышенностей

если

data
1,1,1
1,2,1
1,1,1

то это ландшафт 3 на 3,а по середине очень маленькая горка-возвышеннсть

если

data
1,1,1
1,3,1
1,1,1

то еще какой-нить предмет (то там создается сфера, наприимер)

Вообще рально ли так сделать, и, если да, то как?

jimon 27.02.2007 18:10

Re: Ланшафт
 
генератором сетки :) был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить

mr.DIMAS 27.02.2007 18:17

Re: Ланшафт
 
2Fant Не.., навряд ли. А может можно. Лично у меня не получилось

Fant 27.02.2007 20:14

Re: Ланшафт
 
Цитата:

Сообщение от jimon
генератором сетки :) был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить

А где он был? (и при чем тут он?)

Fant 27.02.2007 20:15

Re: Ланшафт
 
Цитата:

Сообщение от mr.DIMAS
2Fant Не.., навряд ли. А может можно. Лично у меня не получилось

Поэтому-то я и спрашиваю на форуме! Надеюсь, что можно!

alcoSHoLiK 27.02.2007 21:39

Re: Ланшафт
 
Сделать, конечно, можно. Конкретно для ландшафта посмотри команды из раздела справки Terrain. С помощью Modify Terrain можно изменять высоту отдельных точек.
Чтобы поместить какой-то объект в заданном месте, нужно сделать обработчик файла, который, считывая определенный цифры или символы, выполняет нужные действия. В твоем последнем примере достаточно сделать, чтобы при считывании цифры 3 в координатах (2; 2) (масштабированных при необходимости) создавалась сфера (CreateSphere).

Fant 27.02.2007 22:54

Re: Ланшафт
 
Цитата:

Сообщение от alcoSHoLiK
Сделать, конечно, можно. Конкретно для ландшафта посмотри команды из раздела справки Terrain. С помощью Modify Terrain можно изменять высоту отдельных точек.
Чтобы поместить какой-то объект в заданном месте, нужно сделать обработчик файла, который, считывая определенный цифры или символы, выполняет нужные действия. В твоем последнем примере достаточно сделать, чтобы при считывании цифры 3 в координатах (2; 2) (масштабированных при необходимости) создавалась сфера (CreateSphere).

Да, с последним вариантом(что бы сфера появлялась)

Посмотрел справку про modify terrain! Там хороший пример, вот только пока я не понимаю, как можно это переместить на data...

И как сделать:

если

data
1,1,1
1,1,1
1,1,1

то это ландшафт размером 3 на 3 без возвышенностей

То есть ежели я захочу:
data
1,1,1,1
1,1,1,1
1,1,1,1
1,1,1,1

то ландшафт уже будет 4 на 4

H@NON 27.02.2007 23:23

Re: Ланшафт
 
Вложений: 2
Вот. Может пригодится. Здесь юзается tiling с помощью data

Fant 27.02.2007 23:33

Re: Ланшафт
 
Цитата:

Сообщение от H@NON
Вот. Может пригодится. Здесь юзается tiling с помощью data

Спасибо! Достаточно интересный пример! Попытаюсь разобраться!

alcoSHoLiK 27.02.2007 23:53

Re: Ланшафт
 
Fant
Чтобы создать террайн определенного размера, необходимо сначала пройтись по всем значениям в data, посчитать количество строк и столбцов. После этого создать терайн и изменять его в соответствии со значениями.

Fant 01.03.2007 13:51

Re: Ланшафт
 
Цитата:

Сообщение от alcoSHoLiK
Fant
Чтобы создать террайн определенного размера, необходимо сначала пройтись по всем значениям в data, посчитать количество строк и столбцов. После этого создать терайн и изменять его в соответствии со значениями.

К сожалению данный пост мало (или вообще) неинформативен (для меня я разумею)
1) Что такое "пройтись по значениям? Кк пройтись?
2) Какие еще сроки считать? И зачем? И как их считать?
3) Как именно его изменять? Есть команда modify terrain, но как это связать?


Fant 01.03.2007 14:35

Re: Ланшафт
 
Распотрошил пример.
Вот что осталось:

Create_MapLayout("hmap.bmp");create a height map and store it in dimension map(x,y)

Я как-то вообще не понял...мне не нужна карта высот. Я высоты буду через modify terrain делать. Но, допустим, это сверхважно для этого кода. Пусть будет так, но я не хочу использовать hmap.bmp. ведь можно свою тектсур белую создать...и тогда будет карта без высот)

но я не предславляю как ее туда "впихнуть" ... Короче вот уже почти 5 дней я с ландшафтом не расквитаюсь!

но дело в том, что там карта высот вот тут:


Код:

;size of map
Const Gridx=32
Const Gridz=32
;Global vars here
Global Tile_mask
Global Lightmap
 
;Setup 3d graphics mode
Graphics3D 640,480
SetBuffer BackBuffer()
Collisions 1,2,2,3
;Add Lights and Camera
lit=CreateLight()
cam=CreateCamera()
CameraRange cam,.1,6000
CameraClsColor cam,10,10,50
EntityType cam,1
EntityRadius cam,4
PositionEntity cam,0,256,0
TurnEntity cam,0,0,0
 
;Create and store map heights from a heightmap
Dim map.tile(gridx,gridz) ;Now holds all info including brush tiles set 1 and 2,mask and lightmap
Create_MapLayout("hmap.bmp");create a height map and store it in dimension map(x,y)
;Create a map mesh and scale to size
ground=Create_Map(gridx,gridz,3)
PositionEntity ground,-1600,0,-1600
ScaleMesh ground,100,400,100
EntityType ground,2
;Finally add a lightmap texture
 
Color 255,255,255
 
While Not KeyDown(1)
 TranslateEntity cam,0,-.5,0 ;Translate the camera down **Gravity**
 If KeyDown(203) TurnEntity cam,0,1,0
 If KeyDown(205) TurnEntity cam,0,-1,0
 If KeyDown(200) TurnEntity cam,1,0,0
 If KeyDown(208) TurnEntity cam,-1,0,0
 If KeyDown(44) MoveEntity cam,0,0,-2
 If KeyDown(30) MoveEntity cam,0,0,2
 UpdateWorld
 RenderWorld
 Text 0,0,"Terrain brush tiling by"
 Text 0,16,"David Bird"
 Text 0,32,"[email protected]"
 Flip
Wend
FreeEntity ground
FreeEntity lit
FreeEntity cam
EndGraphics
End
;
; Create a flat plane all with tile 1
;
Function Create_Map(tilex,tilez,tile)
 mesh=CreateMesh()
 u#=0
 v#=0
 stp#=1.0/Float(tilex)
 For z#=0 To tilez-1
  u=0
  For x#=0 To tilex-1
  h1#=map(x,z)\y      ;top left height
  h2#=map(x+1,z)\y      ;top right height
  h3#=map(x+1,z+1)\y      ;bot right height
  h4#=map(x,z+1)\y      ;bot left height
  br=map(x,z)\brush      ; this brush contains both tiles + mask + lightmap
  surf=FindSurface( mesh,br )    ; Find a surface in the mesh that contains the same brush
  If surf=0 surf=CreateSurface(mesh,br)  ; If it can't find one create a new surface
  cnt=CountVertices( surf )    ; Get count of vertices
  ;Add vertices including tile coords
  AddVertex surf,x,h1,z,0,0
  AddVertex surf,x+1.0,h2,z,1,0
  AddVertex surf,x+1.0,h3,z+1.0,1,1
  AddVertex surf,x,h4,z+1.0,0,1
  ;Add second set of tex coords to fit grid
  VertexTexCoords surf,cnt,u,v,0,1
  VertexTexCoords surf,cnt+1,u+stp,v,0,1
  VertexTexCoords surf,cnt+2,u+stp,v+stp,0,1
  VertexTexCoords surf,cnt+3,u,v+stp,0,1
  ;Finally add the two triangles
  AddTriangle surf,cnt,cnt+2,cnt+1
  AddTriangle surf,cnt,cnt+3,cnt+2
  u=u+stp
  Next
  v=v+stp
 Next
 UpdateNormals mesh
 Return mesh
End Function
Function Load_Textures()
 For a=0 To 7
  b$="tex"+a+".bmp"
 
 Next
 Tile_mask=LoadTexture("mask.bmp")
 TextureCoords Tile_mask,1
 TextureBlend Tile_mask,3
 Lightmap=LoadTexture("lightmap.bmp",4)
 TextureCoords Lightmap,1
 TextureBlend Lightmap,3
End Function
Function Create_MapLayout(file$)
 hmap=LoadImage(file)
 DrawImage hmap,0,0
 For z=0 To gridz
  For x=0 To gridx
  map.tile(x,z)=New tile
  GetColor x,z
  map(x,z)\y=Float(ColorRed())/255
  map(x,z)\brush=CreateBrush()
  Read track
 
  Next
 Next
End Function
;
;Tile information
;
Type tile
 Field y#  ;yhieght at top left eg inc u0,v0
 Field brush  ;Remember that there are four brushes used ontop of each other blended
End Type
.mapdata
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,3,3,3,3,3,6,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,5,3,6,1,1,1,5,3,3,3,6,1,4,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,4,1,4,1,5,3,8,1,1,1,4,1,4,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,5,3,3,3,3,8,1,7,3,8,1,1,1,1,1,7,3,8,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,7,3,3,3,3,6,1,5,3,3,3,3,6,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,4,1,4,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,4,1,4,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,4,1,4,1,1,1,1,4,1,1,1,5,3,3,3,3,3,3,8,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,7,3,8,1,1,1,1,4,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,3,3,3,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1


Vyacheslav 01.03.2007 15:16

Re: Ланшафт
 
Вот максимально простой вариант:
Список Data можно продолжать в зависимости от размера terrain'а

Код:


Graphics3D 800,600,32,2
SetBuffer BackBuffer()
HidePointer()
ter_size=32
x_scale=10
y_scale=50
z_scale=10
camera=CreateCamera()
PositionEntity camera,50,40,-50

light=CreateLight()
RotateEntity light,90,0,0

ter=CreateTerrain(ter_size)
ScaleEntity ter,x_scale,y_scale,z_scale
EntityColor ter,150,150,200

Restore ter_data
Read ter_mod_count

For n = 1 To ter_mod_count
 Read cx
 Read cz
 Read y_mod
 ModifyTerrain ter,cx,cz,y_mod
 
Next
 
While Not KeyDown(1)

 Camera_Look(camera)
 Camera_Free_Fly(camera)

RenderWorld
Flip
Wend
End 
Function Camera_Look(cam,speedx#=2,speedy#=2,dang=-89,upang=89)
 mxs=MouseXSpeed()
 mys=MouseYSpeed()
 xrot#=EntityPitch(cam)
 yrot#=EntityYaw(cam)
 If(xrot#<upang)And(mys>0)Then xrot#=xrot#+speedx#*mys/10 
 If(xrot#>upang)And(mys>0)Then xrot#=upang
 If(xrot#>dang)And(mys<0)Then xrot#=xrot#+speedx#*mys/10
 If(xrot#<dang)And(mys<0)Then xrot#=dang 
 yrot=yrot-speedy#*mxs/10
 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
 RotateEntity cam,xrot,yrot,0
End Function
Function Camera_Free_Fly(Obj,mf#=.5,mb#=.5,ml#=.5,mr#=.5)
 If KeyDown(17) Then MoveEntity Obj,  0 ,0, mf#;W
 If KeyDown(31) Then MoveEntity Obj,  0 ,0,-mb#;S
 If KeyDown(30) Then MoveEntity Obj,-ml#,0,  0 ;A
 If KeyDown(32) Then MoveEntity Obj, mr#,0,  0 ;D
End Function
.ter_data
Data 5
Data 1,1,1
Data 2,2,0
Data 3,3,0
Data 4,4,0
Data 5,5,10


Fant 01.03.2007 20:57

Re: Ланшафт
 
Да! Огромное спасибо! Это как раз то, что нужно!

Vyacheslav 01.03.2007 21:09

Re: Ланшафт
 
Ну и так еще, если массивом, вроде удобнее:

Код:


Graphics3D 800,600,32,2
SetBuffer BackBuffer()
HidePointer()
ter_size=8
camera=CreateCamera()
PositionEntity camera,50,40,-50
light=CreateLight()
RotateEntity light,90,0,0
ter=CreateTerrain(ter_size)
ScaleEntity ter,1,10,1
EntityColor ter,150,150,200
Restore ter_data
Read ter_mod_count
For x=1 To 7
 For z=1 To 7
  Read y_mod#
  ModifyTerrain ter,x,z,y_mod#
 
  Next
 
Next
 
While Not KeyDown(1)
 Camera_Look(camera)
 Camera_Free_Fly(camera)
RenderWorld
Flip
Wend
End 
Function Camera_Look(cam,speedx#=2,speedy#=2,dang=-89,upang=89)
 mxs=MouseXSpeed()
 mys=MouseYSpeed()
 xrot#=EntityPitch(cam)
 yrot#=EntityYaw(cam)
 If(xrot#<upang)And(mys>0)Then xrot#=xrot#+speedx#*mys/10 
 If(xrot#>upang)And(mys>0)Then xrot#=upang
 If(xrot#>dang)And(mys<0)Then xrot#=xrot#+speedx#*mys/10
 If(xrot#<dang)And(mys<0)Then xrot#=dang 
 yrot=yrot-speedy#*mxs/10
 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
 RotateEntity cam,xrot,yrot,0
End Function
Function Camera_Free_Fly(Obj,mf#=.5,mb#=.5,ml#=.5,mr#=.5)
 If KeyDown(17) Then MoveEntity Obj,  0 ,0, mf#;W
 If KeyDown(31) Then MoveEntity Obj,  0 ,0,-mb#;S
 If KeyDown(30) Then MoveEntity Obj,-ml#,0,  0 ;A
 If KeyDown(32) Then MoveEntity Obj, mr#,0,  0 ;D
End Function
.ter_data
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0
Data 0,0,0,1,1,0,0,0
Data 0,0,0,0.5,0,0,0,0
Data 0,0,0,1,1,0,0,0
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0



Часовой пояс GMT +4, время: 12:21.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot