Author Topic: Качающиеся объекты  (Read 601 times)

0 Members and 1 Guest are viewing this topic.

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Качающиеся объекты
« on: November 21, 2014, 05:20:27 PM »
Качающиеся из стороны в сторону объекты

Как заставить объкеты качаться (раскачиваться) из стороны в сторону?
Никакая дополнительная физика здесь не нужна: ни ODE, ни Newton, ни даже встроенная в WS3D.
Просто как всегда несколько функций, умно использованных для определённой цели!

Как это работает? В примере в качестве объектов используются кубы, но конечно, можно использовать что угодно: шары и другие примитивы и естественно сложные модели.
Все кубы соединены между собой с использованием функции wSetNodeParent, где каждый следующий объект становится для следующего за ним - родительским, поэтому они и "держатся друг за друга".

Этот эффект можно использовать для самых разных целей: раскачивающиеся от ветра деревья или другие объекты (для этого конечно нужны не цельные деревья, а составленные из частей); цепи, верёвки и т.п. Даже верёвочный мостик через реку, кишащую крокодилами   :D

Менять настройки этого эффекта можно в следующих строках:
Code: [Select]
CubeRotation = cos(Timer) * 10Timer - скорость раскачивания
10 - угол раскачивания

Code: [Select]
wSetNodeRotation( LeftNodes(i),  0.0, 0.0, CubeRotation )
wSetNodeRotation( RightNodes(i), 0.0, 0.0, CubeRotation )
CubeRotation - в каком направлении идёт раскачивание (в примере по оси Z)/
Меняйте поочерёдно или сразу все нули на CubeRotation и смотрите, что происходит.

Раскачивайте(сь) на здоровье!  ;D


Code: [Select]
    '' ----------------------------------------------------------------------------
    '' Пример: Раскачивающиеся объекты
    '' Made by Frank Dodd
    '' Altered by Alec Artifex
    '' ----------------------------------------------------------------------------

    '' Includes
    #include "WorldSim3D.bi"

    '' глобальные переменные

    ' WS3D объекты
    DIM MeshTexture as wTexture
    DIM OurCamera as wCamera
    DIM i as Integer
    DIM LeftNodes(0 to 7) as wNode
    DIM RightNodes(0 to 7) as wNode
    DIM LastLeftNode as wNode
    DIM LastRightNode as wNode
    DIM CubeRotation as double

    ' -----------------------------------------------------------------------------
    ' Инициализация WS3D
    wStart( wDT_OPENGL, 600, 600, wBITS_PER_PIXEL_32, _
            wWINDOWED, wSHADOWS, wCAPTURE_EVENTS )

    ' установим заголовок окна
    wSetWindowCaption( "Wiggling Cubes" )

    ' загрузим текстуру для кубов
    MeshTexture = wGetTexture( "../media/Textures/default_texture.png" )

    ' добавим 2 цепи нодов (левую и правую), в каждой из которых будет по 8 кубов
    for i = 0 to 7
   
    ' левая цепь:
        LeftNodes(i)  = wAddTestSceneNode

        wSetNodeMaterialTexture( LeftNodes(i), MeshTexture, 0 )
        if i > 0 then
            wSetNodeParent( LeftNodes(i), LastLeftNode )
            wSetNodePosition( LeftNodes(i), 0.0, 10.0, 0.0 )
        else
            wSetNodePosition( LeftNodes(i), -10.0, 0.0, 0.0 )
        end If
       
      ' правая цепь
        RightNodes(i)  = wAddTestSceneNode

        wSetNodeMaterialTexture( RightNodes(i), MeshTexture, 0 )
        if i > 0 then
            wSetNodeParent( RightNodes(i), LastRightNode )
            wSetNodePosition( RightNodes(i), 0.0, 10.0, 0.0 )
        else
            wSetNodePosition( RightNodes(i), 10.0, 0.0, 0.0 )
        end if

      ' очередной нод получает свой очередной номер, чтобы занять свою позицию
      ' очередной левый:
        LastLeftNode = LeftNodes(i)
      ' очередной правый:
        LastRightNode = RightNodes(i)
    next i
       
    ' добавим на сцену рассеянный свет
    wSetAmbientLight( 1,1,1 )

    ' добавим на сцену камеру и направим на кубы
    OurCamera = wAddFPSCamera
    wSetNodePosition( OurCamera, 30,50,-125)
    wSetCameraTarget(OurCamera, 0,75,0)
    wHideMouse


    ' -----------------------------------------------------------------------------
    ' Работа WS3D окружения
    WHILE wRunning
        ' начало отрисовки сцены; цвет фона небесно-голубой
        wBeginScene( 240, 255, 255 )

        ' анимируем сцену
        CubeRotation = cos(Timer) * 10
        for i = 0 to 7
            wSetNodeRotation( LeftNodes(i),  0.0, 0.0, CubeRotation )
            wSetNodeRotation( RightNodes(i), 0.0, 0.0, CubeRotation )
        next i

        ' отрисовка сцены
        wDrawScene
       
        ' заканчиваем отрисовку и выполняем рендеринг сцены
        wEndScene
        wSetFPS
        wCloseESC()
    WEND

    ' -----------------------------------------------------------------------------
    ' останавливаем WS3D и высвобождаем ресурсы
    wStop
« Last Edit: November 21, 2014, 05:25:22 PM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!

Offline Nikolas - WS3D Developer

  • Programmer
  • Global Moderator
  • Marquess
  • *
  • Posts: 889
  • Reputation 63
Re: Качающиеся объекты
« Reply #1 on: November 21, 2014, 08:19:49 PM »
Хмм, прикольно.
А если захотим раскачивать все предметы, то заставим раскачиваться..... камеру 8-))
Под лежачий камень мы всегда успеем...

Offline Alec - WS3D Developer

  • Producer
  • Administrator
  • Marquess
  • *
  • Posts: 911
  • Reputation 36
  • Game making is my hobby for life!
Re: Качающиеся объекты
« Reply #2 on: November 21, 2014, 08:57:48 PM »
Ну да, и камеру можно заставить качаться.
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!