forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Тени на Terrain (http://forum.boolean.name/showthread.php?t=2627)

Vyacheslav 06.02.2007 20:53

Тени на Terrain
 
Подскажите, пожалуйста, как лучше реализовать следующее:

Хочу, чтобы тени от объектов на сцене падали на terrain (хотя бы, но неплохо было бы, чтобы и на другие объекты:) ). Стенсельные очень ресурсы кушают. Я вот думаю, чтобы в 3dsmax'е рендерить тени и потом отдельно от каждого объекта на террайн накладывать.

Как это лучше всего сделать, т.е. банальный вопрос - как сделать тени для статической сцены?

НУБ 06.02.2007 20:56

Re: Тени на Terrain
 
Ну лайтмапами ;) Я так делаю ;)

Vyacheslav 06.02.2007 21:02

Re: Тени на Terrain
 
А можно вот кратко: что за чем?

НУБ 06.02.2007 21:24

Re: Тени на Terrain
 
Ну просто рендерю лайтмапу в максе и кладу на статику, самозатенение террейна - своя лайтмапа + карта с динамическимим тенями ;)

Vyacheslav 06.02.2007 21:26

Re: Тени на Terrain
 
Вложений: 2
Я вот подготовил сцену... Пожалуйста, помести туда простой объект (чайник, к примеру :)) со статической тенью.

Horror 06.02.2007 22:39

Re: Тени на Terrain
 
Вот я по этой статье учился)
http://hiromych.narod.ru/Blitz/artic...z_lightmap.htm

Vyacheslav 07.02.2007 19:20

Я видел раньше эту статью, но у меня видимо руки кривее :) - никак не получилось по ней это сделать (в 8 максе)...

Разобрался немного. На простом плейне это сделать вполне реально. А как быть именно с Terrain'oм :dontknow: ? Текстура ведь тайлово на полигоны понакладывается... Что делать?

moka 07.02.2007 22:43

Re: Тени на Terrain
 
В моём редакторе который я делал, были тени, так их я делал простым способом, на етц лежит исходник пример как реализовывать тени на террайн, и они не статичные, но и не слишком качественные.
Немного о системе:
Создаётся мэшь который находится серединой в позиции персонажа, и облигает ландшафт. Сверху есть камера которая делает CopyRect и текстурит этот облигающий мэшь, точнее браш а он идёт на мэшь. Тени действуют и зависят от мира, итого выходят Очень плавные реалтайм тени на ландшафт. Но насчёт качества и дальности прорисовки теней, тут уже возникает немаленькая потребность в ресурсах.

Diplomat 08.02.2007 01:45

Re: Тени на Terrain
 
2 Vyacheslav : О тайлах не беспокойся. Взгляни на команду TextureCoords, которая переключает слой текстурных координат для указанной текстуры. ;)

HolyDel 08.02.2007 02:33

Re: Тени на Terrain
 
или на ScaleTexture. ;)
я именно этим пользовался для обеспечения тумана войны в прЭкте.

Vyacheslav 08.02.2007 15:02

Re: Тени на Terrain
 
2MoKa: Вот этот способ?

Код:


Global GWidth=800,GHeight=600,GDepth=32,WMode=2
Graphics3D  GWidth,GHeight,GDepth,WMode
AppTitle "Shadow - is the best!"
HidePointer
Global fntArial=LoadFont("Arial Cyr",18)
SetFont fntArial
;============================================================
Type SSCaster
 Field Mesh
End Type
 
Type SSReceiver
 Field Mesh
End Type
Global TexResolution=256
;============================================================
Global MCamera, ShadowCam, ShadowTex, MLight, MPlane, SMesh
Global GExit=0
;============================================================
CreateMain()
Const UPS=60
Global time,elapsed,ticks,tween#, fps, fTime, frames
period=1000/UPS
time=MilliSecs()-period
Repeat
 Repeat
  elapsed=MilliSecs()-time
 Until elapsed
 ticks=elapsed/period
 tween#=Float(elapsed Mod period)/Float(period)
 
 For k=1 To ticks
  time=time+period
  UpdateMain()
  UpdateWorld
 Next
 UpdateFPS()
 RenderWorld ;tween
 Draw()
 Flip 0
