Автор Тема: Странное поведение в BGE  (Прочитано 35426 раз)

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #105 : 13 Апрель 2018, 18:27:41 »
да

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #106 : 13 Апрель 2018, 18:45:31 »
Смысл вопроса в том, что колесо, по сути, зубчатое. Значит проминание грунта должно быть неравномерным, т.е. луч здесь видно не подойдёт. Сенсор "Столкновение", а?

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #107 : 13 Апрель 2018, 19:46:38 »
... попробуй с этим сенсором, может получится красиво и эффективно, не знаю ...
... в blender можно получить результат разными путями, но мне видится пока только вариант, который был описан ранее ...

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #108 : 13 Апрель 2018, 20:58:30 »
1 брать каждый треугольник меша колеса:
Давай поэтапно. Треугольник меша колеса касающийся грунта, а как его определить? Я пока могу определить мировую позицию опорной точки этого колеса. Но что это даст?
Через столкновение так же не получается - позиция грунта опять же выдаётся для опорной точки которая неизменна.

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #109 : 13 Апрель 2018, 21:08:46 »
... http://blender-3d.ru/forum/index.php/topic,2090.msg29537.html#msg29537 есть ссылки на meshproxy ...
... по идее нужно взять мешь простого протектора, перебрать его треугольники и спроецировать на грунт ...

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #110 : 14 Апрель 2018, 03:38:39 »
... по ходу, как мне думается, нужно решить следующую задачу и решение должно быть оптимальным ...
... допустим есть двумерный массив 100х100 содержащий 0 ...
... есть три индекса, например [10,10], [25,35],[5,50], которые образуют треугольную область из элементов этого массива ...
... как присвоит 1 элементам массива входящим в эту область? ...

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #111 : 14 Апрель 2018, 14:59:18 »
Кстати, хотел давно спросить. Николай Николаев, а можно такую "цацку" сделать с рисованием в текстуру в BGE? А то, куча объектов для следа - это будет сильно тормозить, если их не уничтожать со временем... нужно для царапин и следов от выстрелов и холодного оружия... визуализации повреждений противников...

... пока не очень производительно и с использованием PIL для трансформации кисти ...
... PIL нужно ставить дополнительно и копировать в каталог с Blender ...
https://yadi.sk/d/3K7nFMpt3UQbDF

Код
import bge
import random
from PIL import Image
from bgl import Buffer, GL_BYTE


dd = 1024
d2 = dd/2
bb = 128
b2 = 64
ss = 5

sc = bge.logic.getCurrentScene()
ob = sc.objects['ground']
ground = Image.open(bge.logic.expandPath("//ground.png"))
sled = Image.open(bge.logic.expandPath("//brush.png"))

def init():
    ob.collisionCallbacks.append(order)
    addSp(None)
   
def addSp(ob):
    sp = sc.objectsInactive["Sphere"]
    sp = sc.addObject(sp)
    sp.worldPosition = (random.random()*ss-ss/2,random.random()*ss-ss/2,7)
    if ob:
        ob.endObject()


def order(object, point, normal):
    x = int((1.0+point.x/ss)/2*dd-b2)
    y = int((1.0-point.y/ss)/2*dd-b2)
    image = ground
    sleds = image.crop((x,y,x+bb,y+bb))
    for i in range(int(random.random()*7+3)):
        brush = sled.copy()
        r = 180*random.random()
        s = int(random.random()*bb)
        brush = brush.rotate(r)
        brush = brush.resize((s,s))
        sleds.paste(brush,(0,0),brush)
       
    image.paste(sleds,(x,y))

    image = image.convert("RGB")
    image = image.transpose(Image.FLIP_TOP_BOTTOM)
    idata = image.tobytes()
    ibuff = Buffer(GL_BYTE,len(idata),idata)

    if "buff" not in ob:
        ob["buff"] = bge.texture.ImageBuff()
    ob["buff"].load(ibuff,dd,dd)
   
    bge.logic.texture = bge.texture.Texture(ob,0)
    bge.logic.texture.source =  ob["buff"]
    bge.logic.texture.refresh(True)
    addSp(object)

Оффлайн Samovar

  • Житель
Re: Странное поведение в BGE
« Ответ #112 : 14 Апрель 2018, 21:18:19 »
Спасибо Николай Николаев за пример, попробую разобраться, но PIL вряд ли подойдёт по причине тормознутости...
Возможно PIL заменить на что-то из этого?

https://docs.blender.org/api/2.79/bge.render.html
https://docs.blender.org/api/2.79/bge.texture.html

