| entity = указатель объекта global (не обязательно)= True для глобальных координат, False - для локальных. По умолчанию False. |
| Возвращает X-координату объекта. Если параметр global= False, то используется локальная система координат (относительно родительского объекта). ЗАПОМНИТЕ: Если объект не имеет никакого родителя, тогда локальные(местные) и глобальные координаты - это одно и то же. В этом случае Вы можете думать о всем 3D-мире, как о родителе. Глобальные координаты относятся к 3D-миру. Blitz3D использует так называемую левостороннюю систему координат: X+ вправоY+ вверх Z+ вперед ( вглубь экрана ) Каждый объект также имеет свою собственную локальную (местную) систему координат, где он является центром. Глобальная система никогда не изменяется. Локальная система может перемещаться, поскольку объект двигается и поворачивается и центр этой системы также передвигается и поворачивается. Это используется в командах движения объекта: |
| ; Пример EntityX / EntityY / EntityZ. ; Escape - выход, другие клавиши - движение. Const width = 640, height = 480 Const KEY_ESC = 1, KEY_LEFT = 203, KEY_RIGHT = 205 Graphics3D 640, 480 AmbientLight 50, 50, 50 Global isMoving = False ; используется для управления остановкой/стартом движения Global count ; счетчик обновлений ; Установим камеру, свет и 3 объекта... cam = CreateCamera() PositionEntity cam, 0, 2, -50 CameraZoom cam, 4 lt = CreateLight() : TurnEntity lt, 30, 40, 0 Global oSphere, pCone, cSphere oSphere = CreateSphere() EntityColor oSphere, 250, 50, 0 ; Оранжевая сфера, родитель конуса pCone = CreateCone( 8, True, oSphere) ; будет родителем маленькой сферы ScaleEntity pCone, .8, 2.0, .8 PositionEntity pCone, 8, 0, 0 EntityColor pCone, 255, 255, 0 cSphere = CreateSphere( 8, pCone ) ; дочерняя сфера конуса EntityColor cSphere, 150, 150, 0 ScaleEntity cSphere, .4/.8, .4/2.0, .4/.8 ; попробуйте закомментировать эту строку PositionEntity cSphere, 0, 2, 0 ; выше родителя ; ... и запустим главный цикл. While Not KeyDown( KEY_ESC ) UpdateEverything RenderWorld ShowInfo Flip Wend End Function UpdateEverything( ) ; Объект не изменяет свою позицию относительно родителя, локальные координаты постоянны. ; Попробуйте раскомментировать команду PositionEntity, чтобы проверить это. If GetKey() Then isMoving = Not isMoving If isMoving TurnEntity oSphere, 0, .5, 0 TurnEntity pCone, .2, 0, 0 count = count + 1 a# = count Mod 360 ; PositionEntity cSphere, 0, 2 + Sin( a ), 0 ; поэкспериментируйте здесь End If End Function Function ShowInfo( ) ; вывести глобальные и локальные координаты для всех объектов Local x$, y$, z$ Color 255, 255, 255 Text 185, 20, "Global" Text 495, 20, "Local" Color 250, 50, 0 Text 20, 50, "oSphere: " + XYZ( oSphere, True ) Text 400, 50, XYZ( oSphere, False ) Color 255, 255, 0 Text 20, 75, " pCone: " + XYZ( pCone, True ) Text 400, 75, XYZ( pCone, False ) Color 150, 150, 0 Text 20, 100, "cSphere: " + XYZ( cSphere, True ) Text 400, 100, XYZ( cSphere, False ) End Function ; ****************************************************************** ; Эти функции форматируют текст на экране, чтобы не было слишком много чисел. Function Round#( x#, m# ) ; округляем x If m < 0.0 Then m = -m s# = Sgn( x ) If x < 0.0 Then x = -x diff# = x Mod m If diff < .5 * m Return ( x - diff ) * s Else Return ( m + x - diff ) * s End If End Function Function XYZ$( entity, globalFlag ) ex# = Round( EntityX( entity, globalFlag ), .001 ) ey# = Round( EntityY( entity, globalFlag ), .001 ) ez# = Round( EntityZ( entity, globalFlag ), .001 ) Return RSet( ex, 8 ) + RSet( ey, 8 ) + RSet( ez, 8 ) End Function |