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

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #15 : 29 Март 2018, 12:20:21 »
Очень похоже что я рано в эти дебри свой нос сунул.
Ладно, помоги хоть найти ответы на более простые вопросы, которые уже мною заданы.

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #16 : 29 Март 2018, 13:30:42 »
>> Ладно, помоги хоть найти ответы на более простые вопросы, которые уже мною заданы.
... только без паники, повторите вкратце суть вопросов ...
... так или иначе постараемся найти на них решение ...

>> Очень похоже что я рано в эти дебри свой нос сунул.
... в чем предмет опасения? ...
... посмотри функцию alignAxisToVect, если у тебя есть нормаль к поверхности, то попробуй выровнять след по ней ...
https://docs.blender.org/api/blender_python_api_2_77_0/bge.types.KX_GameObject.html?highlight=alignaxistovect#bge.types.KX_GameObject.alignAxisToVect

http://bgepython.tutorialsforblender3d.com/GameObject/alignAxisToVect


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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #17 : 30 Март 2018, 02:03:48 »
... вот немного поправил твой код, пример во вложении ...
Код: python
import bge
from mathutils import Vector# из модуля mathutils импортировать Vector     

def init():
    global sc
    global wl
    global sl
    global gr
   
    print("Init app\n\n\n")
    sc = bge.logic.getCurrentScene()   
    sl = sc.objectsInactive['sled']
    wl = sc.objects['wheel']
    gr = sc.objects['ground']
    gr.collisionCallbacks.append(callback)
   
def callback(object, point, normal):
    ob = sc.addObject(sl)
    a = wl.getAxisVect(Vector((0,0,1)))
    ob.worldPosition = object.worldPosition+Vector((0,0,-1))
    ob.alignAxisToVect(a,0,1)

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #18 : 30 Март 2018, 06:42:20 »
... немного поправил, ввёл переменную-вектор z ...
Код: python
import bge
from mathutils import Vector# из модуля mathutils импортировать Vector     

z = Vector((0,0,1))

def init():
    global sc
    global wl
    global sl
    global gr
   
    print("Init app\n\n\n")
    sc = bge.logic.getCurrentScene()   
    sl = sc.objectsInactive['sled']
    wl = sc.objects['wheel']
    gr = sc.objects['ground']
    gr.collisionCallbacks.append(callback)
   
def callback(object, point, normal):
    ob = sc.addObject(sl)
    a = wl.getAxisVect(z)
    ob.worldPosition = object.worldPosition-z
    ob.alignAxisToVect(a,0,1)


... по ссылкам текстурированная модель и текстура для примера ...
https://yadi.sk/d/OCHmZeXz3TtzUA
https://yadi.sk/i/L17bfQFM3TtzSZ

