Topic: Van een database naar een animatie  (gelezen 23162 keer)


ExLibris

« Gepost op: 06 december 2020, 21:01:25 pm »
Professioneel werk ik met een pakket dat SAS heet. Het is bedoeld voor datawarehousing en data analyse. Als hobby vind ik het leuk om met Blender te spelen. Tot nu hadden deze twee pakketten eigenlijk geen overlap, maar ik heb nu het idee om deze met elkaar te gaan verbinden. Wat ik eigenlijk wil is dat aan de hand van een dataset en parameters ik een complete animatie in Blender zou moeten kunnen genereren. Vrijwel alles moet dan dus procedureel zijn, want ik weet van tevoren niet welke waarden de dataset zal gaan bevatten.

Voor zover ik het nu kan bedenken moet ik dus oplossingen zoeken voor de volgende stappen:

- Zet database om in een leesbaar formaat voor Blender (CSV, Json)
- Genereer aan de hand van de data en parameters een Python script dat in Blender: objecten aanmaakt, materialen toevoegt, objecten animeert, camera bedient, animatie genereert, et cetera.
- Ik wil graag staafdiagrammen, lijndiagrammen, heat maps, pie charts en kaartjes kunnen maken.
- Ik wil kijken of ik de objecten zelf ook kan animeren
- Ik wil dmv een parameter de sfeer, kleurgebruik, bedrijfslogo en dergelijke aan kunnen passen, misschien kan ik hiervoor templates maken.
- Laat via de command line de animatie genereren
- Voeg verschillende animaties samen tot een filmpje

Eigenlijk wil ik heel deze pipeline met de druk van een knop uit kunnen voeren of elke dag kunnen schedulen.

Een animatie als dit zou kunnen draaien op een website, een powerpoint,  of op een informatiebord achter een balie of zo.

Om hier mee een start te maken, ben ik begonnen met Python in Blender. Ik had tot zo ver eigenlijk nog nooit met Python gewerkt (wel veel geprogrammeerd in andere talen). Vandaag heb ik dus de stoute schoenen aangetrokken en ben begonnen met het leren van Python. Ik wilde aan de hand van parameters helemaal procedureel een 3D staafdiagram maken .

Tot zo ver ben ik nu gekomen:





Om dit te genereren gebruik ik de volgende Python code. Waarbij ik alleen van tevoren drie materialen heb aangemaakt
-Bar_GYR_noframe
-Plane
-Text

Op termijn moeten deze ook helemaal procedureel worden.

Voor de hoogte van de bars en de tekstelementen moet straks een CSV of Json uitgelezen worden, nu zijn de waarden nog random, dus elke keer als ik het script uitvoer ziet de staafdiagram er weer anders uit.
:

import bpy
import random
from math import radians

#Start with a clean environment


bpy.ops.object.select_all(action='SELECT')


bpy.ops.object.delete(use_global=False)

#Set parameters

numbars=10

#Add objects

#Plane

