Topic: disco lampen  (gelezen 6072 keer)


Offline Ezra

  • Member
  • *
  • Berichten: 206
    • Bekijk profiel
« Gepost op: 04 mei 2016, 20:19:37 pm »
https://www.youtube.com/watch?v=XiRQs5w6EJg&feature=youtu.be
(demonstratie van de techniek, niet meer dan dat)

Dit is een manier die ik gevonden heb om discolampen te animeren. Ik zat met het probleem dat ik meerdere lampen makkelijk wou animeren op de maat van de muziek, zonder dat er te duidelijke patronen herhaald worden. Alle lampen afzonderlijk animeren is al snel te veel werk. De enige manier die ik kon bedenken was met behulp van een script, wat heel wat meer moeite bleek dan gedacht.
Uiteindelijk is het dan, na een hoop opzoekwerk, toch gelukt.

import bpy
import random

startFrame = 1
stopFrame = 250


   
def ChangeStrength(lamp, ID):

    strength = bpy.data.lamps[lamp].node_tree.nodes["Emission"].inputs[1]
   
    if (bpy.data.scenes["Scene"].frame_current >= startFrame and bpy.data.scenes["Scene"].frame_current < stopFrame):
        if bpy.data.scenes["Scene"]["Change Lamps"] == 1:
            random.seed(bpy.data.scenes["Scene"].frame_current * ID)
            if random.random() < 0.5:
                strength.default_value = 0
            else:
                strength.default_value = 1000
    else:
        strength.default_value = 0   
           
def Run(scene):
    ChangeStrength('Spot 1', 1)
    ChangeStrength('Spot 2', 2)
    ChangeStrength('Spot 3', 3)
    ChangeStrength('Spot 4', 4)
    ChangeStrength('Spot 5', 5)
    ChangeStrength('Spot 6', 6)

bpy.app.handlers.frame_change_pre.append(Run)
(vast niet de beste manier, maar mijn python ervaring was voor ik hieraan begon 0)

Met behulp van dit script is het mogelijk alle lampen te animeren door maar één waarde te animeren. Voor ieder frame van de animatie gaat het na of die waarde gelijk is aan 1, en als dat het geval is zorgt het script ervoor dat iedere lamp een kans heeft van 50% om aan of uit te gaan. Het toevoegen van een extra lamp aan de scene is zo simpel als de lamp hernoemen en vervolgens een extra regel toe te voegen aan het script.

Dit is nou een van die mooie dingen aan blender, als een feature ontbreekt kun je hem ook zelf maken.
« Laatst bewerkt op: 04 mei 2016, 20:21:57 pm door Ezra »

Offline rozz

  • Member
  • *
  • Berichten: 1,851
    • Bekijk profiel
« Reactie #1 Gepost op: 04 mei 2016, 20:36:19 pm »
Goed bezig

Offline JvL

  • Member
  • *
  • Berichten: 3,415
    • Bekijk profiel
    • Llyr Studio
« Reactie #2 Gepost op: 04 mei 2016, 21:48:26 pm »
Nice!  8)

Offline IJp

  • *
  • Berichten: 4,387
    • Bekijk profiel
    • IJpart
« Reactie #3 Gepost op: 04 mei 2016, 22:45:28 pm »
Nu je van Python script hebt geproefd ben je niet meer te stoppen.
Binnenkort een Blender licht show. ;-)

Offline Nick Van den Broeck

  • Member
  • *
  • Berichten: 216
    • Bekijk profiel
    • Blender Education
« Reactie #4 Gepost op: 04 mei 2016, 22:48:00 pm »
Vraagje: als je lampen elke frame een kans hebben van 50% om te veranderen, dan zou ik tegen 24 frames per seconde een heuse flikkershow verwachten. Toch gaat het er bij jouw nog best rustig aan toe. Heb je de framerate vertraagt, of het script nog aangepast?

Offline Ezra

  • Member
  • *
  • Berichten: 206
    • Bekijk profiel
« Reactie #5 Gepost op: 04 mei 2016, 22:54:00 pm »
Vraagje: als je lampen elke frame een kans hebben van 50% om te veranderen, dan zou ik tegen 24 frames per seconde een heuse flikkershow verwachten. Toch gaat het er bij jouw nog best rustig aan toe. Heb je de framerate vertraagt, of het script nog aangepast?
Het script veranderd de lampen alleen maar als een bepaalde waarde bij de custom properties gelijk is aan 1. Ik keyframe het zo dat die waarde alleen op de frames waar ik het wil laten veranderen gelijk is aan 1 en op de andere frames bijvoorbeeld 0.

Offline Zaph

  • Member
  • *
  • Berichten: 540
    • Bekijk profiel
    • Zaph webdevelopment
« Reactie #6 Gepost op: 04 mei 2016, 23:03:37 pm »
Sorry, ik kan het als programmeur niet laten wat optimalisaties voor te stellen...  ;)

Ik ga er hieronder van uit dat buiten start en stop niks gerenderd wordt - als dat wel zo is moet de eerste if uit Run weer terug naar ChangeStrength.

Verder: maak een empty, maak de lampen die je wilt animeren daar children van, en je hoeft geen scriptaanpassing meer te doen als je lampen wilt toevoegen - je gaat gewoon alle children van die empty af.

Ook kun je de min/max waarde voor strength of random-grenswaarde i.p.v. 0.5 bijvoorbeeld in custom properties van de lamp zetten.

import bpy
import random

startFrame = 1
stopFrame = 250


   
def ChangeStrength(lamp, ID):

    strength = bpy.data.lamps[lamp].node_tree.nodes["Emission"].inputs[1]
   
    random.seed(bpy.data.scenes["Scene"].frame_current * ID)
    if random.random() < 0.5:
        strength.default_value = 0
    else:
        strength.default_value = 1000
           
def Run(scene):
    if (bpy.data.scenes["Scene"].frame_current >= startFrame and bpy.data.scenes["Scene"].frame_current < stopFrame):
        if bpy.data.scenes["Scene"]["Change Lamps"] == 1:
            ChangeStrength('Spot 1', 1)
            ChangeStrength('Spot 2', 2)
            ChangeStrength('Spot 3', 3)
            ChangeStrength('Spot 4', 4)
            ChangeStrength('Spot 5', 5)
            ChangeStrength('Spot 6', 6)

bpy.app.handlers.frame_change_pre.append(Run)

Offline Ezra

  • Member
  • *
  • Berichten: 206
    • Bekijk profiel
« Reactie #7 Gepost op: 04 mei 2016, 23:18:40 pm »
Sorry, ik kan het als programmeur niet laten wat optimalisaties voor te stellen...  ;)

Ik ga er hieronder van uit dat buiten start en stop niks gerenderd wordt - als dat wel zo is moet de eerste if uit Run weer terug naar ChangeStrength.

Verder: maak een empty, maak de lampen die je wilt animeren daar children van, en je hoeft geen scriptaanpassing meer te doen als je lampen wilt toevoegen - je gaat gewoon alle children van die empty af.

Ook kun je de min/max waarde voor strength of random-grenswaarde i.p.v. 0.5 bijvoorbeeld in custom properties van de lamp zetten.

import bpy
import random

startFrame = 1
stopFrame = 250


   
def ChangeStrength(lamp, ID):

    strength = bpy.data.lamps[lamp].node_tree.nodes["Emission"].inputs[1]
   
    random.seed(bpy.data.scenes["Scene"].frame_current * ID)
    if random.random() < 0.5:
        strength.default_value = 0
    else:
        strength.default_value = 1000
           
def Run(scene):
    if (bpy.data.scenes["Scene"].frame_current >= startFrame and bpy.data.scenes["Scene"].frame_current < stopFrame):
        if bpy.data.scenes["Scene"]["Change Lamps"] == 1:
            ChangeStrength('Spot 1', 1)
            ChangeStrength('Spot 2', 2)
            ChangeStrength('Spot 3', 3)
            ChangeStrength('Spot 4', 4)
            ChangeStrength('Spot 5', 5)
            ChangeStrength('Spot 6', 6)

bpy.app.handlers.frame_change_pre.append(Run)
Eerlijk gezegd ben ik allang blij dat het werkt, maar alsnog bedankt voor je suggesties. Ik kan een beetje programmeren, maar heb me nog nooit echt verdiept in object orientated programming, dus de hele blender python structuur was erg verwarrend.