... мувик ...
https://youtu.be/gHhEOB9tVQk

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #19 : 30 Март 2018, 09:32:09 »
>> Ладно, помоги хоть найти ответы на более простые вопросы, которые уже мною заданы.
... только без паники, повторите вкратце суть вопросов ...
... так или иначе постараемся найти на них решение ... >> Очень похоже что я рано в эти дебри свой нос сунул.
... в чем предмет опасения? ...
... посмотри функцию alignAxisToVect, если у тебя есть нормаль к поверхности, то попробуй выровнять след по ней ...
Николай, паники-то нет никакой. Всё дело в том, что я действительно не программист. Могу создать цикл, могу провести проверку условий, и, по результатам проверки что-то предпринять. Тонкости типа классов, их отличие, структуры и т.д. мне практически неведомы. Я полагал, что возможности Blender снивелируют дефицит знаний и опыта в программировании. В какой-то мере это так и случилось. Однако есть не менее серьёзное препятствие – я зачастую не могу правильно изложить свои затруднения. Опять же из-за малых знаний.
Инженер в расчётах в редких исключениях сам занимается выводом необходимых формул. Чаще пользуется у же выведенными ранее, самим или кем-то, подставляя в них необходимые данные. Этот подход меня уже выручал неоднократно, на него я и сориентирован.
Николай, давай с этой мелодрамой завяжем.
Суть вопросов в следующем.
В предложенном мною рисунке Sled 3.jpg. чётко видно, что нормаль следа не соответствует нормали поверхности в точке соприкосновения, отсюда и ступенчатость. Можно ли привести каким-то способом нормаль следа в соответствие с нормалью поверхности в точке соприкосновения? След ведь на поверхности, следовательно, надо каким-то образом определить направление нормали у поверхности в точке соприкосновения и изменить ориентацию следа в соответствии с точкой соприкосновения.
Цитировать
https://docs.blender.org/api/blender_python_api_2_77_0/bge.types.KX_GameObject.html?highlight=alignaxistovect#bge.types.KX_GameObject.alignAxisToVect
http://bgepython.tutorialsforblender3d.com/GameObject/alignAxisToVect
Выравнивание оси игрового объекта по мировому вектору.
alignAxisToVect(vect, axis, fac – скобка не закрыта из-за опечатки?
vect – в моём случае (0.0, 0.0, -1.0)? Отрицательное направление оси Z
axis – в моём случае 2? Ось Z колеса.
fac – расстояние между предыдущей точкой вывода следа и текущей?
Что получаю в результате расчёта? Насколько я понял, нормаль поверхности в точке соприкосновения ведь не определена, а, следовательно, пока преждевременно след располагать на поверхности?



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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #20 : 31 Март 2018, 04:00:15 »
>> Насколько я понял, нормаль поверхности в точке соприкосновения ведь не определена, а, следовательно, пока преждевременно след располагать на поверхности?
... ответ не однозначен (для меня) - значение точки соприкосновения и нормали формируется во время обратного вызова при обработке коллизии https://docs.blender.org/api/2.79/bge.types.KX_GameObject.html?highlight=collisioncallbacks#bge.types.KX_GameObject.collisionCallbacks ...
... насколько это значения тебя устроят?! сомневаюсь что полностью ...

>> Выравнивание оси игрового объекта по мировому вектору.
>> alignAxisToVect(vect, axis, fac – скобка не закрыта из-за опечатки?

... где приведён такой текст? ...

>> vect – в моём случае (0.0, 0.0, -1.0)? Отрицательное направление оси Z
... обрати внимание на этот топик http://blender-3d.ru/forum/index.php/topic,326.msg4308.html#msg4308 ...
... тебя не должно это пугать ...
... если у тебя есть z = Vector(0,0,1) , то чтобы получить Vector(0,0,-1) нужно просто использовать -z ...
... в целом в коде у тебя векторные операции будут выглядеть как a = b+c ...

>> axis – в моём случае 2? Ось Z колеса.
... допустим, для следа ответ "да" ...

>>fac – расстояние между предыдущей точкой вывода следа и текущей?
... 1 ...

>> Всё дело в том, что я действительно не программист.
... какой вид деятельности? если не секрет ...

>> Могу создать цикл, могу провести проверку условий, и, по результатам проверки что-то предпринять. Тонкости типа классов, их отличие, структуры и т.д. мне практически неведомы.
... страх, негативный опыт, отрицательная практика или бытовое отвращение к этой категории? по сути класс или структура это некая оболочки скрывающая свои внутренности и не дающая им рассыпаться, но при это весь дружелюбна к внешнему взаимодействию ...
https://docs.blender.org/api/blender_python_api_2_77_0/info_overview.html?highlight=class#manipulating-classes
https://docs.python.org/3/tutorial/classes.html
... но писать собственные классы не всегда требуется, и в большинстве случаев нужно использовать готовы, более того ты это уже делаешь в своём коде ...

>> Я полагал, что возможности Blender снивелируют дефицит знаний и опыта в программировании. В какой-то мере это так и случилось.
... эта печаль рано или поздно догоняет всех и не только в bge, но и в других движках ...

>> Однако есть не менее серьёзное препятствие – я зачастую не могу правильно изложить свои затруднения. Опять же из-за малых знаний.
... пиши больше мелких вопросов и типа "делаю это, не получается" ...
... и выкладывай больше кода и промежуточные модели, это значительно ускоряет решение проблем ...

>> Инженер в расчётах в редких исключениях сам занимается выводом необходимых формул. Чаще пользуется у же выведенными ранее, самим или кем-то, подставляя в них необходимые данные. Этот подход меня уже выручал неоднократно, на него я и сориентирован.
... http://bgepython.tutorialsforblender3d.com/  -  попробуй использовать те примеры, которые уже решены и хорошо себя показали, и в части этой позитивной практики можешь комбинировать элементы этих решений в своих целях ...

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #21 : 31 Март 2018, 04:22:03 »
... кстати, ты смотрел мувик из моего предыдущего сообщения? ...

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #22 : 31 Март 2018, 07:48:41 »
... еще немного кода, пример во вложении ...
Код: python
import bge
from mathutils import Vector# из модуля mathutils импортировать Vector     

z = Vector((0,0,1))

def init():
    global sc
    global wl
    global sl
    global gr
       
    print("Init app\n\n\n")
    sc = bge.logic.getCurrentScene()   
    sl = sc.objectsInactive['sled']
    wl = sc.objects['wheel']
    gr = sc.objects['ground']
    gr.collisionCallbacks.append(callback)
   
def callback(object, point, normal):
    ob = sc.addObject(sl)
    a = wl.getAxisVect(z)
    ob.alignAxisToVect(a,0,1)
    a = ob.getAxisVect(z)
    ob.worldPosition = object.worldPosition
    obj,point,normal = ob.rayCast(ob.worldPosition-a*2)
    if obj:
        print(point)
        ob.worldPosition = point+a*0.03
        ob.alignAxisToVect(normal,2,1)

... получить нормаль к поверхности можно с помощью rayCast
https://docs.blender.org/api/2.79/bge.types.KX_GameObject.html?highlight=raycast#bge.types.KX_GameObject.rayCast
http://bgepython.tutorialsforblender3d.com/GameObject/rayCast

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #23 : 31 Март 2018, 07:58:24 »
... и твой код с рейкастингом, файл во вложении ...
Код: python
from bge import logic as L  # из модуля bge импортировать logic как L
from mathutils import Vector# из модуля mathutils импортировать Vector     
cont = L.getCurrentController()# получить активный контроллер
own = cont.owner    # получить объект Koleso - владелец контроллера
pos = own.worldPosition # получить позицию колеса
print("6 pos = ", pos)    #
scn =  own.scene    # получить активную сцену Scene
inobjs = scn.objectsInactive    # получить неактивный объект [Plane]
print("9 inobjs = ", inobjs)    #
#вычисление скорости движения объекта
sm = own.get("oldPos", pos) - pos
print("12 sm = ", sm)             #
spd = (sm.x ** 2 + sm.y ** 2) ** 0.5
own["oldPos"] = pos.copy() # .copy() - копирует вектор
print("15 own[oldPos] = ", own["oldPos"], " spd = ",spd)   #
###########настройки#############
sled = 'Plane'   # имя объекта-следа, он находится на скрытом слое
speed = 0.01   #скорость, требуемая для активации
################################
if sled in inobjs and spd >= speed: #если есть объект-след на скрытом слое, а скорость больше или равна указанной
    sled = scn.addObject(inobjs[sled]) # добавить след в сцену
    a = own.getAxisVect(Vector((0,0,1)))
    sled.alignAxisToVect(a,0,1)
    a = sled.getAxisVect(Vector((0,0,1)))
    sled.worldPosition = own.worldPosition
    obj,point,normal = sled.rayCast(sled.worldPosition-a*2)
    if obj:
        sled.worldPosition = point+a*0.03
        sled.alignAxisToVect(normal,2,1)   
    print("25 sled.worldPosition = ", sled.worldPosition)   #

print(" = ")

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #24 : 31 Март 2018, 09:42:42 »
>> Насколько я понял, нормаль поверхности в точке соприкосновения ведь не определена, а, следовательно, пока преждевременно след располагать на поверхности?
... ответ не однозначен (для меня) - значение точки соприкосновения и нормали формируется во время обратного вызова при обработке коллизии https://docs.blender.org/api/2.79/bge.types.KX_GameObject.html?highlight=collisioncallbacks#bge.types.KX_GameObject.collisionCallbacks ...
... насколько это значения тебя устроят?! сомневаюсь что полностью ...
Открыл ссылку… Здорово, но абсолютно непонятно… В объектном программировании я ноль.
Мне непонятна даже просто последовательность происходящего в модуле.
Возможно представить этот модуль в виде, например, нескольких скриптов – может сопоставление модуля с ними мне что-то разъяснит.
>> Выравнивание оси игрового объекта по мировому вектору.
>> alignAxisToVect(vect, axis, fac – скобка не закрыта из-за опечатки?
... где приведён такой текст? ...
В твоей ссылке http://bgepython.tutorialsforblender3d.com/GameObject/alignAxisToVect в сообщении от 29 Марта 2018, 13:30:42.
Я вижу так:

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #25 : 31 Март 2018, 09:46:51 »
>> Возможно представить этот модуль в виде, например, нескольких скриптов – может сопоставление модуля с ними мне что-то разъяснит.
... посмотри код в сообщении http://blender-3d.ru/forum/index.php/topic,2090.msg29485.html#msg29485 ...
« Последнее редактирование: 31 Март 2018, 10:05:14 от Николай Николаев »

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #26 : 31 Март 2018, 10:32:01 »
>> vect – в моём случае (0.0, 0.0, -1.0)? Отрицательное направление оси Z
... обрати внимание на этот топик http://blender-3d.ru/forum/index.php/topic,326.msg4308.html#msg4308 ...
... тебя не должно это пугать ...
... если у тебя есть z = Vector(0,0,1) , то чтобы получить Vector(0,0,-1) нужно просто использовать -z ...
... в целом в коде у тебя векторные операции будут выглядеть как a = b+c ...
Погоди гнать, Николай с векторными операциями.
Строка b.normalize() позволяет определить нормаль для вектора b? Мне необходима нормаль к части поверхности (плоскости) в определённой точке. Следовательно, я должен каким-то образом вычленить ту часть поверхности, обозначить её как-то и потом найти её нормаль с помощью «.normalize»? Если я правильно понял, то, как я это должен сделать?

>> Всё дело в том, что я действительно не программист.
... какой вид деятельности? если не секрет ...
Инженер-технолог в цехе холодной обработки металла на опытном производстве.
Цитировать
... страх, негативный опыт, отрицательная практика или бытовое отвращение к этой категории?
Только незнание и отсутствие навыка. Поздно заинтересовался 3D графикой – собственно вынужденно заинтересовался.
Цитировать
... пиши больше мелких вопросов и типа "делаю это, не получается" ...
... и выкладывай больше кода и промежуточные модели, это значительно ускоряет решение проблем ...
Пытаюсь, но не всегда получается.
Цитировать
... http://bgepython.tutorialsforblender3d.com/  -  попробуй использовать те примеры, которые уже решены и хорошо себя показали, и в части этой позитивной практики можешь комбинировать элементы этих решений в своих целях ...
Я так и поступаю. На указанный сайт как попал не помню, может полгода назад, может больше и сразу же его «загнал» в папку «Избранные». Помог он мне знатно.

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

  • Житель
  • emerge --keep-going
Re: Странное поведение в BGE
« Ответ #27 : 31 Март 2018, 10:50:16 »
>> Инженер-технолог в цехе холодной обработки металла на опытном производстве.
... металлобработка хорошо, технолог ещё лучше, инженер просто отлично ...

>> Строка b.normalize() позволяет определить нормаль для вектора b?
... нет ...

>> Мне необходима нормаль к части поверхности (плоскости) в определённой точке.
... для этого есть rayCast - от объекта исходит луч в сторону поверхности, в ответ получаешь точку соприкосновения и нормаль ...

>> Поздно заинтересовался 3D графикой – собственно вынужденно заинтересовался.
... ранее задавал вопрос "зачем это нужно, какая цель преследуется" ...
... поясни всё-таки зачем тебе 3D, возможно что так будет легче подобрать решение, ты же технолог должен понимать что и в 3D есть разные технологические приёмы, используемые оснастки ...

>> ты посмотрел код из сообщения http://blender-3d.ru/forum/index.php/topic,2090.msg29485.html#msg29485 - да/нет/не знаю? ...

Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #28 : 31 Март 2018, 12:13:11 »
>> Строка b.normalize() позволяет определить нормаль для вектора b?
... нет ...
Зашибись. Так что это тогда?
Цитировать
>> Мне необходима нормаль к части поверхности (плоскости) в определённой точке.
... для этого есть rayCast - от объекта исходит луч в сторону поверхности, в ответ получаешь точку соприкосновения и нормаль ...
Была у меня такая попытка – видел описание rayCast.
Применил следующим образом:
Код
import math                 # импортировать модуль math
from bge import logic as L  # из модуля bge импортировать logic как L
from mathutils import Vector# из модуля mathutils импортировать Vector 
from mathutils import Euler # импортировать функцию Euler из модуля mathutils   
cont = L.getCurrentController()# получить активный контроллер
own = cont.owner    # получить объект Koleso - владелец контроллера
pos = own.worldPosition # получить позицию колеса
print("8 pos = ", pos)    #
scn =  own.scene    # получить активную сцену Scene
inobjs = scn.objectsInactive    # получить неактивный объект [Plane]
# print("11 inobjs = ", inobjs)    #
#вычисление скорости движения объекта
puty = own.get("oldPos", pos) - pos # вектор разности между предыдущей и текущей позицией следа
# print("14 puty = ", puty)             #
spd = (puty.x ** 2 + puty.y ** 2) ** 0.5    # пройденный путь колесом
own["oldPos"] = pos.copy() # .copy() - копирует вектор
print("17 spd = ",spd)   #
###########настройки#############
sled = 'Plane' # имя объекта-следа, он находится на скрытом слое
speed = 0.01   # скорость, требуемая для активации
vect = 0, 0, 1   # вектор луча
dist = 2.1   # длина луча
################################
print("25 pos = ", pos)
print("26 own.getAxisVect(vect) = ", own.getAxisVect(vect))
obj, hit, norm = own.rayCast(pos + own.getAxisVect(vect) * dist)
print("28 obj = ", obj, " hit = ",hit, " norm = ",norm)   #
В ответ получил в консоли:
8 pos =  <Vector (0.0091, -1.7135, 1.6152)>
17 spd =  0.03795338797309899
25 pos =  <Vector (0.0091, -1.7135, 1.6152)>
26 own.getAxisVect(vect) =  <Vector (1.0000, 0.0064, 0.0001)>
28 obj =  None  hit =  None  norm =  None
В 27 строке есть pos, есть значение own.getAxisVect(vect), но в ответ ни объекта, ни точки, ни нормали нет. Тогда подумал что это для других случаев.
Николай, так почему у меня не сработало, а у тебя прекрасно работает?
Цитировать
>> Поздно заинтересовался 3D графикой – собственно вынужденно заинтересовался.
... ранее задавал вопрос "зачем это нужно, какая цель преследуется" ...
... поясни всё-таки зачем тебе 3D, возможно что так будет легче подобрать решение, ты же технолог должен понимать что и в 3D есть разные технологические приёмы, используемые оснастки ...
Просто есть проблемы с абстрактным восприятием. Для понимания работы оснастки со сложными траекториями движения нескольких точек. Я просто теряю ориентацию – необходимо иметь возможность наглядной демонстрации, что и в каких ситуациях происходит. BGE, как помощник с возможностью управления в текущем моменте, для этой цели, должен стать незаменимым. По крайней мере, я надеюсь на это.


Оффлайн Novichok

  • Житель
Re: Странное поведение в BGE
« Ответ #29 : 31 Март 2018, 12:57:47 »
Код
[quote author=Николай Николаев link=topic=2090.msg29485#msg29485 date=1522472304][/quote]
[color=green]Николай, в этой строке что за переменная получается?[/color]
    a = own.getAxisVect(Vector((0,0,1)))
[color=green]Вектор выравнивания по оси Х? В чём смысл?[/color]
    sled.alignAxisToVect(a,0,1)
    a = sled.getAxisVect(Vector((0,0,1)))
    sled.worldPosition = own.worldPosition
    obj,point,normal = sled.rayCast(sled.worldPosition-a*2) [color=green]- что это за значение "-a*2", в чём его смысл?[/color]
    if obj:
        sled.worldPosition = point+a*0.03 [color=green]- а это значение "a*0.03" получено методом "научного тыка"? Работает сразу по трём осям?[/color]
        sled.alignAxisToVect(normal,2,1)   
    print("25 sled.worldPosition = ", sled.worldPosition)   #

print(" = ")
И, ещё:
https://www.youtube.com/playlist?list=PLhoXNQqrCmEfAaTf0AfQ1Ztxmz2DoZiCk
это ответ на твой вопрос, что побудило к изучению BGE. Впечатлился и занялся изучением возможности подобного использования, но с возможностью вмешательства в происходящее.

 


Яметрика

* По форуму

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

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

1 (1).png
Скачано: 66
Автор: LEXA ANЭGROWND
blender.png
Скачано: 76
Автор: ipv2007
4.png
Скачано: 98
Автор: hiroyukiss
2.png
Скачано: 120
Автор: hiroyukiss

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