Тема: FAQ по B3D
Показать сообщение отдельно
Старый 28.08.2007, 16:11   #17
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Re: FAQ по B3D

ВОПРОС : подскажите, как бы мне сделать небо в моей игре?
ОТВЕТ: есть разные способы:
1) Можно просто создать плоскость(CreatePlane()) , натянуть на него текстуру и поднять на уровень облаков. Но такой способ предпочтителен лишь когда у вас камера направлена вверх, потому что по бокам неба просто не будет, так как это плоскость.
2) Можно создать сферу(CreateSphere()) , и так же натянуть на нее текстуру. только Сфера ,внутри которой мы будем находится не будет видна, потому что изначально объекты видны лишь с внешней стороны, но это можно исправить либо флипнув меш и тем самым у нас поменяются внешняя с внутренней стороной местами(FlipMesh меш), либо поставив, если нужно чтоб меш был виден с обоих сторон, флаг 16 (EntityFX меш, 16). Теперь надо привязать наше небо к камере, потому что иначе игрок может спокойно пересечь границу неба и увидеть что это всего-лишь объект с текстурой(а нам ведь нужно чтоб было как можно реалистичнее), или в таком случае нужно заранее отмасштабировать объект небо так чтоб игрок не смог этого сделать. А привязать небо к камере нам поможет следующий код:
    dxsky#=EntityX( camera,True )-EntityX( sky )
    dysky#=EntityY(camera,True )-EntityY( sky )
    dzsky#=EntityZ( camera,True )-EntityZ( sky )
    TranslateEntity sky,dxsky,dysky,dzsky
или такой:
Positionentity sky, EntityX(camera), EntityY(camera), EntityZ(camera)
что в принципе равноценно

просто вставьте этот код в главный цикл. Естественно, замените навзания camera и sky на ваши.
3)Этот способ самый распространненый.
Function MakeSkyBox()

    m1=CreateMesh()
    ;передняя сторона
    b1=LoadBrush( "tex\sky_FR.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,-1,0,0:AddVertex s1,+1,+1,-1,1,0
    AddVertex s1,+1,-1,-1,1,1:AddVertex s1,-1,-1,-1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;правая сторона
    b1=LoadBrush( "tex\sky_LF.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,+1,+1,-1,0,0:AddVertex s1,+1,+1,+1,1,0
    AddVertex s1,+1,-1,+1,1,1:AddVertex s1,+1,-1,-1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;задняя сторона
    b1=LoadBrush( "tex\sky_BK.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,+1,+1,+1,0,0:AddVertex s1,-1,+1,+1,1,0
    AddVertex s1,-1,-1,+1,1,1:AddVertex s1,+1,-1,+1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;левая сторона
    b1=LoadBrush( "tex\sky_RT.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,+1,0,0:AddVertex s1,-1,+1,-1,1,0
    AddVertex s1,-1,-1,-1,1,1:AddVertex s1,-1,-1,+1,0,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
    ;верхняя сторона
    b1=LoadBrush( "tex\sky_UP.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,+1,+1,0,1:AddVertex s1,+1,+1,+1,0,0
    AddVertex s1,+1,+1,-1,1,0:AddVertex s1,-1,+1,-1,1,1
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1
;нижняя сторона   
    b1=LoadBrush("tex\sky_DN.jpg",49 )
    s1=CreateSurface( m1,b1 )
    AddVertex s1,-1,-1,-1,1,0:AddVertex s1,+1,-1,-1,1,1
    AddVertex s1,+1,-1,+1,0,1:AddVertex s1,-1,-1,+1,0,0
    AddTriangle s1,0,1,2:AddTriangle s1,0,2,3
    FreeBrush b1


    ScaleMesh m1,500,600,500
    FlipMesh m1
    EntityFX m1,9
    EntityOrder m1,10
    Return m1
    
End Function
Эта функция, которая создает коробку с натянутой на нее 6 текстур(вверх, низ, право, лево, перед, зад).Это и есть наше небо. В строках LoadBrush идет загрузка текстур. Впишите туда свой путь и имя файла с расширением . Теперь просто вставьте эту функцию в ваш код(не в главный цикл) и вызывайте ее вот так к примеру: sky = MakeSkyBox() .
(Offline)
 
Ответить с цитированием