четверг, 15 сентября 2016 г.

Музыкальное

Сто лет уже ничего не рисовал в blender. С cycles как-то тяжко пока.


понедельник, 30 июня 2014 г.

Японская картошка

Холодно на улице, самое время заняться делами. Текстурка для коробки:

пятница, 30 мая 2014 г.

Цвета

Упорная работа. Вот теперь сделал подборку цвета. Сложно сказать, но кажется это будет моей лучшей сценой, если доделаю когда-нибудь.


четверг, 22 мая 2014 г.

Немножко дождя

Для сцены в мульте сделал окно :) Анимация через Dynamic Paint. Как раз немножко остыть.

четверг, 15 мая 2014 г.

Скрипт для рендера всех кадров с keyframe

Скрипт для рендера всех кадров с keyframe. Делает панельку во вкладке Render.


import bpy
import os

def build_frame_set(context):
    current_frame = context.scene.frame_current
    frames = {current_frame}
    for action in bpy.data.actions:
        if action.users > 0 and not action.use_fake_user or\
         action.users > 1 and action.use_fake_user:
            for fcurve in action.fcurves:
                for point in fcurve.keyframe_points:
                    frame_nr = int(point.co[0])
                    if frame_nr > current_frame:
                        frames.add(frame_nr)
    return frames

def find_next_frame(context, frame_set, next_frame):
    next_frame += 1
    last_frame = context.scene.frame_end

    while next_frame not in frame_set and next_frame <= last_frame:
        next_frame += 1

    return next_frame if next_frame in frame_set else None

def render_frame(context, frame_counter, path):
    context.scene.render.filepath = os.path.join(path, str(frame_counter).zfill(4))
    bpy.ops.render.render(write_still=True)

class RenderKeyframesOperator(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "render.render_keyframes"
    bl_label = "Render keyframes only"

    @classmethod
    def poll(cls, context):
        return True

    def execute(self, context):
        current_frame = context.scene.frame_current
        render_path = context.scene.render.filepath
        next_frame = current_frame
        frame_set = build_frame_set(context)

        while True:
            bpy.context.scene.frame_set(next_frame)
            render_frame(context, next_frame, render_path)
            print("Frame {}".format(next_frame))
            next_frame = find_next_frame(context, frame_set, next_frame)
            if next_frame is None:
                break

        # restore
        context.scene.render.filepath = render_path
        bpy.context.scene.frame_set(current_frame)

        return {'FINISHED'}

class RenderKeyframePanel(bpy.types.Panel):
    """Creates a Panel with keyframe render button"""
    bl_label = "Render keyframes"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"

    def draw(self, context):
        layout = self.layout

        scene = context.scene

        row = layout.row(align=True)
        row.prop(scene, "frame_current")
        row.prop(scene, "frame_end")

        row = layout.row()
        row.scale_y = 2.0
        row.operator("render.render_keyframes")

def register():
    bpy.utils.register_class(RenderKeyframesOperator)
    bpy.utils.register_class(RenderKeyframePanel)


def unregister():
    bpy.utils.unregister_class(RenderKeyframesOperator)
    bpy.utils.unregister_class(RenderKeyframePanel)


if __name__ == "__main__":
    register()

вторник, 1 апреля 2014 г.

Риг

Тест рига для рукава кофты (а вы что подумали?), как то сложно выходит, но вроде идея работает :)


понедельник, 13 января 2014 г.

Что это?




Ещё по незнанию написал скрипт Similar Crease Selection, оказалось в блендере есть такая штука, правда только в режиме Edge. Но мож кому пригодится, сделан через bmesh.


import bpy
import bmesh

class SimilarCreaseOperator(bpy.types.Operator):
    """Select edges by crease"""
    bl_idname = "mesh.select_similar_crease"
    bl_label = "Select similar crease"

    RESOLUTION = 0.0001

    @classmethod
    def poll(cls, context):
        return context.mode == 'EDIT_MESH' and context.active_object is not None

    def execute(self, context):
        obj = context.edit_object
        bm = bmesh.from_edit_mesh(obj.data)
        if obj.data.total_edge_sel == 0:
            return {'FINISHED'}

        crease_lay = bm.edges.layers.crease['SubSurfCrease']
        creases = [edge[crease_lay] for edge in bm.edges if edge.select and edge[crease_lay] > self.RESOLUTION]
        if len(creases) == 0:
            return {'FINISHED'}

        for edge in bm.edges:
            edge_crease = edge[crease_lay]
            if not edge.select and edge_crease > self.RESOLUTION:
                for crease in creases:
                    if crease + self.RESOLUTION >= edge_crease and crease - self.RESOLUTION <= edge_crease:
                        edge.select_set(True)

        bmesh.update_edit_mesh(obj.data, False, False)

        return {'FINISHED'}


def register():
    bpy.utils.register_class(SimilarCreaseOperator)


def unregister():
    bpy.utils.unregister_class(SimilarCreaseOperator)


if __name__ == "__main__":
    register()