BGE, Python , опыты дилетанта.

Список разделов Геймдев в Blender Игровой движок Blender

Описание: Все вопросы и обсуждения, касающиеся BGE
Модераторы: exooman, denis8424

Сообщение #21 Mihanik » 22.02.2015, 17:27

:-D Однако да, не очень изящное решение, да и как парентинь всё равно не знаю, надо искать, а тригонометрию вроде в школе учил. :-D
Mihanik M
Аватара
Сообщения: 1571

  • 1

Сообщение #22 andreymal » 22.02.2015, 17:29

Кстати, при паренте, возможно, ещё физика слетать будет

Добавлено спустя 3 минуты 30 секунд:
О, blender.org заработал. В общем, там есть функция applyImpulse, с помощью которой можно пнуть объект по конкретной точке и по идее закрутить как нужно, правда, я её не юзал и не знаю, подойдёт ли
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1200

  • 1

Сообщение #23 Bibo » 22.02.2015, 18:22

А если доску сделать потомком шарика, изменяя его localPosition, вращая по worldOrientation?
Mihanik писал(а):Если шарик находится на краю доски, то он даже подпрыгивает при резких движениях. От сюда следует, что доску лучше вращать вокруг центра шарика.
Я, если честно, не очень понял, как одно следует из другого?
Bibo
Аватара
Сообщения: 626

  • 1

Сообщение #24 exooman » 22.02.2015, 18:26

Если шарик находится на краю доски, то он даже подпрыгивает при резких движениях.

а не лучше попробовать побороться непосредственно с источником проблемы? То есть исключить это резкое движение , создав некий буфер для плавности начала движения?

Добавлено спустя 2 минуты 26 секунд:
еще можно попробовать ограничить максимальную скорость шарика "вверх", что как бы "прилепит" его к доске.

Добавлено спустя 14 минут 52 секунды:
А можно его вообще прилепить, пустив от шарика по оси Z рейкаст, взять координаты хитпоинта и задать их шарику по оси Z с поправкой на нужную высоту.
exooman
Аватара
Сообщения: 1953


Сообщение #25 Mihanik » 22.02.2015, 19:25

Bibo писал(а):Я, если честно, не очень понял, как одно следует из другого?
Ну тут надо поюзат. Вот бленд https://yadi.sk/d/irGQWc-1eq9CP
exooman писал(а):а не лучше попробовать побороться непосредственно с источником проблемы? То есть исключить это резкое движение , создав некий буфер для плавности начала движения?
И это тоже, но если вращать вокруг шарика, то размер игрового поля можно сильно увеличить, наделать новых препятствий, возможно динамических, камеру привязать к шарику, предусмотрев изменение расстояния до него... И собственно это и есть борьба с непосредственным источником проблемы, она в том. что края доски летают вверх, вниз во время поворота.
Mihanik M
Аватара
Сообщения: 1571

  • 1

Сообщение #26 andreymal » 22.02.2015, 19:27

Mihanik писал(а):Вот бленд
Да это ж Neverball!)

Но по-моему надо-таки тригонометрический огород нагородить
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1200

Сообщение #27 Mihanik » 22.02.2015, 19:38

andreymal писал(а):Но по-моему надо-таки тригонометрический огород нагородить
А вот это, что за зверь, не соображу как работает, не оно?
http://www.blender.org/api/blender_python_api_2_7 ... ypes.KX_GameObject.getAxisVect
Mihanik M
Аватара
Сообщения: 1571

  • 1

Сообщение #28 denis8424 » 22.02.2015, 19:46

модуль mathutils поможет отцу русской демократии обоитись без зубодробительного матана

Mihanik, нет, не оно. Объясняют пусть умные люди - я же вкратце и может быть неточно: сия функция возвращает вектор, который показывает насколько объект повернут относительно другого выбранного вектора. С ее помощью можно узнать текущий вектор ориентации объекта.
denis8424
Аватара
Сообщения: 724