или из OpenGL более шустрое?
https://docs.blender.org/api/2.79/bgl.html

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #113 : 14 Апрель 2018, 21:27:01 »
>> Возможно PIL заменить на что-то из этого?
... по сути можно напрямую рисовать в шейдерах ...
... PIL, как пример, нужен для манипуляции с пиксельным буфером и насколько понял, то существенное ограничение производительности на этапе подмены текстуры ...

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #114 : 20 Апрель 2018, 15:28:42 »
>> Есть ли способ в Blender подобной разбивки.
... в режиме редактирования выделить все полигоны A и далее Ctrl+T ...
Николай, если я ещё не совсем надоел, то хочу поделиться ещё одной проблемой со следом (всё никак мне покоя не даёт моя горка с колесом). Тут такая петрушка получается. На малых скоростях, т.е. когда колесо катится с горки без понуждения, то след ложится ровно, однако если это колесо понуждать к ускорению, то с определённого момента след становится пунктирным. Думаю что колесо за один кадр проходит большее расстояние чем размер следа. Участить обращение к модулю возможно? Вроде и так сенсор "Всегда" будирует контроллер. Можно, конечно, удлинить плоскость с текстурой следа, но тогда при малых скоростях, будет не след а мазня.
И, ещё непонятка. Колесо скатывается с горки в пропасть и... оставляет за собой следы в пространстве. Как это может быть, ведь столкновения в полёте не происходят?

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #115 : 20 Апрель 2018, 16:45:57 »
Николай, я тут подумал, может как-то можно удлинять или укорачивать след в зависимости от скорости движения колеса? Правда этот вариант тоже мне не нравится - текстура ведь тоже будет неравномерной. С другой стороны её особо разглядывать-то некогда, но всё же.
Что бы ты порекомендовал, может какой другой вариант подскажешь?

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #116 : 20 Апрель 2018, 20:52:58 »
>>  если я ещё не совсем надоел
... нет никакой необходимости оправдываться, смело задавай вопросы и если ответа не последовала пробуй их задать ещё раз ...

>> Участить обращение к модулю возможно? Вроде и так сенсор "Всегда" будирует контроллер.
... суть в том, что ты не понял что "Всегда" тут не причём ...
... "Всегда" срабатывает один раз и вызывает не модуль, а функцию модуля (по ходу модуль инициализируется, но для тебя важен именно вызов функции модуля) ...
... для того чтобы решить задачу тебе нужно отчасти восстановить ту логику которую ты использовал ранее но в контексте модуля ...
... то есть - запоминать точку соприкосновения (которая сформировалась в результате срабатывания коллизии) и далее при следующем срабатывании коллизии заполнять путь от старого значения соприкосновения до нового с учётом длины следа, после чего новое значение нужно поместить на место ранее запомненного и ждать очередного срабатывания коллизии ...

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #117 : 21 Апрель 2018, 10:00:09 »
>>  если я ещё не совсем надоел
... нет никакой необходимости оправдываться, смело задавай вопросы и если ответа не последовала пробуй их задать ещё раз ...
Принято. Просто терпеть не могу зануд, а сам сейчас занудствую, пытаясь расставить все точки над i. Некомфортно чувствую себя.
Цитировать
>> Участить обращение к модулю возможно? Вроде и так сенсор "Всегда" будирует контроллер.
... суть в том, что ты не понял что "Всегда" тут не причём ...
... "Всегда" срабатывает один раз и вызывает не модуль, а функцию модуля (по ходу модуль инициализируется, но для тебя важен именно вызов функции модуля) ...
... для того чтобы решить задачу тебе нужно отчасти восстановить ту логику которую ты использовал ранее но в контексте модуля ...
... то есть - запоминать точку соприкосновения (которая сформировалась в результате срабатывания коллизии) и далее при следующем срабатывании коллизии заполнять путь от старого значения соприкосновения до нового с учётом длины следа, после чего новое значение нужно поместить на место ранее запомненного и ждать очередного срабатывания коллизии ...
Предыдущая позиция следа:
 ob.worldPosition =  <Vector (2.7682, -72.6654, 0.0300)>
Следующая позиция следа:
 ob.worldPosition =  <Vector (2.7792, -73.0450, 0.0300)>
Расстояние между позициями (0.011, 0.3796). Расстояние по оси X в данном случае не имеет значения, а вот по оси Y = 37.96 см. при длине следа 24 см. образуется прогал между следами в 13.96 см.
Если я буду располагать след через 24 см, то прогал будет наращиваться, и в конечном итоге, след будет значительно отставать от колеса. По крайней мере, я так понял твоё предложение. А вот если для этой скорости расположить след длиной 40 см., то, по идее, прогала между следами уже не должно быть.
Подскажи в чём я неправ, что упускаю? Если я прав, то каким образом я могу изменять длину следа в зависимости от скорости движения колеса?
Да, по поводу образования следа в пропасти, можешь что-либо предположить?

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #118 : 21 Апрель 2018, 12:43:25 »
>> Если я буду располагать след через 24 см ... А вот если для этой скорости расположить след длиной 40 см
... у тебя след фиксированной ширины, располагать его нужно через одинаковый интервал с учётом запаса на поворот ...
... пусть у тебя уже есть траектория следа со всеми точками - какой алгоритм заполнение этой траектории элементами (следами)? ...

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #119 : 21 Апрель 2018, 16:08:04 »
... добавлю рассуждалок ...
... допустим у тебя v1 - текущее значение позиции, v0 - предыдущее (v1,v0 - это Vector), sl - длина следа ...
тогда
dv = v1-v0
ds = dv.length
if(ds>sl): #если участок больше длины следа, то нужно рисовать промежуточные следы
   n = int(ds/sl)
   dss = ds/n
   for i=0 to range(n):
        vt = v0 + dss*i
        vt - это точка в которой нужно рисовать след
        ... далее код рисования следа
        ...

после этого всегда рисовать в v1


 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

Скачано: 112
Автор: Dilifa12