понедельник, 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()

пятница, 3 января 2014 г.

Начнём, пожалуй

Давным-давно, когда деревья ещё были большими, я ходил в кружок авиамоделирования. Авиамоделирование бывает разное, делится на категории, то чем занимался я называлось кордовым моделированием (не знаю можно ли так говорить, в гугле нашёл). Небольшой самолёт, достаточно сложной конструкции, с настоящим двигателем(видимо что-то вроде этого), совершает полеты по кругу и управляется с помощью стальных нитей(корд). Свой самолёт я так и не сделал, но мне всё же удалось поуправлять чужим. Так как мы были новичками, нам давали управлять только уже взлетевшим самолётом, ведь управлять взлётом и посадкой не так уж и просто.
Кроме меня и моего друга было ещё несколько человек и после того как полёты закончились, один из них сказал, что покажет нам что-то интересное, мы согласились и втроём(я, мой друг и этот странный парень) пошли смотреть. Странный парень привёл нас к себе в квартиру и попросил подождать, пока сам пошёл что-то доставать. Вернулся он со странным предметом, похожим на две перекрещенные палки, как выяснилось чуть позже именно двумя палками они и оказались, он сел на пол и долго прилаживал к ним верёвку, тут мы уже успели рассмотреть, что это было и смутная догадка начала появляться у нас в мозгах. Затем все втроём мы вышли на улицу и по очереди попробовали управлять этим "самолётом", т.е. эмулятором самолёта, которым была палка и нитка, если приложить определенные усилия то можно было раскрутить это чудо техники вокруг себя. Вот стоишь ты, крутишь эту палку и думаешь - какая же это ерунда. Мы вежливо проявили интерес и быстро сбежали от этого странного парня, посмеиваясь над ним на обратной дороге.

Да уж. Решил реанимировать мульт, думаю сменить  формат немножко, видимо буду куски готового выкладывать сразу, всё равно не понятно - будет финиш хоть когда то. Сейчас выкладывать нечего, зато переформатирование сценария произошло небольшое, вот и неудачную сцену выкинул.