Сообщение #29 Mihanik » 22.02.2015, 19:55

denis8424 писал(а):модуль mathutils поможет отцу русской демократии обоитись без зубодробительного матана
А подробней, не понял, я ж нуб ;)
Mihanik M
Аватара
Сообщения: 1571

  • 1

Сообщение #30 denis8424 » 22.02.2015, 20:00

просто почти вся тригонометрия уже реализована в виде функций в этом модуле
надо повернуть матрицу - есть такая функция. надо матрицу "сдвинуть" - тоже есть.
denis8424
Аватара
Сообщения: 724

Сообщение #31 Bibo » 22.02.2015, 20:55

А-а-а-а, так вот оно что. В целом, именно это я себя изначально и представил.
Прежде чем лететь во все тяжкие мат. модуля, почему бы действительно не попытаться обойти этот вопрос:
Как говорил exooman, послать луч в отрицательном направлении по оси Z и смещать шарик к точке столкновения, учитывая его радиус, в дополнение обнуляя скорость шарика по оси Z worldLinearVelocity.z = 0.
Или же доску сделать вовсе неподвижной, а силу рассчитывать и придавать шарику вручную, исходя из матрицы ориентации некой пустышки, чье вращение осуществляется мышкой.

Возможно, стоило бы упростить платформу до набора простейших фигур, заместо цельного, сложного меша.
Bibo
Аватара
Сообщения: 626

Сообщение #32 exooman » 22.02.2015, 21:05

Или же доску сделать вовсе неподвижной, а силу рассчитывать и придавать шарику вручную, исходя из матрицы ориентации некой пустышки, чье вращение осуществляется мышкой.

вот это решение, кстати, самое интересное - проще всего симулировать физику, чем бороться с ней ;)
exooman
Аватара
Сообщения: 1953


  • 1

Сообщение #33 andreymal » 22.02.2015, 21:54

А потом вылезет стопицот проблем, если игру приспичит сделать чутка навороченнее, аккуратнее с этим
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1200

Сообщение #34 exooman » 22.02.2015, 21:59

А потом вылезет стопицот проблем, если игру приспичит сделать чутка навороченнее, аккуратнее с этим

да они постоянно вылезают, ну бы их в качель... Поэтому неплохо бы попробовать разные варианты и выбрать более подходящий.
exooman
Аватара
Сообщения: 1953


Сообщение #35 Mihanik » 23.02.2015, 16:05

Всё плохо!
Тригонометрию я забыл. Удалось написать только это:
Спойлер
Код: Выделить всё
import bge
from bge import render
from bge import logic
import math

cont = bge.logic.getCurrentController()# получаем контроллер
obj = cont.owner # получаем объект контроллера
scene = logic.getCurrentScene() # получаем счену
shar = scene.objects["sharik"] # получаем объект сцены sharik
render.setMousePosition(int(render.getWindowWidth()/2),int(render.getWindowHeight()/2))
#(render.getWindowWidth(),render.getWindowHeight()) ширина, высота окна
euler = obj.worldOrientation.to_euler() # получаем перепенную ориентации объекта преобразованную из матрицы в элер в радианах
#(logic.mouse.position) позиция курсора, верхний левый угол 0 0, нижний правый 1 1
# create a rotation matrix

def naklon(cont):
    ugol_x = euler.x - ((logic.mouse.position[0]-0.5)*0.5) # угол поворота за кадр по x
    ugol_y = euler.y - ((logic.mouse.position[1]-0.5)*-0.5) # угол поворота за кадр по y
    rasst_x = shar.worldPosition.x-obj.worldPosition.x # расстояние между шариком и доской по x
    rasst_y = shar.worldPosition.y-obj.worldPosition.y # расстояние между шариком и доской по y
    comp = ((math.tan(ugol_y)*rasst_x)+(math.tan(ugol_x)*rasst_y*-1))
    obj.worldPosition.z = (obj.worldPosition.z - comp)
    euler.x = ((logic.mouse.position[0]-0.5)*0.5)
    euler.y = ((logic.mouse.position[1]-0.5)*-0.5)
    #(logic.mouse.position) позиция курсора, верхний левый угол 0 0, нижний правый 1 1
    obj.worldOrientation = euler.to_matrix()
