Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода Страница 19

Тут можно читать бесплатно Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода. Жанр: Компьютеры и Интернет / Программирование, год неизвестен. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте «WorldBooks (МирКниг)» или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода» бесплатно полную версию:
Третье издание, расширенное и обновлённое для Blender 2.57

Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода читать онлайн бесплатно

Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - читать книгу онлайн бесплатно, автор Thomas Larsson

    self.layout.operator("multifile.add",

        text="Add sphere").mesh = "sphere"  

#

# class OBJECT_OT_AddButton(bpy.types.Operator):

#

class OBJECT_OT_AddButton(bpy.types.Operator):

    bl_idname = "multifile.add"

    bl_label = "Add"

    mesh = bpy.props.StringProperty()  

def execute(self, context):

    if self.mesh == "cube":

        mycube.makeMesh(-8)

    elif self.mesh == "cylinder":

        mycylinder.makeMesh(-5)

    elif self.mesh == "sphere":

        mysphere.makeMesh(-2)

    return{'FINISHED'}  

#

# Регистрация

def register():

    bpy.utils.register_module(__name__)  

def unregister():

    bpy.utils.unregister_module(__name__)  

if __name__ == "__main__":

    register()

Простой импортёр и экспортёр obj-файлов

Формат OBJ часто используется для обмена данными меша между различными приложениями. Первоначально изобретеный для Wavefront Maya, он стал отраслевым стандартом. Это простой ASCII-формат, который содержит строки следующего вида:

• v x y z

   Координаты вершин как (x, y, z)

• vt u v

   Текстурные координаты как (u, v)

• f v1 v2 ... vn

   Грань с n углами, в вершинах v1, v2, ... vn. Для мешей без координат UV.

• f v1/vt1 v2/vt2 ... vn/vtn

   Грани с n углами. Углы — это вершины v1, v2, ... vn в 3D-пространстве и vt1, vt2, ... vtn в текстурном пространстве.

Больше конструкций, например, для настройки материала или групп граней, имеются в полноценном экспортёре-импортёре OBJ-формата.

Есть две вещи, которые надо принять во внимание. Во-первых, большинство приложений (насколько мне известно, все, кроме Блендера) используют соглашение, что ось Y указывает вверх, в то время как Блендер использует ось Z для направления вверх. Во-вторых, Майя начинает подсчет вершин с 1, тогда как Блендер начинает отсчет от 0. Это означает, что углы граней на самом деле расположены в вершинах v1-1, v2-1, ... vn-1 в 3D-пространстве и в vt1-1, vt2-1, ... vtn-1 в пространстве текстур.

Простой экспортёр-импортёр OBJ-файлов — это пакет Питона, который состоит из трех файлов: два файла, которые фактически выполняют работу экспорта/импорта, и __init__.py, который делает каталог пакетом.

Простой экспорт OBJ-файлов

Этот скрипт экспортирует выбранный меш как OBJ-файл.

#----------------------------------------------------------

# File export_simple_obj.py

# Простой OBJ-экспортёр, который записывает только вершины, грани и текстурные вершины

#----------------------------------------------------------

import bpy, os 

def export_simple_obj(filepath, ob, rot90, scale):

    name = os.path.basename(filepath)

    realpath = os.path.realpath(os.path.expanduser(filepath))

    fp = open(realpath, 'w')

    print('Exporting %s' % realpath)

    if not ob or ob.type != 'MESH':

        raise NameError('Cannot export: active object %s is not a mesh.' % ob)

    me = ob.data

    for v in me.vertices:

    x = scale*v.co

    if rot90:

        fp.write("v %.5f %.5f %.5f\n" % (x[0], x[2], -x[1]))

    else:

        fp.write("v %.5f %.5f %.5f\n" % (x[0], x[1], x[2]))

    if len(me.uv_textures) > 0:

        uvtex = me.uv_textures[0]

        for f in me.faces:

            data = uvtex.data[f.index]

            fp.write("vt %.5f %.5f\n" % (data.uv1[0], data.uv1[1]))

            fp.write("vt %.5f %.5f\n" % (data.uv2[0], data.uv2[1]))

            fp.write("vt %.5f %.5f\n" % (data.uv3[0], data.uv3[1]))

            if len(f.vertices) == 4:

                fp.write("vt %.5f %.5f\n" % (data.uv4[0], data.uv4[1]))

        vt = 1

        for f in me.faces:

            vs = f.vertices

            fp.write("f %d/%d %d/%d %d/%d" % (vs[0]+1, vt, vs[1]+1, vt+1, vs[2]+1, vt+2))

            vt += 3

            if len(f.vertices) == 4:

                fp.write(" %d/%d\n" % (vs[3]+1, vt))

                vt += 1

            else:

                fp.write("\n")

    else:

        for f in me.faces:

            vs = f.vertices

            fp.write("f %d %d %d" % (vs[0]+1, vs[1]+1, vs[2]+1))

            if len(f.vertices) == 4:

                fp.write(" %d\n" % (vs[3]+1))

            else:

                fp.write("\n")

    print('%s successfully exported' % realpath)

    fp.close()

    return

