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

Board index Геймдев в Blender Игровой движок Blender

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

  • 1

Post #121by Bibo » 11.06.2015, 09:33

Возникал у меня как-то такой вопрос и Макс рекомендовал сделать следующие настройки:
Spoiler
Image
Вроде бы, помогло.

Added after 11 minutes 34 seconds:
Так же, как вариант, это можно списать на неадекватное считывание положение курсора самим блендером.
Bibo
Avatar
Posts: 611

Post #122by Mihanik » 11.06.2015, 13:35

Bibo, спасибо, вроде бы и мне помогло, однако странная фигня, непонятно.

Added after 3 minutes 59 seconds:
Bibo wrote:Так же, как вариант, это можно списать на неадекватное считывание положение курсора самим блендером.
А нельзя считывать не положение курсора, а показания самого датчика мыши? В какой то игровой среде, не помню, было именно так.
Mihanik M
Avatar
Posts: 1571

  • 1

Post #123by Bibo » 11.06.2015, 14:10

Знаю, что существует библиотека pyMouse и питоновская обертка Win32Api, быть может там что-то можно найти.
Так же, хорошо было бы разобраться в настройках физики и что на что влияет, но как-то никак не осилю.
Bibo
Avatar
Posts: 611

Post #124by Mihanik » 11.06.2015, 23:22

Пол дня просидел Вот здесь
http://www.blender.org/api/blender_python_api_2_7 ... athutils.html#mathutils.Matrix
Ну ни хрена не понятно, то есть совсем. Объясните пожалуйста, на примере с комментариями к каждой стоке, как повернуть объект с помощью матрицы, не преобразуя в эллер и обратно.
Mihanik M
Avatar
Posts: 1571

  • 2

Post #125by andreymal » 11.06.2015, 23:23

Гугли матрицу поворота, потом должно понятно стать
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

  • 2

Post #126by denis8424 » 11.06.2015, 23:35

andreymal wrote:Гугли матрицу поворота, потом должно понятно стать
http://habrahabr.ru/post/234203/
denis8424
Avatar
Posts: 724

  • 1

Post #127by Bibo » 12.06.2015, 04:03

Mihanik wrote:на примере
На примере предыдущего вопроса
Attachments
mouseLook.7z
(188.47 KiB) Downloaded 67 times
Bibo
Avatar
Posts: 611

  • 1

Post #128by Mihanik » 13.06.2015, 08:37

andreymal, denis8424, Bibo, Спасибо други! Продолжаю разбираться...
Ну не как не ожидал таких проблем с вращениями. Пока надо вращать по одной оси, всё просто, а как надо по двум , причём глобальным, не получается. Одна хитрая шестерня упорно хочет вращаться по локальным осям.
http://www.youtube.com/watch?v=asTCWWTWTy0

Собственно, вращение всего этого привязано к положению пустого места в пятнашках.