Until GExit=1
End
Function UpdateFPS()
 frames=frames+1
 If MilliSecs() - fTime >= 1000
  fps = frames
  frames = 0
  fTime = MilliSecs()
 EndIf
End Function
;============================================================
;=================Shadow=System=Functions====================
Function SS_AddReceiver(mesh%)
 Local ssr.SSReceiver
 ssr.SSReceiver=New SSReceiver
 ssr\mesh=mesh
End Function
Function SS_AddCaster(mesh%)
 Local ssc.SSCaster
 ssc.SSCaster=New SSCaster
 ssc\mesh=mesh
End Function
Function SS_HideReceivers()
 Local ssr.SSReceiver
 For ssr.SSReceiver=Each SSReceiver
  HideEntity ssr\mesh
 Next
End Function
Function SS_ShowReceivers()
 Local ssr.SSReceiver
 For ssr.SSReceiver=Each SSReceiver
  ShowEntity ssr\mesh
 Next
End Function
Function SS_RenderShadowTexture(MCam,SCam)
 HideEntity MCam
 ShowEntity SCam
 SS_HideReceivers()
 RenderWorld
 CopyRect 0,0,TexResolution,TexResolution,0,0,BackBuffer(),TextureBuffer(ShadowTex)
 EntityTexture MPlane,ShadowTex,0,1
 ShowEntity MCam
 HideEntity SCam
 SS_ShowReceivers()
End Function
;============================================================
;============================================================
Function CreateMain()
 MCameraCreate()
 MPlane=CreateTerrain(32)
 SS_AddReceiver(MPlane)
 Tex1=LoadTexture("grass.jpg")
 ScaleTexture tex1,8,8
 EntityTexture MPlane,tex1
 CreateSMesh()
 PositionEntity SMesh,16,6,16
 ShadowTex=CreateTexture(TexResolution,TexResolution,1)
 ScaleTexture ShadowTex,32,32
End Function
Function UpdateMain()
 Camera_Look(MCamera)
 Camera_Free_Fly(MCamera)
 UpdateControl()
 TurnEntity SMesh,1,1,1
 SS_RenderShadowTexture(MCamera,ShadowCam)
End Function
Function Draw()
 Text 10,10,"FPS "+fps
End Function
Function UpdateControl()
 If KeyHit(1) Then GExit=1
End Function
Function MCameraCreate()
 MCamera=CreateCamera()
 CameraClsColor MCamera,120,120,120
 PositionEntity MCamera,0,10,0
 MLight=CreateLight()
 RotateEntity MLight,25,-115,0
 ShadowCam=CreateCamera()
 ShCamPivot=CreateCube(ShadowCam)
 CameraViewport ShadowCam,0,0,TexResolution,TexResolution
 CameraClsColor ShadowCam,255,255,255
 CameraRange  ShadowCam,16.06,1000
 CameraProjMode ShadowCam,2
  PositionEntity ShadowCam,16.06,100,15.94
 CameraFogMode ShadowCam,1
 CameraFogRange ShadowCam,0,0.0001
 CameraFogColor ShadowCam,110,110,110
 ;PositionEntity ShadowCam,16.06,100,-20
 RotateEntity  ShadowCam,90,0,0
End Function
Function CreateSMesh()
 SMesh=CreatePivot()
 ball=CreateSphere(16)
 PositionEntity ball,0,2,0
 EntityParent ball,SMesh
 ball=CreateCylinder(16)
 RotateEntity ball,0,0,90
 PositionEntity ball,0,2,0
 ScaleEntity ball,.5,2,.5
 EntityParent ball,SMesh
 For i=1 To 30
  ball=CreateSphere()
  ScaleEntity ball,.5,.5,.5
  PositionEntity ball,Rnd(-4,4),Rnd(0,4),Rnd(-4,4)
  EntityParent ball,SMesh
 Next
