Author Topic: Изменение координат вершин меша на лету  (Read 870 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!
Изменение координат вершин пользовательского меша "на лету"

Как изменить координаты пользовательского меша во время игры?
Это делается функцией wSetMeshVertexCoords.
Нужно просто указать, какую координату и для какой вершины нужно менять.
В примере создаётся простая пирамида: 5 вершин, 6 треугольников и 18 индексов для вершин этих треугольников.

Затем устанавливаем новые положения этих координат вершин. В данном примере будем менять только одну координату одной из вершин (вершины пирамиды; не путайте вершины меша и вершину пирамиды, это разные вещи).
Этот простой пример показывает, что можно менять ландшафт сгенерированного Террейна.
В коде есть необходимые комментарии, если что-то непонятно, отвечу.

Управление: клавиши 1 и 2 - меняем высоту вершины пирамиды.

Code: [Select]
'' ----------------------------------------------------------------------------
'' Пример сделал Alec (WorldSim3D developer)
'' ----------------------------------------------------------------------------
'' Пример: Создаём пользовательский меш и меняем его свойства
'' В примере показано, как сделать самому меш (3D модель). В данном случае создаётся
'' простой меш пирамиды. Затем такой только что созданный меш добавляется на сцену как
'' новый нод. И наконец, мы меняем "на лету" одно из его свойств: координаты вершин.
'' Это нужно в тех случаях, когда нужно менять разные свойства мешей "на лету", например,
'' можно сгенерировать Террейн, а затем менять ландшафт, меняя высоту каждой точки (вершины меша) ландшафта.
'' ----------------------------------------------------------------------------

'' Подключаем главную библиотеку движка
#include "WorldSim3D.bi"

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

' Объекты WorldSim3D
DIM Mesh as wMesh
DIM MeshTexture as wTexture
DIM SceneNode as wNode
DIM OurCamera as wCamera

DIM KeyEvent as wKEY_EVENT Ptr
' -----------------------------------------------------------------------------
' Запускаем интерфейс WorldSim3D
wStart( wDT_OPENGL, 800, 600, wBITS_PER_PIXEL_32,_
          wWINDOWED, wSHADOWS, wCAPTURE_EVENTS, wVERTICAL_SYNC_ON )
         
' Устанавливаем текст заголовка окна приложения
wSetWindowCaption( "Example: Change a landscape heights run-time" )

' Создадим меш из массива вершин (объявленных как типы). Каждая из этих вершин
' задают точку в пространстве. Также создадим массив индексов к этим вершинам,
' чтобы составить из них группы по 3 индекса. Эти группы являются треугольниками,
' из которых и состоит меш.

DIM verts(0 to 4) as wVERT
DIM indices(0 to 17) as ushort

' -----------------------------------------------------------------------------
' Установим 5 вершин, чтобы задать точки меша. У этих вершин -
' несколько свойств, которые нужно установить, чтобы правильно задать структуру меша.
' Но в данном примере установим только координаты вершин и индексы для этих вершин.
' Координаты:
verts(0).x = -10 : verts(0).y = 0 : verts(0).z = -10
verts(1).x = -10 : verts(1).y = 0 : verts(1).z = 10
verts(2).x = 10 : verts(2).y = 0 : verts(2).z = 10
verts(3).x = 10 : verts(3).y = 0 : verts(3).z = -10
verts(4).x = 0 : verts(4).y = 20 : verts(4).z = 0

' Индексы вершин:
' У нас 6 треугольников по 3 вершины, всего индексов 18
indices(0) = 0 : indices(1) = 1 : indices(2) = 4
indices(3) = 1 : indices(4) = 2 : indices(5) = 4
indices(6) = 2 : indices(7) = 3 : indices(8) = 4
indices(9) = 3 : indices(10) = 0 : indices(11) = 4
indices(12) = 2 : indices(13) = 1 : indices(14) = 0
indices(15) = 0 : indices(16) = 3 : indices(17) = 2

' сделаем вершины белыми
verts(0).vcolor = &h00FFFFFF
verts(1).vcolor = &h00FFFFFF
verts(2).vcolor = &h00FFFFFF
verts(3).vcolor = &h00FFFFFF
verts(4).vcolor = &h00FFFFFF

' создаём меш из массива вершин и их индексов
Mesh = wCreateMesh( "TestMesh", 5, verts(0), 18, indices(0))

' добавим на сцену Нод для созданного меша
SceneNode = wAddMeshToScene( Mesh )

' камера
OurCamera = wAddFPSCamera( wNO_OBJECT, 100.0f, 0.1f )
wSetNodePosition( OurCamera, 30,50,25)
wSetCameraTarget(OurCamera, 0,0,0)
wHideMouse

DIM pos_vert(0 to 4) as wVECTOR ' количество наборов координат для вершин
DIM start as uinteger = 0
DIM end_mesh as uinteger = 4
pos_vert(4).y = verts(4).y ' первоначальная высота вершины, которую будем менять
wDebugDataVisible ( SceneNode, 8 )' отладочный режим меша


' -----------------------------------------------------------------------------
' ========================== ГЛАВНЫЙ ЦИКЛ ПРОЕКТА ================================
WHILE wRunning
    ' начинаем отрисовку сцены с цветом фона, например зелёный (который устанавливаем числами 0,125,0)
    wBeginScene( 64, 96, 96 )

While wKeyEventAvailable
            KeyEvent = wReadKeyEvent
            select case as const KeyEvent->key
            case KEY_KEY_1    '
                ' клавишами 1 и 2 будем поднимать или опускать вершину пирамиды
                if KeyEvent->direction = wKEY_DOWN Then
                    pos_vert(0).x = -10 : pos_vert(0).y = 0 : pos_vert(0).z = -10
  pos_vert(1).x = -10 : pos_vert(1).y = 0 : pos_vert(1).z = 10
  pos_vert(2).x = 10 : pos_vert(2).y = 0 : pos_vert(2).z = 10
  pos_vert(3).x = 10 : pos_vert(3).y = 0 : pos_vert(3).z = -10
  pos_vert(4).x = 0 : pos_vert(4).y = pos_vert(4).y + 1 : pos_vert(4).z = 0 ' меняем координату Y этой вершины на плюс
wSetMeshVertexCoords ( Mesh, 0, @pos_vert(0), 1, @start, @end_mesh, 0 ) 'установим (обновим) вершины меша
' в соответствии с изменившимися координатами вершин (в данном случае меняем только одну).
                EndIf
               
            case KEY_KEY_2
                if KeyEvent->direction = wKEY_DOWN Then
                    pos_vert(0).x = -10 : pos_vert(0).y = 0 : pos_vert(0).z = -10
  pos_vert(1).x = -10 : pos_vert(1).y = 0 : pos_vert(1).z = 10
  pos_vert(2).x = 10 : pos_vert(2).y = 0 : pos_vert(2).z = 10
  pos_vert(3).x = 10 : pos_vert(3).y = 0 : pos_vert(3).z = -10
  pos_vert(4).x = 0 : pos_vert(4).y = pos_vert(4).y - 1 : pos_vert(4).z = 0 ' меняем координату Y этой вершины на минус
wSetMeshVertexCoords ( Mesh, 0, @pos_vert(0), 1, @start, @end_mesh, 0 )
                EndIf
            wCloseKEY_ESC()
            end Select
Wend
'
    ' отрисовка сцены
    wDrawScene
   
    ' заканчиваем отрисовку сцены и отображаем её
    wEndScene
    wSetFPS
    ''wCloseESC()
WEND

' -----------------------------------------------------------------------------
' Останавливаем работу движка и высвобождаем ресурсы памяти
wStop
« Last Edit: January 06, 2015, 04:11:20 PM by Alec - WS3D Developer »
WorldSim3D = 3D + FreeBasic. Программируй в удовольствие, а не "в тягость"! Make your project with pleasure, not with strain!