Применить вращение в BGE python

Главная Форумы Blender Game Engine (BGE) Применить вращение в BGE python

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Автор
    Сообщения
  • #12687
    fredwriter
    Участник

    У меня скриптик у куба, который выполняется на правую кнопку мыши. Вот этот скриптик:

    from bge import logic
    
    cont = logic.getCurrentController()
    object = cont.owner
    
    for mesh in object.meshes:
        for m_index in range(len(mesh.materials)):
            for v_index in range(mesh.getVertexArrayLength(m_index)):
                vertex = mesh.getVertex(m_index, v_index)
                vertex.color = [1.0, 0.0, 0.0, 1.0]
                object["x"] = vertex.x
                object["y"] = vertex.y
                object["z"] = vertex.z
    object.applyRotation([0.7, 0.6, 0.2], True)

    Он работает, то есть кубик крутится, но не применяется rotation к вершинам, как на Ctrl+A —> rotation, поэтому выводятся постоянно одни и те же вершины. А мне нужны именно новые вершины.

    object["x"] = vertex.x
    object["y"] = vertex.y
    object["z"] = vertex.z

    Пробовал использовать вот такой код, не помогло, но код выполняется.

    for obj in bpy.context.selected_editable_objects:
        bpy.ops.object.make_single_user(type='SELECTED_OBJECTS', object=True, obdata=True, material=True, texture=True, animation=True)
        bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)

    Подскажите плиз кто нибудь.

    #12688
    Артем Слаква
    Хранитель

    Попробуй сначала повернуть:

    bpy.ops.transform.rotate(axis=(0.7, 0.6, 0.2))
    А уже потом применить вращение (как это и делается при стандартной работе):

    bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)

    #12689
    fredwriter
    Участник

    Спасибо за ответ.
    То есть поворачивать не
    object.applyRotation([0.7, 0.6, 0.2], True)
    а
    bpy.ops.transform.rotate(axis=(0.7, 0.6, 0.2))
    А затем применить?
    bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)

    Или вместе с
    object.applyRotation([0.7, 0.6, 0.2], True)?

    #12696
    Артем Слаква
    Хранитель

    У меня по отдельности прокатило (пробовал через консоль).

    #12697
    fredwriter
    Участник

    Вот такой вот работает как-то странно.
    Я нажимаю start game engine, делаю три клика, он не на один клик не выводит новые xyz точки, выхожу из game режима, и кубик повернут уже в 3d виде. Если делаю больше кликов и выхожу в 3d вид, то он не повернут.

    from bge import logic
    
    import bpy
    
    cont = logic.getCurrentController()
    object = cont.owner
    
    object.applyRotation([0.7, 0.6, 0.2], True)
    
    for obj in bpy.context.selected_editable_objects:
        bpy.ops.object.make_single_user(type='SELECTED_OBJECTS', object=True, obdata=True, material=True, texture=True, animation=True)
        bpy.ops.transform.rotate(axis=(0.7, 0.6, 0.2))
        bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
    
    for mesh in object.meshes:
        for m_index in range(len(mesh.materials)):
            for v_index in range(mesh.getVertexArrayLength(m_index)):
                vertex = mesh.getVertex(m_index, v_index)
                vertex.color = [1.0, 0.0, 0.0, 1.0]
                object["x"] = vertex.x
                object["y"] = vertex.y
                object["z"] = vertex.z

    Если что вот ссылка на .blend файл

    #12698
    fredwriter
    Участник

    Без object.applyRotation([0.7, 0.6, 0.2], True) кубик не вращается.
    А есть ли разница из консоли или не из консоли.

    #12699
    Артем Слаква
    Хранитель

    Разницы никакой нет, а вот как переделать скрипт, чтобы работало, я не знаю. Нужно экспериментировать…

    #12700
    fredwriter
    Участник

    Пока натыкивал), заметил одну особенность кода выше, если тыкнуть не четное кол-во раз, затем выйти в 3d вид, кубик будет повернут, затем опять войти в game режим, и ткнуть четное кол-во раз и выйти в 3d вид, то кубик будет повернут, если не четное то он, вернется в исходное состояние. Что за?

    #12704
    fredwriter
    Участник
    from bge import logic
    
    import bpy
    
    import mathutils
    from mathutils import*
    
    cont = logic.getCurrentController()
    object1 = cont.owner
    obj = bpy.data.objects[object1.name]
    print(obj.name)
    
    object1.applyRotation([0, 0, 45], True)
    obj.rotation_euler = Vector([0, 0, 45])
    bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
    
    for mesh in object1.meshes:
        for m_index in range(len(mesh.materials)):
            for v_index in range(mesh.getVertexArrayLength(m_index)):
                vertex = mesh.getVertex(m_index, v_index)
                vertex.color = [1.0, 0.0, 0.0, 1.0]
                object1["x"] = vertex.x
                object1["y"] = vertex.y
                object1["z"] = vertex.z

    Вот этот код уже ближе.
    То есть при выходе в 3d вид сохраняет положение куба от последнего клика в game режиме, но выводит значения точки только после первого клика, те значения? которые были у куба в момент запуска game режима.

Просмотр 9 сообщений - с 1 по 9 (из 9 всего)
  • Форум «Blender Game Engine (BGE)» закрыт для новых тем и ответов.

О сайте

На данном сайте Вы сможете найти множество уроков и материалов по графическому
редактору Blender.

Контакты

Для связи с администрацией сайта Вы можете воспользоваться следующими контактами:

Email:
info@blender3d.com.ua

Следите за нами

Подписывайтесь на наши страницы в социальных сетях.

На сайте Blender3D собрано огромное количество уроков по программе трехмерного моделирования Blender. Обучающие материалы представлены как в формате видеоуроков, так и в текстовом виде. Здесь затронуты все аспекты, связанные с Blender, начиная от моделирования и заканчивая созданием игр с применением языка программирования Python.

Помимо уроков по Blender, Вы сможете найти готовые 3D-модели, материалы и архивы высококачественных текстур. Сайт регулярно пополняется новым контентом и следит за развитием Blender.