Пользовательский скрипт экспорта для блендера

Я пытаюсь написать собственный скрипт для экспорта объектов на моей сцене с их центром вращения. Вот как выглядит мой алгоритм для получения центра вращения: 1- Выберите объект, используя его имя, затем вызовите 2- Привязать курсор к объекту (центру) 3- Получить координаты мыши 4- Записать координаты мыши

import bpy

sce = bpy.context.scene
ob_list = sce.objects

path = 'C:\\Users\\bestc\\Dropbox\\NetBeansProjects\\MoonlightWanderer\\res\\Character\\player.dat'

# Now copy the coordinate of the mouse as center of rotation
try:
    outfile = open(path, 'w')
    for ob in ob_list:
        if ob.name != "Camera" and ob.name != "Lamp":
            ob.select = True
            bpy.ops.view3d.snap_cursor_to_selected()

            mouseX, mouseY, mouseZ = bpy.ops.view3d.cursor_location
            # write object name, coords, center of rotation and rotation followed by a newline
            outfile.write( "%s\n" % (ob.name))

            x, y, z = ob.location # unpack the ob.loc tuple for printing
            x2, y2, z2 = ob.rotation_euler # unpack the ob.rot tuple for printing
            outfile.write( "%f %f %f %f %f\n" % (y, z, mouseY, mouseZ, y2) )

    #outfile.close()

except Exception as e:
    print ("Oh no! something went wrong:", e)

else:
    if outfile: outfile.close()
    print("done writing")`enter code here`

Очевидно, проблема в шагах 2 и 3, но я не могу понять, как привязать курсор к объекту и получить координату курсора.


person Falla Coulibaly    schedule 13.02.2016    source источник


Ответы (1)


Когда вы запускаете скрипт из текстового редактора блендеров, вы получите контекстные ошибки при попытке запустить большинство операторов, но нужную информацию можно получить без использования операторов.

Если вам нужно местоположение 3DCursor, вы можете найти его в scene.cursor_location

Если вы привязали курсор к объекту, то положение курсора будет равно местоположению объекта, которое находится по адресу object.location, поскольку привязка курсора заставит курсор давать те же значения, что вы можете просто использовать местоположение объекта и не привязывать к нему курсор . Что ваш код на самом деле делает (если он работал), так это привязывает курсор к выбранным объектам, что позиционирует его в срединной точке между всеми выбранными объектами. Когда вы перебираете свои объекты, вы выбираете каждый объект, но не отменяете их выбор, поэтому каждая итерация добавляет к выбору еще один объект, который каждый раз смещает курсор в другую позицию, но только к местоположению первого объекта. если все объекты не были выбраны в начале.

Поворот объектов хранится в радианах, поэтому вы можете import math использовать math.degrees()< /а>

Кроме того, поскольку у объекта может быть любое имя, вам следует счесть более точным проверить тип объекта, чтобы выбрать, что экспортировать.

for ob in ob_list:
    if ob.type != "CAMERA" and ob.type != "LAMP":

        mouseX, mouseY, mouseZ = sce.cursor_location
        # write object name, coords, center of rotation and rotation followed by a newline
        outfile.write( "%s\n" % (ob.name))

        x, y, z = ob.location # unpack the ob.loc tuple for printing
        x2, y2, z2 = ob.rotation_euler # unpack the ob.rot tuple for printing
        outfile.write( "%f %f %f %f %f\n" % (y, z, mouseY, mouseZ, y2) )
person sambler    schedule 13.02.2016
comment
Действительно, нет необходимости привязываться к курсору, поскольку местоположение объекта относится к его центру. Спасибо за ваше время :) ! - person Falla Coulibaly; 13.02.2016