Это не вращение вокруг шарика, а всего лишь компенсация вертикального перемещения в том месте где шарик.
И пока шарик статичен, всё вроде работает, где бы он не находился, однако если шарик с физикой, он всё равно подпрыгивает.
Вот бленд:
https://yadi.sk/d/lM9LE4bVeqo54
Что касается матриц вообще, и модуль mathutils в часности, Который советовал denis8424, совсем не понятно. Для начала, что это вообще такое, что означают эти переменные, 3 строки по 3 переменные?
(Эх, блин, кто бы перевёл эту документацию, да примеров кода побольше добавил, с комментариями.)
Или же доску сделать вовсе неподвижной, а силу рассчитывать и придавать шарику вручную, исходя из матрицы ориентации некой пустышки, чье вращение осуществляется мышкой.
Сейчас мне это уже кажется проще, но потом по порядку.
Mihanik M
Аватара
Сообщения: 1571

Сообщение #36 exooman » 23.02.2015, 16:12

Имхо, то что доска по своему центру вращается - куда лучше выглядит, чем если будет центр брать из месторасположения шарика. Тут самым лучшим будет прилепить шарик к поверхности по оси Z намертво.
exooman
Аватара
Сообщения: 1953


  • 1

Сообщение #37 Mihanik » 23.02.2015, 16:29

exooman писал(а):Имхо, то что доска по своему центру вращается - куда лучше выглядит, чем если будет центр брать из месторасположения шарика.
Не, ура, всё понял, нужна была задержка на один кадр. Само поле сейчас чилдрен, а управляю родителем (без геометрии объект, пустышку наверное надо использовать). А если использовать медленного родителя, то вообще любая плавность.
Бленд:
https://yadi.sk/d/WzXSuPBXeqpvt
Другое дело, что доска постепенно, опускается. Но тут всё логично, шарик ведь вниз катится. Можно компенсировать подъёмом, а можно ограничить спуск, дошёл до дна, конец игры, сколько успел флагов собрать, вместо времени. Если камеру к шарику цеплять всё нормально будет. Считаю вариант годным.
Однако вопрос по матрицам остаётся открытым.
Mihanik M
Аватара
Сообщения: 1571

  • 1

Сообщение #38 andreymal » 23.02.2015, 16:47

exooman писал(а):Имхо, то что доска по своему центру вращается - куда лучше выглядит, чем если будет центр брать из месторасположения шарика.
Не, в Neverball поиграй)
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Аватара
Сообщения: 1200

  • 3

Сообщение #39 Bibo » 23.02.2015, 18:04

Mihanik писал(а):Для начала, что это вообще такое, что означают эти переменные, 3 строки по 3 переменные?
Если попроще:
Спойлер
Это 3 направляющих вектора, обозначающие ориентацию объекта. Эти 3 вектора - направление осей X, Y и Z объекта.
Читать их нужно не по строчкам, как они стоят (что может вызвать путаницу при первом знакомстве), а по столбцам.
Изображение
Слева направо, векторы осей X, Y и Z и сверху вниз конечные координаты каждого вектора X, Y, и Z.

В данном случае, ориентация объекта совпадает с осями мировых координат:
Изображение

Повернем куб на 30 градусов:
Изображение
Направление векторов изменилось, что и наблюдаем в его матрице ориентации:
Изображение
Bibo
Аватара
Сообщения: 626

  • 2

Сообщение #40 denis8424 » 23.02.2015, 18:15

Bibo, а теперь расскажи, что такое векторы 8-D

Добавлено спустя 3 минуты 11 секунд:
Mihanik, прочитай для начала это
denis8424
Аватара
Сообщения: 724

Пред.След.

Вернуться в Игровой движок Blender

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость