MyBooks.club
Все категории

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

На сайте mybooks.club вы можете бесплатно читать книги онлайн без регистрации, включая Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода. Жанр: Программирование издательство неизвестно,. Доступна полная версия книги с кратким содержанием для предварительного ознакомления, аннотацией (предисловием), рецензиями от других читателей и их экспертным мнением.
Кроме того, на сайте mybooks.club вы найдете множество новинок, которые стоит прочитать.

Название:
Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода
Автор
Издательство:
неизвестно
ISBN:
нет данных
Год:
неизвестен
Дата добавления:
17 сентябрь 2019
Количество просмотров:
205
Читать онлайн
Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

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

Thomas Larsson - Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - описание и краткое содержание, автор Thomas Larsson, читайте бесплатно онлайн на сайте электронной библиотеки mybooks.club
Третье издание, расширенное и обновлённое для Blender 2.57

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

Введение в написание скриптов на Питоне для Блендера 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 %.5fn" % (x[0], x[2], -x[1]))

    else:

        fp.write("v %.5f %.5f %.5fn" % (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 %.5fn" % (data.uv1[0], data.uv1[1]))

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

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

            if len(f.vertices) == 4:

                fp.write("vt %.5f %.5fn" % (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/%dn" % (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(" %dn" % (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)


Thomas Larsson читать все книги автора по порядку

Thomas Larsson - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mybooks.club.


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

Отзывы читателей о книге Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода, автор: Thomas Larsson. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.