End Function
Function Camera_Look(cam,speedx#=.5,speedy#=.5,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#=.2,mb#=.2,ml#=.2,mr#=.2)
 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

2Diplomat: Можно чуть подробнее для таких как я :) . Я игрался с этими командами, но работало только на одном полигоне, т.е. не мог определить зону на террайне, где нужно наложить некоторую текстуру. Кстати, у меня есть демка (там линзы, солнце и т.п.) и что мне там понравилось, что есть файл .b3d - сцена, вместе с ним файл лайтмапы и текстуры и все там просчитано и прорисовано еще в максе, загружаем в Блиц - и уже готовая сцена с освещением и тенями.

2HolyDel: Видел. Клево получилось. Я всегда думал, как это в WarCraft'е так сделали... Надеюсь, тебе хватит сил довести ту игру до конца ;) , она мне кажется очень перспективной!

Diplomat 08.02.2007 17:15

Re: Тени на Terrain
 
2 Vyacheslav : А, так ты штатно-Блицевский террайн юзаешь? Гм... тогда снимаю свою пропозицию насчет ТёхтуреКордсов. Впрочем, всё же не рекомендую его использовать в более-менее крупных наработках.

Vyacheslav 08.02.2007 17:25

Re: Тени на Terrain
 
Вложений: 2
2Diplomat: Чуть выше по теме есть исходник-пример по террайну. Террайн загружаю через карту высот. Накладывать текстуру получалось в несколько слоев. Проблема в том, что все текстуры накладываются у меня на один полигон, поэтому получается, что террайн затекстурирован "зернисто"... (террайн Блицевский, хотя и интересно было бы услышать о 3дмаксовском террайне (чтобы не оффтопить - буквально пару слов ;))

Вот, что я хочу (в аттаче). Как минимум, понять, как сделать такую сцену как там. На мой взгляд, выглядит довольно симпатично (лайтмапа и т.п.). Как это все делается (подробно, чтобы и на другие объекты падала тень, возможно и на другие+на террайн или хотя бы в 3дсмаксе как такую сцену сделать)

moka 09.02.2007 01:14

Re: Тени на Terrain
 
Vyacheslav Код не этот, но система похожая. Предлагаю делать не каждый цикл, а через определённое время (короткий период), либо вообще имхо, для каждого объекта тень во время загрузки и всё.

Vyacheslav 09.02.2007 13:27

Re: Тени на Terrain
 
2MoKa: О! Это очень классная идея. В самом деле - ведь можно при загрузке сфоткать сцену, прорисовать на второй слой лайтмапы. Это ж очень полезная вещь - если время суток меняется, можно перефоткать камерой и снова прорисовать тени. Потрясающая идея, спасибо. Сейчас попробую реализовать и выложу пример, если получиться. Уверен, это понадобиться далеко не только мне.

Вот, вроде бы так (камера прорисовывает тени и удаляется):

Код:


Global GWidth=800,GHeight=600,GDepth=32,WMode=2
Graphics3D  GWidth,GHeight,GDepth,WMode
AppTitle "Shadow - is the best!"
HidePointer
Global fntArial=LoadFont("Arial Cyr",18)
SetFont fntArial
;============================================================
Type SSCaster
 Field Mesh
End Type

Global isShadowed=False

Type SSReceiver
 Field Mesh
End Type

Global TexResolution=256
;============================================================
Global MCamera, ShadowCam, ShadowTex, MLight, MPlane, SMesh
Global GExit=0
;============================================================