Простой импорт OBJ-файлов

Этот скрипт импорта — компаньон предыдущего. Он, конечно, также может использоваться для импорта OBJ-файлов из других приложений.

#----------------------------------------------------------

# File import_simple_obj.py

# Простой OBJ-импортёр, который читает только вершины, грани и текстурные вершины

#----------------------------------------------------------

import bpy, os 

def import_simple_obj(filepath, rot90, scale):

    name = os.path.basename(filepath)

    realpath = os.path.realpath(os.path.expanduser(filepath))

    fp = open(realpath, 'rU') # Universal read

    print('Importing %s' % realpath)

    verts = []

    faces = []

    texverts = []

    texfaces = []

    for line in fp:

        words = line.split()

        if len(words) == 0:

            pass

        elif words[0] == 'v':

            (x,y,z) = (float(words[1]), float(words[2]), float(words[3]))

            if rot90:

                verts.append( (scale*x, -scale*z, scale*y) )

            else:

                verts.append( (scale*x, scale*y, scale*z) )

        elif words[0] == 'vt':

            texverts.append( (float(words[1]), float(words[2])) )

        elif words[0] == 'f':

            (f,tf) = parseFace(words)

            faces.append(f)

            if tf:

                texfaces.append(tf)

        else:

            pass

    print('%s successfully imported' % realpath)

    fp.close()

    me = bpy.data.meshes.new(name)

    me.from_pydata(verts, [], faces)

    me.update()

    if texverts:

        uvtex = me.uv_textures.new()

        uvtex.name = name

        data = uvtex.data

        for n in range(len(texfaces)):

            tf = texfaces[n]

            data[n].uv1 = texverts[tf[0]]

            data[n].uv2 = texverts[tf[1]]

            data[n].uv3 = texverts[tf[2]]

            if len(tf) == 4:

                data[n].uv4 = texverts[tf[3]]

    scn = bpy.context.scene

    ob = bpy.data.objects.new(name, me)

    scn.objects.link(ob)

    scn.objects.active = ob

    return 

def parseFace(words):

    face = []

    texface = []

    for n in range(1, len(words)):

        li = words[n].split('/')

        face.append( int(li[0])-1 )

        try:

            texface.append( int(li[1])-1 )

        except:

            pass

    return (face, texface)

__init__.py

Этот файл содержит пользовательский интерфейс, то есть два класса, которые создают пункты меню для экспортёра и импортёра. Простой экспортёр вызывается из меню File » Export. Есть две опции: логический выбор, чтобы повернуть меш на 90 градусов (для преобразования между осями Y и Z для направления вверх), и масштаб. Простой импортёр вызывается из меню File » Import. Есть две опции: логический выбор, чтобы повернуть меш на 90 градусов (чтобы ось Z указывала вверх), и масштаб.

__init__.py также содержит словарь bl_info , который преобразует пакет в аддон Блендера, код регистрации, и код для импорта/перезагрузки двух других файлов.

#----------------------------------------------------------

# File __init__.py

#----------------------------------------------------------  

# Информация аддона

bl_info = {

    "name": "Simple OBJ format",

    "author": "Thomas Larsson",

    "location": "File > Import-Export",

    "description": "Simple Wavefront obj import/export. Does meshes and UV coordinates",

    "category": "Import-Export"}  

# Для поддержки правильной перезагрузки, пробуем обратиться

# к переменной пакета, если она есть, перезагрузить всё

if "bpy" in locals():

    import imp

    if 'simple_obj_import' in locals():

        imp.reload(simple_obj_import)

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.