bpy.ops.mesh.primitive_plane_add(size=100, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
mat = bpy.data.materials.get("Plane")
bpy.context.active_object.data.materials.append(mat)
#Lights

bpy.ops.object.light_add(type='POINT', radius=10, align='WORLD', location=(0, 0, 5), scale=(1, 1, 1))
bpy.context.object.data.energy = 1000

bpy.ops.object.light_add(type='POINT', radius=10, align='WORLD', location=(6, 3, 5), scale=(1, 1, 1))
bpy.context.object.data.energy = 100

#Camera

bpy.ops.object.camera_add(enter_editmode=False, align='VIEW', location=(25 , -15 , 12 ),
rotation=(radians(78), 0, radians(44)), scale=(1, 1, 1))


bpy.context.scene.cursor.location = (0,0,0)

for f in range (0, numbars):
    height=random.randint(1,500)/100
    print (height)
    bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD',
    location=(0,0,1), scale=(1, 1, 1))
   
    bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
   
    bpy.ops.transform.resize(value=(1, 1, height), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, False, True), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)

    bpy.ops.transform.translate(value=(0, (f*2.3), 0.1), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
    mat = bpy.data.materials.get("Bar_GYR_noframe")
    bpy.context.active_object.data.materials.append(mat)

   
#    Add a bevel to the mesh
    bpy.ops.object.mode_set(mode = 'EDIT')
    bpy.ops.mesh.bevel(offset=0.03, offset_pct=0, segments=5, release_confirm=True)

    bpy.ops.object.mode_set(mode = 'OBJECT')
    bpy.ops.object.shade_smooth()
   

   
    bpy.ops.object.text_add(enter_editmode=False, align='WORLD', location=(1, (f*2.3), 0.1), scale=(1, 1, 1))
    mat = bpy.data.materials.get("Text")
    bpy.context.active_object.data.materials.append(mat)
    bpy.context.object.data.body = "Object "+str(f)


« Laatst bewerkt op: 06 december 2020, 22:26:33 pm door ExLibris »

Offline IJp

  • *
  • Berichten: 4,387
    • Bekijk profiel
    • IJpart
« Reactie #1 Gepost op: 07 december 2020, 13:40:09 pm »
Dit gaat allemaal boven mijn pet maar we hebben hier het lid PKHG en dat is Peter die is helemaal weg van Python.
Ik hoop dat Peter dit topic ziet.
Maar in ieder geval succes met je project.

ExLibris

« Reactie #2 Gepost op: 08 december 2020, 18:09:21 pm »
Gisteravond weer een stukje verder gekomen. Ik heb een tamelijk willekeurig open source bestand gedownload. In mijn geval het COVID-19 rioolwaterbestand van de RIVM.

https://data.rivm.nl/covid-19//

Dat ziet er ongeveer zo uit:

Date_measurement,RWZI_AWZI_code,RWZI_AWZI_name,X_coordinate,Y_coordinate,Postal_code,Security_region_code,Security_region_name,Percentage_in_security_region,RNA_per_ml,Representative_measurement,RNA_flow_per_100000

2020-03-30,32002,Tilburg,132554,401565,5048TD,VR20,Midden- en West-Brabant,1,1837,TRUE,

2020-03-31,3010,Assen,234705,558203,9403AK,VR03,Drenthe,1,2254,TRUE,

2020-03-31,1033,Garmerwolde,240219,585040,9798TC,VR01,Groningen,1,427,TRUE,

2020-03-31,2032,Harlingen,159027,576146,8861KT,VR02,Friesland,1,869,TRUE,

2020-03-31,2011,Leeuwarden,184401,578940,8937AN,VR02,Friesland,1,424,TRUE,

2020-03-31,1008,Stadskanaal,260571,559393,9501LH,VR01,Groningen,1,200,TRUE,

Omdat deze data ook de X- en Y coördinaten (Rijksdriehoeksmeting, https://nl.wikipedia.org/wiki/Rijksdriehoeksco%C3%B6rdinaten) van de rioolzuiveringsinstallaties bevat, had ik het idee om deze te plotten op een kaartje van Nederland. Op termijn wil ik de bars laten animeren en door de scene vliegen bijvoorbeeld en een animatie per veiligheidsregio maken.

Dit is het voorlopige resultaat. Alles wordt door het Python script gegenereerd (ik gooi alle objecten weg zodra het script start), behalve de materialen.



« Laatst bewerkt op: 08 december 2020, 18:31:29 pm door ExLibris »

Offline koos2

  • Member
  • *
  • Berichten: 2,053
    • Bekijk profiel
« Reactie #3 Gepost op: 08 december 2020, 19:41:01 pm »
Knap hoor, enige jaloersheid voel ik nu wel.

ExLibris

« Reactie #4 Gepost op: 08 december 2020, 20:36:23 pm »
Knap hoor, enige jaloersheid voel ik nu wel.

Zouden jullie het leuk vinden als ik een Youtube filmpje maak of een keer een uitleg geef in Teams of zo? Dan moet ik wel al wat verder zijn dan nu vind ik, ik ben nog teveel aan het prutsen en uitproberen op het moment.

Offline koos2

  • Member
  • *
  • Berichten: 2,053
    • Bekijk profiel
« Reactie #5 Gepost op: 09 december 2020, 08:38:31 am »
Ik zou het erg leuk vinden. Waarschijnlijk ga ik begin volgend jaar met pensioen en bij leven en welzijn wil ik me dan ook in Python verdiepen. De koppeling met data is iets wat natuurlijk heel veel mogelijkheden biedt

Offline IJp

  • *
  • Berichten: 4,387
    • Bekijk profiel
    • IJpart
« Reactie #6 Gepost op: 09 december 2020, 10:32:42 am »
Python is niets voor mij maar ik ga het wel allemaal bekijken dus laat de filmpjes maar komen. ;)

ExLibris

« Reactie #7 Gepost op: 14 december 2020, 18:54:54 pm »
Ik ben weer een klein stukje verder met mijn projectje.

Aan de hand van deze dataset kan ik nu een animatie genereren.
PROVINCIE,X_COORD,Y_COORD,VALUE
Drenthe,245714,538526,12
Flevoland,154396,488875,4
Friesland,175888,569005,9
Gelderland,194384,445695,15
Groningen,232156,577293,3
Limburg,192459,348430,17
Noord-Brabant,144019,397916,16
Noord-Holland,120887,514113,4
Overijssel,224788,486575,7
Utrecht,140965,453928,5
Zeeland,35089,380734,11
Zuid-Holland,92964,441994,9

De textures zijn nog niet automatisch gegenereerd en de camera wil ik ook nog laten bewegen. Verder wil ik ook automatisch kunnen inzoomen, dus als ik een bijbehorende set heb van gemeentes, dat dan per provincie ingezoomd wordt om de gemeentes te laten zien. In principe zou ik met een set van gemeentes eigenlijk al voldoende hebben bedenk ik me nu. Hiermee kan ik 3 niveaus laten zien: heel Nederland, de provincies en de gemeentes.  Stel dat een animatie per niveau 10 seconden duurt zou ik dan 10 (Nederland)+10 (alle provincies)+10x12 (alle gemeenten per provincie) = 140 seconden aan animatie genereren., met maar 1 waarde.

Stand van zaken:


- Zet database om in een leesbaar formaat voor Blender (CSV, Json)
- Genereer aan de hand van de data en parameters een Python script dat in Blender: objecten aanmaakt, materialen toevoegt, objecten animeert, camera bedient, animatie genereert,, materialen genereert, et cetera.
- Ik wil graag staafdiagrammen, lijndiagrammen, heat maps, pie charts en kaartjes kunnen maken.
- Ik wil kijken of ik de objecten zelf ook kan animeren
- Ik wil dmv een parameter de sfeer, kleurgebruik, bedrijfslogo en dergelijke aan kunnen passen, misschien kan ik hiervoor templates maken.
- Laat via de command line de animatie genereren
- Voeg verschillende animaties samen tot een filmpje
- Automatisch inzoomen

https://youtu.be/YLhMW79fOQg

Offline koos2

  • Member
  • *
  • Berichten: 2,053
    • Bekijk profiel
« Reactie #8 Gepost op: 17 december 2020, 18:52:25 pm »
Fantastisch gemaakt. Alleen ik zie dat de staaf die het hoogste komt op de plek staat waar de ouders van de vriendin van mijn zoon wonen. Hopelijk weten ze de corona buiten de deur te houden.

ExLibris

« Reactie #9 Gepost op: 17 december 2020, 19:42:46 pm »
Fantastisch gemaakt. Alleen ik zie dat de staaf die het hoogste komt op de plek staat waar de ouders van de vriendin van mijn zoon wonen. Hopelijk weten ze de corona buiten de deur te houden.

De exacte plaatsen tov van de kaart kloppen nog niet helemaal, maar dat is nu van minder belang. De hoogte van de staven heb ik nu zelf ingegeven als testje. Mijn render zegt dus helemaal niks :)