Spoiler
Code: Select all
def peremeshenie_pusto(cont):
    cont = bge.logic.getCurrentController()# получаем контроллер
    obj = cont.owner # получаем объект контроллера
    scene = logic.getCurrentScene() # получаем сцену
    scene.objects["cilindr_g"].worldPosition[2] = scene.objects["Cube.0"].worldPosition[2]
   
    euler_Shesternj_B02 = scene.objects["Shesternj_B02"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_Shesternj_B02.y = obj.worldPosition[2]*3.14159#поворачиваем в соответствии с положением пустышки.
    scene.objects["Shesternj_B02"].worldOrientation = euler_Shesternj_B02.to_matrix()#преобразовываем обратно элер в матрицу
   
    euler_Shesternj_m03 = scene.objects["Shesternj_m03"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_Shesternj_m03.y = obj.worldPosition[2]*-6.28318
    scene.objects["Shesternj_m03"].worldOrientation = euler_Shesternj_m03.to_matrix()
   
    euler_dergatel = scene.objects["dergatel"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_dergatel.x = obj.worldPosition[2]*3.14159
    scene.objects["dergatel"].worldOrientation = euler_dergatel.to_matrix()
   
    euler_dergatel03= scene.objects["dergatel03"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_dergatel03.z = obj.worldPosition[1]*-3.14159
    scene.objects["dergatel03"].worldOrientation = euler_dergatel03.to_matrix()
   
    euler_koieso = scene.objects["koieso"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_koieso.x = obj.worldPosition[1]*-6.28318
    scene.objects["koieso"].worldOrientation = euler_koieso.to_matrix()

    euler_koieso1 = scene.objects["koieso1"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_koieso1.x = obj.worldPosition[1]*-6.28318
    scene.objects["koieso1"].worldOrientation = euler_koieso1.to_matrix()

    euler_Shesternj_sfera = scene.objects["Shesternj_sfera"].worldOrientation.to_euler() # получаем переменную ориентации объекта преобразованную из матрицы в элер в радианах
    euler_Shesternj_sfera.y = obj.worldPosition[2]*3.14159
    euler_Shesternj_sfera.z = obj.worldPosition[1]*-3.14159
    scene.objects["Shesternj_sfera"].worldOrientation = euler_Shesternj_sfera.to_matrix()
   
   
    if obj['poz_y'] < obj.worldPosition[1]:
        obj.worldPosition[1] = obj.worldPosition[1]-0.01
        #euler_Shesternj_sfera.z = euler_Shesternj_sfera.z+0.0314159
    if obj['poz_y'] > obj.worldPosition[1]:
        obj.worldPosition[1] = obj.worldPosition[1]+0.01
        #euler_Shesternj_sfera.z = euler_Shesternj_sfera.z-0.0314159
    if abs(obj['poz_y'] - obj.worldPosition[1]) < 0.01:
        obj.worldPosition[1] = obj['poz_y']
        #euler_Shesternj_sfera.z = 3.14159*-obj.worldPosition[1]
       
    if obj['poz_z'] < obj.worldPosition[2]:
        obj.worldPosition[2] = obj.worldPosition[2]-0.01
        #euler_Shesternj_sfera.y = euler_Shesternj_sfera.y-0.0314159
    if obj['poz_z'] > obj.worldPosition[2]:
        obj.worldPosition[2] = obj.worldPosition[2]+0.01
        #euler_Shesternj_sfera.y = euler_Shesternj_sfera.y+0.0314159
    if abs(obj['poz_z'] - obj.worldPosition[2]) < 0.01:
        obj.worldPosition[2] = obj['poz_z']
        #euler_Shesternj_sfera.y = 3.14159*obj.worldPosition[2]
       
    if obj.worldPosition[1] == obj['poz_y'] and obj.worldPosition[2] == obj['poz_z']:
        obj['peremeshenie'] = 0
И к стати, предыдущая проблема с управлением камеры мышью, проявила себя снова, когда захватчик видео с экрана понизил FPS до 30.
Mihanik M
Avatar
Posts: 1571

  • 1

Post #129by Bibo » 13.06.2015, 11:56

Это проблема углов Эйлера, известна как "шарнирный замок" - когда вращение вокруг одной оси, оказывает влияние на результат вращения вокруг других осей. Визуально можно представить так:
Spoiler
Image
Тип Euler, обладает атрибутом order, определяющий последовательность осей вращения
Image
Попробуй поэкспериментировать, изменяя эту последовательность, после каждого смещения пятнашки.

Другой вариант - использовать кватернионы. Они позволяют вращать объект избегая замка. Механику их существования объяснять не решусь.
Управление: W, A, S, D
Attachments
Quaternion.7z
(55.99 KiB) Downloaded 68 times
Bibo
Avatar
Posts: 611

  • 1

Post #130by grayich » 13.06.2015, 23:45

Mihanik, попалось видео, может будет полезно тебе в чём-то https://www.youtube.com/watch?v=fKMvzVSvAUo
Linux
grayich M
Avatar
Location: Харьков
Posts: 5821

Post #131by Mihanik » 14.06.2015, 08:40

grayich, Спасибо конечно, вообще предпочитаю текст с картинками, в идеале документацию от производителя софта русском. Она есть конечно но самое интересное не переведено.
кто бы перевёл эту документацию,
http://www.blender.org/api/blender_python_api_2_73a_release/
да примеров кода побольше добавил, с комментариями, вообще ни каких вопросов бы не возникло.
Ну и всякую тригонометрию в памяти освежить надо.
Mihanik M
Avatar
Posts: 1571

Post #132by grayich » 14.06.2015, 15:00

Mihanik, скорее http://www.blender.org/api/blender_python_api_2_74_5/ а скоро 2.75 .. если конечно 2.73 не пользуешь)

Mihanik wrote:кто бы перевёл эту документацию
API на русском ещё не скоро увидим, тут уж привыкай )
впринципе там не сложно, по группам всё, а примеры, достаточно в гугл вбить нужное api )
Linux
grayich M
Avatar
Location: Харьков
Posts: 5821

Post #133by Mihanik » 14.06.2015, 15:20

Да пока 2.73 не успеваю за обновлениями. Да в принципе всё не сложно, а как начнёшь вникать, жуть как долго, пока сообразишь о чём там пытаются рассказать на иноземном языке. ;)
Mihanik M
Avatar
Posts: 1571

Post #134by grayich » 14.06.2015, 15:30

Mihanik, 2.73 очень глючная просто) неудачная версия)
Linux
grayich M
Avatar
Location: Харьков
Posts: 5821

  • 1

Post #135by Mihanik » 14.06.2015, 15:34

У меня не было поводов жаловаться на глючночсть, всё работает.

Added after 16 hours 31 minute:
Так и не смог заставит крутится эту хитрую шестерню как надо. Может задача и интересная, но видимо не для моего уровня. Мне проще поменять механику всего узла.
http://www.youtube.com/watch?v=oBBeJZoWQvo
Mihanik M
Avatar
Posts: 1571

  • 1

Post #136by Bibo » 15.06.2015, 10:32

Прискорбно, смотрелось недурно.
Bibo
Avatar
Posts: 611

Post #137by Mihanik » 15.06.2015, 13:07

Так и да, мне тот вариант тоже больше нравился, но эта зараза не хотела правильно вращаться, даже если её сделать потомком одной из осей, а непосредственно её вращать только по другой. А квантерионы непрокатывали по причине, что не всегда она фиксировано доходит до места одного хода, иногда если раньше нажать, она начинает следующий ход, до завершения предыдущего, тут и сбоит. И при перемешивании тоже.
Если кому хото поупражнять мозг вот бленд:
https://yadi.sk/d/jvUZDRX6hFspL
Вращение её("Shesternj_sfera") описано в функции def peremeshenie_pusto(cont): объекта Cube.0. И завязано на положение этого Cube.0.
Я выдохся, меня она уже бесить начинает. :suicid: Поделаю пока что то другое, тут много чего ещё делать надо.
Mihanik M
Avatar
Posts: 1571

  • 1

Post #138by Bibo » 15.06.2015, 16:07

Я бы рекомендовал разделять скрипты, заместо изготовления одного огромного. Для вращения камеры - один скрипт, для движения персонажа второй, для рестарта игры - третий. Да и держать их не в бленд файле, а в текстовых файлах, рядом с самим блендом.
Bibo
Avatar
Posts: 611

Post #139by Mihanik » 15.06.2015, 20:28

Bibo, а по подробнее в чём выигрыш от такого подхода?
Mihanik M
Avatar
Posts: 1571

Post #140by Bibo » 15.06.2015, 20:55

Как минимум, вызывая один и тот же огромный файл скрипта для разных контроллеров, ты создаешь копии функций/переменных/классов определенных его содержанием, даже когда они совершенно не нужны этому контроллеру. Ну и, само собой, организация рабочего пространства.
Bibo
Avatar
Posts: 611

PreviousNext

Return to Игровой движок Blender

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest