суббота, 24 декабря 2016 г.

Двигаю полигоны.

    Я тут попробовал полигоны подвигать, скорее прицениться, что надо, для фейковой системы частиц на полигонах, вместо объектов. 
    Двигать вертексы не впервой, так что с этим разберусь. Правда есть еще такая особенность, что для каждой частицы придется учитывать находится ли она в поле зрения камеры, рассчитывать вектор (скорее уж матрицу) ориентации на камеру и прочие тяжелые с точки зрения просчета вещи. Сомневаюсь, короче, что будет сколько-нибудь быстрее добавления плейнов со скрытого слоя, там - то всё на Си, а не на Питоне. Одна надежда на mathutils. Посмотрим...
    Как видно на картинке, у вас кругом ни льдинки пока что объект представляет собой только два квадратных полигона, которые я и двигаю скриптом. в одном случае просто перемещаю вертексы полигона, а во втором вроде как перемещаю координату полигона, и пересчитываю координаты вертексов, просто суммирую. Вроде как прикидка для создания класса будущей частицы. У этого же полигона изменяю размер, через изменение длинны векторов к его вертексам. Если что, то этот полигон на картинке справа. Там же видно, что вполне можно пересчитать физические границы меша, правда сильно сомневаюсь, что получится прикрутить нормальную коллизию, это так, баловство.


Код скрипта, мягко говоря, недоработанный:

import bge
import mathutils
import random

cont = bge.logic.getCurrentController()
own = cont.owner
sens = cont.sensors['Always']
mesh = own.meshes[0]
# Этот полигон я буду двигать повертексно
pol0 = mesh.getPolygon(0)
v01 = mesh.getVertex(0, pol0.v1)
v02 = mesh.getVertex(0, pol0.v2)
v03 = mesh.getVertex(0, pol0.v3)
v04 = mesh.getVertex(0, pol0.v4)

# А этот через координату полигона
pol1 = mesh.getPolygon(1)
# заодно с размером побалуюсь.
size = own['size'] = random.random()

if 'pos' not in own:
    own['pos'] = pol1Pos = mathutils.Vector([0.0, 0.0, 1.0])
else:
    pol1Pos = own['pos']
   
# Получаю вертексы из полигона
# устанавливаю вертексам вектора смещения относительно цетра полигона 
v11 = mesh.getVertex(0, pol1.v1)
v11Pos = mathutils.Vector([-1.0 * size, -1.0 * size, 0.0* size])
v12 = mesh.getVertex(0, pol1.v2)
v12Pos = mathutils.Vector([1.0 * size, -1.0 * size, 0.0 * size])
v13 = mesh.getVertex(0, pol1.v3)
v13Pos = mathutils.Vector([1.0 * size, 1.0 * size, 0.0 * size])
v14 = mesh.getVertex(0, pol1.v4)
v14Pos = mathutils.Vector([-1.0 * size, 1.0 * size, 0.0 * size])

# обновляю координаты
v11.XYZ = pol1Pos + v11Pos
v12.XYZ = pol1Pos + v12Pos
v13.XYZ = pol1Pos + v13Pos
v14.XYZ = pol1Pos + v14Pos

if sens.positive:
    # обновляю координаты       
    v01.x = v01.x + 0.1
    v02.x = v02.x + 0.1
    v03.x = v03.x + 0.1
    v04.x = v04.x + 0.1
    # обновляю координату полигона
    pol1Pos[0] -= 0.1
    pol1Pos[1] += 0.1
    own['pos']  = pol1Pos
    # обновляю физику
    own.reinstancePhysicsMesh()