НАВИГАЦИЯ
Главная
Учебник
Файлы
Новости
Примеры
Ссылки
Сообщения
Форум
От создателя







Небо

Во многих играх примнеяют эффект кубического окружающего неба в карте. Т.е это представляет собой куб, на каждую плоскость которого "надеты" различные текстуры. Но чтобы нам не казалось, что это куб, нужно использовать дополнительные эффекты прозрачности. Проблема при использовании кубического неба в том, что при приблежении камеры к его границам, появляются искажения. Поэтому нужно, чтобы размер куба был огромным.

Создадим кубическое небо в BLitz3D:

1) Создадим собственную функцию skybox(size,t1$,t2$,t3$,t4$,t5$,t6$)
Параметр size - размер куба, а t1$...t6$ - имена файлов для каждой плоскости
2) В функции создадим объект типа mesh. Добавим шеть поверхностей. Каждая поверхность состоит из 4х вершин и 2х треугольников. Создадим кисть с именем текстуры соответсвующего в параметре, затем нарисуем её на поверхности и удалим. Для наилучшего эффекта прозрачности для кисти, будем использовать параметр 49. Для тела установим эффект EntityFX - 1, чтобы оно было ярким.

Итак, наша функция целиком:
Function skybox(size,t1$,t2$,t3$,t4$,t5$,t6$)
sky=CreateMesh() ;создать объект mesh

sfr=CreateSurface(sky) ;прередняя поверхность
v1=AddVertex(sfr,-1,-1,1,1,1)
v2=AddVertex(sfr,1,-1,1,0,1)
v3=AddVertex(sfr,-1,1,1,1,0)
v4=AddVertex(sfr,1,1,1,0,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t1$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;левая поверхность
v1=AddVertex(sfr,-1,-1,-1,1,1)
v2=AddVertex(sfr,-1,-1,1,0,1)
v3=AddVertex(sfr,-1,1,-1,1,0)
v4=AddVertex(sfr,-1,1,1,0,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t2$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;правая поверхность
v1=AddVertex(sfr,1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,1,1,1)
v3=AddVertex(sfr,1,1,-1,0,0)
v4=AddVertex(sfr,1,1,1,1,0)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v2,v4,v3)
br=LoadBrush(t3$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;задняя поверхность
v1=AddVertex(sfr,-1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,-1,1,1)
v3=AddVertex(sfr,-1,1,-1,0,0)
v4=AddVertex(sfr,1,1,-1,1,0)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v3,v2,v4)
br=LoadBrush(t4$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;нижняя поверхность
v1=AddVertex(sfr,-1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,-1,0,0)
v3=AddVertex(sfr,-1,-1,1,1,1)
v4=AddVertex(sfr,1,-1,1,1,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t5$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;верхняя поверхность
v1=AddVertex(sfr,-1,1,-1,0,0)
v2=AddVertex(sfr,1,1,-1,0,1)
v3=AddVertex(sfr,-1,1,1,1,0)
v4=AddVertex(sfr,1,1,1,1,1)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v3,v2,v4)
br=LoadBrush(t6$,49)
PaintSurface sfr,br
FreeBrush br

EntityFX sky,1 ;full-bright

ScaleEntity sky,size,size,size ;размер объекта
End Function


Пример использования созданной функции:
Graphics3D 800,600
SetBuffer BackBuffer()

cam=CreateCamera()
CameraClsColor cam,255,0,0
skybox(200,"blueft.tga","bluelf.tga","bluert.tga","bluebk.tga","bluedn.tga","blueup.tga")

While Not KeyHit(1)
If KeyDown(200)
MoveEntity cam,0,0,1
EndIf
If KeyDown(208)
MoveEntity cam,0,0,-1
EndIf
If KeyDown(203)
TurnEntity cam,0,4,0
EndIf
If KeyDown(205)
TurnEntity cam,0,-4,0
EndIf
RenderWorld
Flip
Wend
End

Function skybox(size,t1$,t2$,t3$,t4$,t5$,t6$)
sky=CreateMesh() ;создать объект mesh

sfr=CreateSurface(sky) ;прередняя поверхность
v1=AddVertex(sfr,-1,-1,1,1,1)
v2=AddVertex(sfr,1,-1,1,0,1)
v3=AddVertex(sfr,-1,1,1,1,0)
v4=AddVertex(sfr,1,1,1,0,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t1$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;левая поверхность
v1=AddVertex(sfr,-1,-1,-1,1,1)
v2=AddVertex(sfr,-1,-1,1,0,1)
v3=AddVertex(sfr,-1,1,-1,1,0)
v4=AddVertex(sfr,-1,1,1,0,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t2$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;правая поверхность
v1=AddVertex(sfr,1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,1,1,1)
v3=AddVertex(sfr,1,1,-1,0,0)
v4=AddVertex(sfr,1,1,1,1,0)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v2,v4,v3)
br=LoadBrush(t3$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;задняя поверхность
v1=AddVertex(sfr,-1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,-1,1,1)
v3=AddVertex(sfr,-1,1,-1,0,0)
v4=AddVertex(sfr,1,1,-1,1,0)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v3,v2,v4)
br=LoadBrush(t4$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;нижняя поверхность
v1=AddVertex(sfr,-1,-1,-1,0,1)
v2=AddVertex(sfr,1,-1,-1,0,0)
v3=AddVertex(sfr,-1,-1,1,1,1)
v4=AddVertex(sfr,1,-1,1,1,0)
AddTriangle(sfr,v3,v2,v1)
AddTriangle(sfr,v3,v4,v2)
br=LoadBrush(t5$,49)
PaintSurface sfr,br
FreeBrush br

sfr=CreateSurface(sky) ;верхняя поверхность
v1=AddVertex(sfr,-1,1,-1,0,0)
v2=AddVertex(sfr,1,1,-1,0,1)
v3=AddVertex(sfr,-1,1,1,1,0)
v4=AddVertex(sfr,1,1,1,1,1)
AddTriangle(sfr,v1,v2,v3)
AddTriangle(sfr,v3,v2,v4)
br=LoadBrush(t6$,49)
PaintSurface sfr,br
FreeBrush br

EntityFX sky,1 ;//full-bright

ScaleEntity sky,size,size,size ;размер объекта
End Function


Можете загрузить пример кубического неба с тектсурами: небо.zip(344 кб)
X