|
3D-программирование Вопросы, касающиеся программирования 3D мира |
27.02.2007, 17:49
|
#1
|
Бывалый
Регистрация: 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
|
|
Re: Ланшафт
генератором сетки был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить
|
|
|
27.02.2007, 18:17
|
#3
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Re: Ланшафт
2Fant Не.., навряд ли. А может можно. Лично у меня не получилось
__________________
|
(Offline)
|
|
27.02.2007, 20:14
|
#4
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Ланшафт
Сообщение от jimon
генератором сетки был же пример с треугольником ... вот таким методом и делать ... если нужно то и зглаживание применить
|
А где он был? (и при чем тут он?)
|
(Offline)
|
|
27.02.2007, 20:15
|
#5
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Ланшафт
Сообщение от mr.DIMAS
2Fant Не.., навряд ли. А может можно. Лично у меня не получилось
|
Поэтому-то я и спрашиваю на форуме! Надеюсь, что можно!
|
(Offline)
|
|
27.02.2007, 21:39
|
#6
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Ланшафт
Сделать, конечно, можно. Конкретно для ландшафта посмотри команды из раздела справки Terrain. С помощью Modify Terrain можно изменять высоту отдельных точек.
Чтобы поместить какой-то объект в заданном месте, нужно сделать обработчик файла, который, считывая определенный цифры или символы, выполняет нужные действия. В твоем последнем примере достаточно сделать, чтобы при считывании цифры 3 в координатах (2; 2) (масштабированных при необходимости) создавалась сфера (CreateSphere).
|
(Offline)
|
|
27.02.2007, 22:54
|
#7
|
Бывалый
Регистрация: 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
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Re: Ланшафт
Вот. Может пригодится. Здесь юзается tiling с помощью data
|
(Offline)
|
|
27.02.2007, 23:33
|
#9
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Ланшафт
Сообщение от H@NON
Вот. Может пригодится. Здесь юзается tiling с помощью data
|
Спасибо! Достаточно интересный пример! Попытаюсь разобраться!
|
(Offline)
|
|
27.02.2007, 23:53
|
#10
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: Ланшафт
Fant
Чтобы создать террайн определенного размера, необходимо сначала пройтись по всем значениям в data, посчитать количество строк и столбцов. После этого создать терайн и изменять его в соответствии со значениями.
|
(Offline)
|
|
01.03.2007, 13:51
|
#11
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Ланшафт
Сообщение от alcoSHoLiK
Fant
Чтобы создать террайн определенного размера, необходимо сначала пройтись по всем значениям в data, посчитать количество строк и столбцов. После этого создать терайн и изменять его в соответствии со значениями.
|
К сожалению данный пост мало (или вообще) неинформативен (для меня я разумею)
1) Что такое "пройтись по значениям? Кк пройтись?
2) Какие еще сроки считать? И зачем? И как их считать?
3) Как именно его изменять? Есть команда modify terrain, но как это связать?
|
(Offline)
|
|
01.03.2007, 14:35
|
#12
|
Бывалый
Регистрация: 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
|
ПроЭктировщик
Регистрация: 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
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Ланшафт
Да! Огромное спасибо! Это как раз то, что нужно!
|
(Offline)
|
|
01.03.2007, 21:09
|
#15
|
ПроЭктировщик
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Ланшафт |
Akima |
3D Моделирование |
6 |
18.02.2006 11:39 |
Часовой пояс GMT +4, время: 19:31.
|