Offline PKHG

  • Member
  • *
  • Berichten: 718
    • Bekijk profiel
« Reactie #10 Gepost op: 21 december 2020, 18:43:31 pm »
Dit gaat allemaal boven mijn pet maar we hebben hier het lid PKHG en dat is Peter die is helemaal weg van Python.
Ik hoop dat Peter dit topic ziet.
Maar in ieder geval succes met je project.

Ja, het klopt, ik heb al een heleboel ervaring met Python (en Blender en Gimp) ,  het een of ander vergeten
omdat bijde programmas helemaal vernieuwd zijn, Maar in princiepe  ... ;-)

Ik ga nu eerst een keer lezen wat je geschreven hebt ExLib ;-0
Doei
       Peter

Offline PKHG

  • Member
  • *
  • Berichten: 718
    • Bekijk profiel
« Reactie #11 Gepost op: 21 december 2020, 19:37:37 pm »
Heb het eerst script maar gedraaid, dat ziet er goed uit!


Je hebt toch de Scripting interface gebruikt?

de data ... die ik zag sahen er van hier gedoenload vreemd uit , ik kijk er morgen na ...

Groetjes
        Petet (opa)
`
oh de data zijn actueel van https://data.rivm.nl/covid-19//  super!
« Laatst bewerkt op: 21 december 2020, 19:42:54 pm door PKHG »
Doei
       Peter

ExLibris

« Reactie #12 Gepost op: 22 december 2020, 18:37:30 pm »
Ik ben weer een stukje verder gekomen. Ik heb een svg-file van Nederland gedownload en omgezet naar een mesh. Met de volgende code kan ik dus nu de camera van provincie naar provincie laten vliegen (ik ben alleen Utrecht en Flevoland ergens onderweg kwijtgeraakt). De camera gaat alleen objecten af die in de collection "Nederland" staan.

https://freesvg.org/cafuego-nederland

https://youtu.be/xKCphL4hzNI

import bpy

collection_object='Nederland'
empty_object='Empty'

#clear motion data
bpy.data.objects[empty_object].animation_data_clear()

bpy.context.scene.frame_end = 2400
curframe = int(0)
bpy.context.scene.frame_set(curframe)


for obj in bpy.data.collections[collection_object].all_objects:
    bpy.context.scene.frame_set(curframe)

#    Select current object
    object=str(obj.name)
    bpy.context.view_layer.objects.active = bpy.data.objects[object]
   
    province = bpy.data.objects[object]
    empty = bpy.data.objects[empty_object]
    empty.location = province.location
   
    empty.keyframe_insert(data_path="location")
   
    bpy.context.scene.frame_set(curframe)
    empty.keyframe_insert(data_path="location")
    curframe=bpy.context.scene.frame_current +100
    bpy.context.scene.frame_set(curframe)
   




« Laatst bewerkt op: 23 december 2020, 07:34:52 am door ExLibris »

Offline PKHG

  • Member
  • *
  • Berichten: 718
    • Bekijk profiel
« Reactie #13 Gepost op: 22 december 2020, 19:04:13 pm »
Je bent snel gevorderd met Blender , in zijn mogelijkheden.
Camera besturen ... Pet af!

Ik kijk morgen naar je script ...
vanavond gaat het niet meer ...

Fijne avond nog
       Peter



Dit plaatje als achtergrond in Blender gebruiken?
En dan daar de zuilen laten groeien?'

En er een addon van maken? Een besturing bedenken?

Kan er in princiepe bij helpen
(naar youtoube .... ooit EEN keer gedaan om iets te laten zien, ik dacht met
geodesic domes , via de preferences in Blender nieuwste versie is geodesic domes nog altijd aanwezig ;-) .

Iets van mij, hi hi gevonden:
https://www.youtube.com/watch?v=ko8oWxptcKE
« Laatst bewerkt op: 22 december 2020, 19:23:43 pm door PKHG »
Doei
       Peter

ExLibris

« Reactie #14 Gepost op: 23 december 2020, 13:47:09 pm »




Dit plaatje als achtergrond in Blender gebruiken?
En dan daar de zuilen laten groeien?'

En er een addon van maken? Een besturing bedenken?

Kan er in princiepe bij helpen
(naar youtoube .... ooit EEN keer gedaan om iets te laten zien, ik dacht met
geodesic domes , via de preferences in Blender nieuwste versie is geodesic domes nog altijd aanwezig ;-) .



Mooi filmpje, ben wel benieuwd hoe je dat gedaan hebt.

Ik ben er nog niet helemaal uit waar het naartoe gaat met mijn knutselwerk. Wie weet kan ik er een add on of zo voor maken. Mijn eerste idee was om door middel van externe data bijvoorbeeld elke nacht automatisch een animatie te kunnen renderen met de laatste cijfers van een bedrijf of zo. Dat zou dan bijvoorbeeld op een display achter de balie kunnen draaien of bij een beurs of zo. Helemaal gaaf zou het dan zijn als je live een logo en bedrijfskleuren kan toevoegen en klanten een op maat gemaakt filmpje kan toezenden.

Geen idee of het zo ver komt. Eerst wil ik weten wat er allemaal mogelijk is en vervolgens de boel snappen, zodat ik het ook zelf kan maken en onder controle kan hebben. Als het hierbij blijft is het ook goed...