|
3D-программирование Вопросы, касающиеся программирования 3D мира |
06.02.2007, 20:53
|
#1
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Тени на Terrain
Подскажите, пожалуйста, как лучше реализовать следующее:
Хочу, чтобы тени от объектов на сцене падали на terrain (хотя бы, но неплохо было бы, чтобы и на другие объекты ). Стенсельные очень ресурсы кушают. Я вот думаю, чтобы в 3dsmax'е рендерить тени и потом отдельно от каждого объекта на террайн накладывать.
Как это лучше всего сделать, т.е. банальный вопрос - как сделать тени для статической сцены?
|
(Offline)
|
|
06.02.2007, 20:56
|
#2
|
Бывалый
Регистрация: 22.09.2005
Сообщений: 634
Написано 36 полезных сообщений (для 102 пользователей)
|
Re: Тени на Terrain
Ну лайтмапами Я так делаю
|
(Offline)
|
|
06.02.2007, 21:02
|
#3
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Re: Тени на Terrain
А можно вот кратко: что за чем?
|
(Offline)
|
|
06.02.2007, 21:24
|
#4
|
Бывалый
Регистрация: 22.09.2005
Сообщений: 634
Написано 36 полезных сообщений (для 102 пользователей)
|
Re: Тени на Terrain
Ну просто рендерю лайтмапу в максе и кладу на статику, самозатенение террейна - своя лайтмапа + карта с динамическимим тенями
|
(Offline)
|
|
06.02.2007, 21:26
|
#5
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Re: Тени на Terrain
Я вот подготовил сцену... Пожалуйста, помести туда простой объект (чайник, к примеру ) со статической тенью.
|
(Offline)
|
|
06.02.2007, 22:39
|
#6
|
Бывалый
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений (для 110 пользователей)
|
Re: Тени на Terrain
|
(Offline)
|
|
07.02.2007, 19:20
|
#7
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Я видел раньше эту статью, но у меня видимо руки кривее - никак не получилось по ней это сделать (в 8 максе)...
Разобрался немного. На простом плейне это сделать вполне реально. А как быть именно с Terrain'oм ? Текстура ведь тайлово на полигоны понакладывается... Что делать?
|
(Offline)
|
|
07.02.2007, 22:43
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Тени на Terrain
В моём редакторе который я делал, были тени, так их я делал простым способом, на етц лежит исходник пример как реализовывать тени на террайн, и они не статичные, но и не слишком качественные.
Немного о системе:
Создаётся мэшь который находится серединой в позиции персонажа, и облигает ландшафт. Сверху есть камера которая делает CopyRect и текстурит этот облигающий мэшь, точнее браш а он идёт на мэшь. Тени действуют и зависят от мира, итого выходят Очень плавные реалтайм тени на ландшафт. Но насчёт качества и дальности прорисовки теней, тут уже возникает немаленькая потребность в ресурсах.
|
(Offline)
|
|
08.02.2007, 01:45
|
#9
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
Re: Тени на Terrain
2 Vyacheslav : О тайлах не беспокойся. Взгляни на команду TextureCoords, которая переключает слой текстурных координат для указанной текстуры.
|
(Offline)
|
|
08.02.2007, 02:33
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Re: Тени на Terrain
или на ScaleTexture.
я именно этим пользовался для обеспечения тумана войны в прЭкте.
|
(Offline)
|
|
08.02.2007, 15:02
|
#11
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
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'е так сделали... Надеюсь, тебе хватит сил довести ту игру до конца , она мне кажется очень перспективной!
|
(Offline)
|
|
08.02.2007, 17:15
|
#12
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
Re: Тени на Terrain
2 Vyacheslav : А, так ты штатно-Блицевский террайн юзаешь? Гм... тогда снимаю свою пропозицию насчет ТёхтуреКордсов. Впрочем, всё же не рекомендую его использовать в более-менее крупных наработках.
|
(Offline)
|
|
08.02.2007, 17:25
|
#13
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
Re: Тени на Terrain
2Diplomat: Чуть выше по теме есть исходник-пример по террайну. Террайн загружаю через карту высот. Накладывать текстуру получалось в несколько слоев. Проблема в том, что все текстуры накладываются у меня на один полигон, поэтому получается, что террайн затекстурирован "зернисто"... (террайн Блицевский, хотя и интересно было бы услышать о 3дмаксовском террайне (чтобы не оффтопить - буквально пару слов )
Вот, что я хочу (в аттаче). Как минимум, понять, как сделать такую сцену как там. На мой взгляд, выглядит довольно симпатично (лайтмапа и т.п.). Как это все делается (подробно, чтобы и на другие объекты падала тень, возможно и на другие+на террайн или хотя бы в 3дсмаксе как такую сцену сделать)
|
(Offline)
|
|
09.02.2007, 01:14
|
#14
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Тени на Terrain
Vyacheslav Код не этот, но система похожая. Предлагаю делать не каждый цикл, а через определённое время (короткий период), либо вообще имхо, для каждого объекта тень во время загрузки и всё.
|
(Offline)
|
|
09.02.2007, 13:27
|
#15
|
ПроЭктировщик
Регистрация: 03.01.2007
Сообщений: 133
Написано одно полезное сообщение (для 4 участников)
|
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
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:40.
|