|
texture - текстура face - выбранная сторона куба. Может иметь одно из следующих значений: 0: левая (отрицательный X) сторона 1: передняя (положительный Z) сторона - по умолчанию. 2: правая (положительный X) сторона 3: задняя (отрицательный Z) сторона 4: верхняя (положительный Y) сторона 5: нижняя (отрицательный Y) сторона |
|
Выбирает сторону куба для прямого отображения (рендеринга) в текстуру. Эта команда используется только тогда, когда Вы желаете изобразить непосредственно в текстуре стороны куба в реальном времени. В других случаях достаточно только загрузки отрендеренной стороны куба с флажком 128. Чтобы лучше понять, как эта команда работает, важно знать, что Blitz обрабатывает текстуры cubemap немного по-другому по сравнению с обработкой других текстур. Вот как это работает... Поэтому, при загрузке текстуры cubemap в Blitz с использованием LoadTexture, нужно предусмотреть, чтобы все шесть изображений кубической карты были расположены в определенном порядке (0-5, как описано выше), горизонтально. Тогда Blitz берет эту текстуру и внутренне преобразовывает ее в шесть отдельных изображений. Так как указатель текстуры, возвращенный CreateTexture / LoadTexture обеспечивает доступ только к одному из этих изображений (номер 1 по умолчанию), как мы можем получить доступ к другим пяти изображениям? Это и есть назначение команды SetCubeFace. Она укажет Blitz-у, что всякий раз, когда Вы затем обращаетесь к текстуре cubemap, нужно работать с указанным изображением. Теперь Вы имеете возможность обращаться к кубической карте в реальном времени. Чтобы дать Вам некоторое представление относительно того, как это работает в коде, вот пример функции, которая обновляет CubeMap в реальном времени. Это работает путем создания шести различных видов камеры и копирования их в буфер текстуры кубической карты с использованием стороны, указанной командой SetCubeFace, чтобы определить, на какую из них должно быть наложено указанное изображение cubemap. |
|
; Пример SetCubeFace ; ------------------- width=640 height=480 depth=0 mode=0 Graphics3D width,height,depth,mode SetBuffer BackBuffer() ; Если видеокарта не поддерживает кубические карты, то завершить программу If GfxDriverCaps3D()<110 Then RuntimeError "Sorry, your graphics card does not support cubic environemnt maps." cam=CreateCamera() PositionEntity cam,0,10,-10 ; Создаем отдельную камеру, чтобы создавать карту - это позволит нам управлять основной камерой и камерой эффектов ;отдельно cube_cam=CreateCamera() light=CreateLight() RotateEntity light,90,0,0 ; Зогружаем подопытный объект - классический чайник teapot=LoadMesh("media/teapot.x") ScaleEntity teapot,3,3,3 PositionEntity teapot,0,10,0 ; Создаем простую сцену ; земля ground=CreatePlane() EntityColor ground,168,133,55 ground_tex=LoadTexture("media/sand.bmp") ScaleTexture ground_tex,10,10 EntityTexture ground,ground_tex ; небо sky=CreateSphere(24) ScaleEntity sky,500,500,500 FlipMesh sky EntityFX sky,1 sky_tex=LoadTexture("media/sky.bmp") EntityTexture sky,sky_tex ; кактус cactus=LoadMesh("media/cactus2.x") FitMesh cactus,-5,0,-5,2,6,.5 ; верблюд camel=LoadMesh("media/camel.x") FitMesh camel,5,0,-5,6,5,4 ; Загружаем НЛО, который будет летать вокруг чайника и отражаться в нем ufo_piv=CreatePivot() PositionEntity ufo_piv,0,15,0 ufo=LoadMesh("media/green_ufo.x",ufo_piv) PositionEntity ufo,0,0,10 ; создаем текстуру с флажками цвет + кубическая карта окружения + сохранять в видеопамяти tex=CreateTexture(256,256,1+128+256) ; Накладываем кубическую карту на чайник EntityTexture teapot,tex While Not KeyDown(1) ; Управление камерой ; обработка движения мыши mxs#=mxs#+(MouseXSpeed()/5.0) mys#=mys#+(MouseYSpeed()/5.0) RotateEntity cam,mys#,-mxs#,0 MoveMouse width/2,height/2 ; перемещаем камеру вперед/назад/влево/вправо курсорными клавишами If KeyDown(200)=True Then MoveEntity cam,0,0,.2 ; вперед If KeyDown(208)=True Then MoveEntity cam,0,0,-.2 ; назад If KeyDown(205)=True Then MoveEntity cam,.2,0,0 ; влево If KeyDown(203)=True Then MoveEntity cam,-.2,0,0 ; вправо ; Поворачиваем центр НЛО(pivot), и дочерний объект (НЛО) поворачивается тоже вместе с ним (и вокруг чайника) TurnEntity ufo_piv,0,2,0 ; Обновление кубической карты UpdateCubemap(tex,cube_cam,teapot) RenderWorld Text 0,0,"Use mouse to look around" Text 0,20,"Use cursor keys to change camera position" Flip Wend Function UpdateCubemap(tex,camera,entity) tex_sz=TextureWidth(tex) ; Используем камеру для создания кубической карты ShowEntity camera ; Скроем объект, для которого делаем карту. Это нужно, чтобы он не закрыл вид из камеры и сам не появился на ;собственной текстуре, т.к. камера стоит в центре этого объекта HideEntity entity ; Ставим камеру в центр объекта PositionEntity camera,EntityX#(entity),EntityY#(entity),EntityZ#(entity) CameraClsMode camera,False,True ; Установим размер области просмотра камеры таким же, как наша текстура - таким образом мы сможем вместить все ;содержимое экрана в текстуру. CameraViewport camera,0,0,tex_sz,tex_sz ; Обновление карты ; вид слева SetCubeFace tex,0 RotateEntity camera,0,90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; вид впереди SetCubeFace tex,1 RotateEntity camera,0,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; вид справа SetCubeFace tex,2 RotateEntity camera,0,-90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; вид сзади SetCubeFace tex,3 RotateEntity camera,0,180,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; вид сверху SetCubeFace tex,4 RotateEntity camera,-90,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; вид снизу SetCubeFace tex,5 RotateEntity camera,90,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex) ; Снова покажем скрытый ранее объект (чайник) ShowEntity entity ; Скроем камеру эфектов HideEntity camera End Function |