Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 27.02.2007, 17:49   #1
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Ланшафт

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

Можно командами:
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

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

Вообще рально ли так сделать, и, если да, то как?
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 18:10   #2
jimon
 
Сообщений: n/a
Re: Ланшафт

генератором сетки был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить
 
Ответить с цитированием
Старый 27.02.2007, 18:17   #3
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Re: Ланшафт

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

(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 20:14   #4
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Ланшафт

Сообщение от jimon
генератором сетки был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить
А где он был? (и при чем тут он?)
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 20:15   #5
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Ланшафт

Сообщение от mr.DIMAS
2Fant Не.., навряд ли. А может можно. Лично у меня не получилось
Поэтому-то я и спрашиваю на форуме! Надеюсь, что можно!
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 21:39   #6
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Ланшафт

Сделать, конечно, можно. Конкретно для ландшафта посмотри команды из раздела справки Terrain. С помощью Modify Terrain можно изменять высоту отдельных точек.
Чтобы поместить какой-то объект в заданном месте, нужно сделать обработчик файла, который, считывая определенный цифры или символы, выполняет нужные действия. В твоем последнем примере достаточно сделать, чтобы при считывании цифры 3 в координатах (2; 2) (масштабированных при необходимости) создавалась сфера (CreateSphere).
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 22:54   #7
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
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
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 23:23   #8
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Re: Ланшафт

Вот. Может пригодится. Здесь юзается tiling с помощью data
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 23:33   #9
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Ланшафт

Сообщение от H@NON
Вот. Может пригодится. Здесь юзается tiling с помощью data
Спасибо! Достаточно интересный пример! Попытаюсь разобраться!
(Offline)
 
Ответить с цитированием
Старый 27.02.2007, 23:53   #10
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Ланшафт

Fant
Чтобы создать террайн определенного размера, необходимо сначала пройтись по всем значениям в data, посчитать количество строк и столбцов. После этого создать терайн и изменять его в соответствии со значениями.
(Offline)
 
Ответить с цитированием
Старый 01.03.2007, 13:51   #11
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Ланшафт

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

(Offline)
 
Ответить с цитированием
Старый 01.03.2007, 14:35   #12
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
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
(Offline)
 
Ответить с цитированием
Старый 01.03.2007, 15:16   #13
Vyacheslav
ПроЭктировщик
 
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение
(для 4 участников)
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
(Offline)
 
Ответить с цитированием
Старый 01.03.2007, 20:57   #14
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Ланшафт

Да! Огромное спасибо! Это как раз то, что нужно!
(Offline)
 
Ответить с цитированием
Старый 01.03.2007, 21:09   #15
Vyacheslav
ПроЭктировщик
 
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение
(для 4 участников)
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
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ланшафт Akima 3D Моделирование 6 18.02.2006 11:39


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com