Главная › Форумы › Blender Game Engine (BGE) › Применить вращение в BGE python
У меня скриптик у куба, который выполняется на правую кнопку мыши. Вот этот скриптик:
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)
Подскажите плиз кто нибудь.
Попробуй сначала повернуть:
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)
а
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)
?
У меня по отдельности прокатило (пробовал через консоль).
Вот такой вот работает как-то странно.
Я нажимаю 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 файл
Без object.applyRotation([0.7, 0.6, 0.2], True) кубик не вращается.
А есть ли разница из консоли или не из консоли.
Разницы никакой нет, а вот как переделать скрипт, чтобы работало, я не знаю. Нужно экспериментировать…
Пока натыкивал), заметил одну особенность кода выше, если тыкнуть не четное кол-во раз, затем выйти в 3d вид, кубик будет повернут, затем опять войти в game режим, и ткнуть четное кол-во раз и выйти в 3d вид, то кубик будет повернут, если не четное то он, вернется в исходное состояние. Что за?
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 режима.