; MCameraCreate()
 MPlane=CreateTerrain(32)
 SS_AddReceiver(MPlane)
 Tex1=LoadTexture("grass.jpg")
 ScaleTexture tex1,8,8
 EntityTexture MPlane,tex1
 CreateSMesh()
 PositionEntity SMesh,16,6,16
 ShadowTex=CreateTexture(TexResolution,TexResolution,1)
 ScaleTexture ShadowTex,32,32
 MCamera=CreateCamera()
 CameraClsColor MCamera,120,120,120
 PositionEntity MCamera,0,10,0
 MLight=CreateLight()
 RotateEntity MLight,25,-115,0
 ShadowCam=CreateCamera()
 ShCamPivot=CreateCube(ShadowCam)
 CameraViewport ShadowCam,0,0,TexResolution,TexResolution
 CameraClsColor ShadowCam,255,255,255
 CameraRange  ShadowCam,16.06,1000
 CameraProjMode ShadowCam,2
 PositionEntity ShadowCam,16.06,100,15.94
 CameraFogMode ShadowCam,1
 CameraFogRange ShadowCam,0,0.0001
 CameraFogColor ShadowCam,110,110,110
 RotateEntity  ShadowCam,90,0,0
 
 isShadowCamExists=1
Const UPS=60
Global time,elapsed,ticks,tween#, fps, fTime, frames
period=1000/UPS
time=MilliSecs()-period
Repeat
 Repeat
  elapsed=MilliSecs()-time
 Until elapsed
 ticks=elapsed/period
 tween#=Float(elapsed Mod period)/Float(period)
 
 For k=1 To ticks
  time=time+period
 
 
 
 Camera_Look(MCamera)
 Camera_Free_Fly(MCamera)
 UpdateControl()
 
 ;TurnEntity SMesh,1,1,1
 
 
If isShadowed=False
 HideEntity MCamera
 
 ShowEntity ShadowCam
 
 SS_HideReceivers()
 
 RenderWorld
 
 CopyRect 0,0,TexResolution,TexResolution,0,0,BackBuffer(),TextureBuffer(ShadowTex)
 EntityTexture MPlane,ShadowTex,0,1
 
 ShowEntity MCamera
 
 HideEntity ShadowCam
 
 SS_ShowReceivers()
 isShadowed=True
Else
 If isShadowCamExists=1
 
  FreeEntity ShadowCam
  isShadowCamExists=0
 EndIf
 
 RenderWorld
 
 
EndIf 
 
 
 
  UpdateWorld
 Next
 UpdateFPS()
 RenderWorld ;tween
 Draw()
 Flip 0
Until GExit=1
End
Function UpdateFPS()
 frames=frames+1
 If MilliSecs() - fTime >= 1000
  fps = frames
  frames = 0
  fTime = MilliSecs()
 EndIf
End Function
;============================================================
;=================Shadow=System=Functions====================
Function SS_AddReceiver(mesh%)
 Local ssr.SSReceiver
 ssr.SSReceiver=New SSReceiver
 ssr\mesh=mesh
End Function
Function SS_AddCaster(mesh%)
 Local ssc.SSCaster
 ssc.SSCaster=New SSCaster
 ssc\mesh=mesh
End Function
Function SS_HideReceivers()
 Local ssr.SSReceiver
 For ssr.SSReceiver=Each SSReceiver
  HideEntity ssr\mesh
 Next
End Function
Function SS_ShowReceivers()
 Local ssr.SSReceiver
 For ssr.SSReceiver=Each SSReceiver
  ShowEntity ssr\mesh
 Next
End Function

;============================================================
;============================================================
 

Function Draw()
 Text 10,10,"FPS "+fps
End Function
Function UpdateControl()
 If KeyHit(1) Then GExit=1
End Function

Function CreateSMesh()
 SMesh=CreatePivot()
 
 ball=CreateSphere(16)
 PositionEntity ball,0,2,0
 EntityParent ball,SMesh
 
 ball=CreateCylinder(16)
 RotateEntity ball,0,0,90
 PositionEntity ball,0,2,0
 ScaleEntity ball,.5,2,.5
 EntityParent ball,SMesh
 For i=1 To 30
  ball=CreateSphere()
  ScaleEntity ball,.5,.5,.5
  PositionEntity ball,Rnd(-4,4),Rnd(0,4),Rnd(-4,4)
  EntityParent ball,SMesh
 Next
 
End Function
Function Camera_Look(cam,speedx#=.5,speedy#=.5,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#=.2,mb#=.2,ml#=.2,mr#=.2)
 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



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

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