Recent changes

Recent changes (extended)

Click on the name of the page in the black panel, not on the preview.

Modular structure research, 3d printable, light-weighted and that doesn't requires any tools to mount. One of the topic was also to use the electric wires as tensioner.

Latest version (006)

Tri-lamp-basic modules-v006.png

Version 004 nearly completely printed and mounted.



Tri-lamp-v004-details01.jpg Tri-lamp-v004-details02.jpg Tri-lamp-v004-details03.jpg



version 001: jaws to snap the cable and clamps to constraint the jaws. The clamps were too weak to hold the pressure, and the jaws were bitting so much into the cable that the wire was seriously damage during installation.


version 002: Complete revision of the design. The arms are now made of wood and not plastic (print time and cost reduction), making the structure much more modular. The wire is locked without pressure in a locking maze embedded into a small part at the end of each arm. The pieces are drilled to re-enforce their structure.


version 003: The drilling was not making any significant difference on strength. It was also weakening the outer shell of the piece. So we dropped it. h. It was also weakening the outer shell of the piece. So we dropped it.


version 004: After building three modules, the design of the locking maze showed its limits: really hard to adjust the tension on wire and nearly impossible to unmount once the wire was pull tight into it. Therefore, we open the maze to make the wire adjustments easier. Result is convincing: the wire can now be mounted and unmounted easily, and the structure is stiffer.




  • Design and modelling by François Zajéga
  • Printing and advices by Yacine Sebti [...Notes:Tri-lamp...]

Notes about computation of inverse kinematics, first implementation done in threejs.


At this moment, the research is focusing on solving a 2 bones system, the leg in this case, but it would be applicable on the arms or any other part of a skeleton having at least 2 parents.

The main issue seems to be the computation of the knee position. All distances are easily computed:

  • upperleg (red) keeps its length
  • leg (yellow) keeps its length also
  • distance between the target and the origin of the upper leg can be easily computed in world space.

Rendering the position of the knee is crucial to compute the rotation of the upper leg. Once correct, the rotation of the leg will be simple to render, as it is the rotation from the current direction to the [knee - target] direction.


A little warning: the graphic here above is in 2d. In a 3d world, the position of the knee is a circle on a sphere: any point being at the right distance of the target point and the upperleg origin will be a valid candidate! The circle of possibilities is the intersection of 2 spheres having their radii equals to bones length.


The radius of the cyan circle can be solved by using this equation:

a = 1/(2d)sqrt(4d^2R^2-(d^2-r^2+R^2)^2) 

A little screenshot for better readability:

Sphere-Sphere Intersection.png

The tricky point is to forget about the spheres' position and only consider the distance of their centers as the d parameter. The normal of the intersection plane can be computed independently.

Implementation of the equation in an openprocessing sketch.

Selecting a point on the circle

To select a point on the intersection of the 2 spheres, we first computed a quaternion representing the rotation to apply on a unit vector. As the Z axis is pointing forward in the model, we can use a vector( 0, 0, 1 ) to compute the orientation: [...Notes:Inverse kinematics...]

Google maps space-time bubbles.png

Strange sensation when navigating in google maps' street view: the panoramic view changes radically when moving from a few meters. As if our world was made of space/time bubbles, reachable via jumps from one to another. The continuum is lost, without any problem for the computers behind. A twisted vision of reality that must affect the human one.


in visioning chronological order, newest first


  • seen 2018/08/05 - 2018 - imdb rotten tomatoes
  • palace, bruxelles - italy, loneliness, prison, despair, low-life, drugs, integrity, black


Notre jour viendra

  • seen 2018/07/27 - 2010 - imdb rotten tomatoes
  • torrent - cassel, sociopath, delusional, escape, sexuality, north of france, sour


Blame! 2017

see also Disrupted Cities - docs

Blame-poster.jpg Blame-netflix-760x428.jpg

Insects (Czech: Hmyz)

  • seen 2018/03/26 - 2018 - wikipedia:Insects_(film) imdb
  • Nova - bxls, animation, mixed with documentary, funny, adapted from a Pictures from the Insects' Life by Karel and Josef Čapek., czech, Jan Švankmajer.

Insects poster.jpg

Insects still 001.jpg Insects still 002.jpg Insects still 003.jpg Insects still 004.jpg

Black panther



url manipulation #1

let's say you have an account in and want to like a video in for instance

just replace the domain by yours:


the page will reload but the stream will stay the same. You will now be able to comment and/or like the video.

url manipulation #2

to go to the official page of an account, just transform their account this way:

  • becomes


Cool accounts & videos in peertube federation.

Cl-bodge PBR demo wo envmap.jpg

  • borodust - game engine written in lisp

Peertube mouseCube1046x720.jpg Peertube fluides2D-64x48.jpg

  • dinoba - mouseCube1046x720 & fluides2D-64x48

Peertube - The Niggar Family.jpg Peertube AMERICA FUCK YEAH!.jpg

This page describes the different steps implemented in the city generator package to detect block in the road's network, in a fast and clean way.



These sketches cover the whole research described below. They are displayed chronologically.

DC scan 0001.jpeg DC scan 0002.jpeg DC scan 0003.jpeg DC scan 0004.jpeg DC scan 0005.jpeg DC scan 0006.jpeg DC scan 0007.jpeg DC scan 0008.jpeg DC scan 0009.jpeg

block detection

right vector

Finding the closest road on the right at a crossroad.

To generate the bocks of building based on the roads structure, the method I’m building is based on a simple idea: when you arrives at a crossroad, you take the first street on the right and you go on like this until you reach a dead-end or your starting point. If you reach your starting point, the succession of roads you took defines a block of building. In theory. This technique has been suggested by Michel Cleempoel, on the way back from school.

After a bit of preparation of the road network (removing orphan roads, having no connection with others, and dead-ends parts of the roads), the real problem arouse: how do you define right in a 3d environment, without an absolute ground reference. Indeed, I can configure the generator to use the Y axis (top axis in ogre3d) in addition to X & Z.

At a crossroad, you may have several possibilities of roads. In the research, these possible roads are reduced to 3d vectors, all starting at world’s origin. The goal is to find the closest vector on the right of the current one, called the main 3d vector in the graphic above.. [...WorkUnit:Disrupted Cities - road network...]

Carnages 2 [extra small] - sound by Gauthier Keyaerts


[en] This work unit is based on the algorithmic processing of videos gleaned on pornographic platforms. The intention that guided the development of this algorithm aims to blur the obviousness and roughness of the sources and to turn them into an animated painting, twisting the mind of the watchers by eluding the direct representation of bodies without losing their presence, in a pictorial surface constantly morphing. It is also a way to trigger an awareness about the depiction of sexual act in the contemporary web-based world.

Etymology of the word of pornography.

1842, "ancient obscene painting, especially in temples of Bacchus," from French pornographie, from Greek pornographos "(one) depicting prostitutes," from porne "prostitute," originally "bought, purchased" (with an original notion, probably of "female slave sold for prostitution"), related to pernanai "to sell" (from PIE *perə-, variant of root *per- (5) "to traffic in, to sell") + graphein "to write" (see -graphy).


  • #1 - cute brunette - vimeo
  • #2 - extra small - vimeo
  • #3 - rui
  • #4 - in da wood
  • (no number) - strapless, 30 seconds, part of ECVP Volume 4 PORN & POLITICS - vimeo
  • #5 - hitomi and the yakuzas - page
  • #6 - teeny black
  • Carnages teenyblack mosaic.jpg
  • #7 - jane in the toilet - page
  • #8 - creamy hairs, long play (~98min)
  • Carnages creamy hairs mosaic.jpg
  • #9 - creamy patterns, long play (~99min)
  • Carnages creamy patterns mosaic.jpg



  • 2017 October - #6, #8 & #9 – synchroniCITIES: BXL-SP - Bruxelles – Belgium
  • 2015 April - #2 - Found Pixels – La Panacée, Montpellier – France
  • 2014 May - #2, #3 & #4 - Ateliers du web – Bruxelles

Ways to present



VLC glitches after an ffmpeg recompilation, a bit less local than expected... (thanks to jacques perconte)

initial video:





How to disable the title bar of a window (undecorated window)

effect - the grey rectangle is the openframeworks window:

Openframeworks undecorated window.png

This tip depends on the renderer you are using! As i'm running linux (on a crappy computer, not sure it is valid for any linux-hardware rig), i had to modify the method setup in [OF_ROOT]/lib/openFrameworks/app/ofAppGLFWWindow.cpp.

ofAppGLFWWindow::setup(const ofGLFWWindowSettings & _settings) {
	//glfwWindowHint(GLFW_DECORATED, settings.decorated); // comment this line
	glfwWindowHint(GLFW_DECORATED, GL_FALSE); // force DECORATED to false

Then you have to recompile OF. Once again, i'm running linux so i just to do:

$ [OF_ROOT]/scripts/linux/./

To view the result, just clean and recompile any app using OF: done!

All methods to manipulate the window are listed in [OF_ROOT]/lib/openFrameworks/app/ofAppRunner.cpp.

bool ofDoesHWOrientation();
ofPoint ofGetWindowSize();
ofRectangle ofGetWindowRect()
ofAppBaseWindow * ofGetWindowPtr();
void ofSetWindowPosition(int x, int y);
void ofSetWindowShape(int width, int height);
void ofSetWindowTitle(string title);
void ofEnableSetupScreen();
void ofDisableSetupScreen();
void ofSetFullscreen(bool fullscreen);
void ofToggleFullscreen();

You can also get the native objects, depending on the OS:

Display* ofGetX11Display();
Window  ofGetX11Window();

Tested on linux mint 18.3 & of v0.9.8

online identity ∋ [ social ∋ [mastodon♥, twitter®, facebook®, diaspora, linkedin®] ∥ repos ∋ [github®, gitlab♥, bitbucket®, sourceforge] ∥ media ∋ [®, vimeo®, peertube♥,®, tumblr®] ∥ communities ∋ [godotengine♥, openprocessing, stackoverflow, threejs]]

Recent changes

Recent changes (extended)

Click on the name of the page in the black panel, not on the preview.




Main work units


Disrupted Cities - ballad in a virtual city

Carnages-banner-hitomi and the yakuzas.jpg

Carnages - videos generation


Tanukis - avatar based


Genealogy - generative art

Igotit 1000-1500jpg movie.png

Automatised post-processing of video using image compression algorithm glitches.


Die Antwoord, Banana brain

Lorn, Acid Rain

Bhad Bhabie, I got it



For jpg codec, the process is recompressing each frame with 1% less quality than previous compression. In the videos above, we start at 40% and gradually decrease the quality to 1%.

For gif codec, it is much more straight-forward, as we do the process in one pass, specifying the number of colors in the palette.

Python script

   from cStringIO import StringIO as BytesIO
except ImportError:
   from io import BytesIO
from PIL import Image
import os
import shutil
import subprocess 

------------- GLOBAL ------------- 

# set to true if the source video has not been extracted already
regenarate_video_frames = False
recompress_video_frames = True
regenarate_output_video = True
# source video path
video = ''
# folder path to export source video frames
folder_frames = 'frames'
# folder path to store compressed video frames
folder_compressed = 'compressed'
# type of compressor - JPG or GIF
compressor = 'JPG'

# jpg compressor settings
jpg_from = 40
jpg_to = 1
jpg_steps = 1

# gif compressor settings
gif_colors = 4

# output frames limits
limit_from = 1800
limit_to = 3125

# output frame rate
fps = 25

fprefix = 'output_'

------------- FUNCTIONS ------------- 

def create_folder(p):
	if not os.path.exists(p):
def clear_folder(p):
	for root, dirs, files in os.walk( p ):
		for f in files:
			os.unlink(os.path.join( root, f ))
		for d in dirs:
			shutil.rmtree(os.path.join( root, d ))

def jpg_compress( src_path, dst_path ):
	jpg_q = jpg_from
	while jpg_q >= jpg_to:
		src = src_path )
		buffer = BytesIO() buffer, "JPEG", quality = jpg_q, optimize=True, progressive=True ) [...WorkUnit:Carnages, frame per frame compressions...]

Links and any kind of info related to disrupted cities.

The city as a research

New Babylon

Constant new babylon model bw.jpg Constant new babylon model color.jpg.jpg

New Babylon is an anti-capitalist city, perceived and designed in 1959-74 as a future potentiality by visual artist Constant Nieuwenhuys

The city as an actor

Different story and/or artwork where the city is leaving its role of background to become an actual protagonist of the story, imposing its scale, structure and time to the human-like characters.

Dark city


Darkcity, 100min, 1998, by Alex Proyas

The city is shifting every night, while population is in a catatonic sleep. The whole map and architecture is mixed up in front of our eyes, modifying the perception of structural stability, or at least very slow evolution, commonly inferred by the streets and buildings. This movie is the main inspiration for the city generator library.


Blame.jpg Blame-killy and shibo.jpg

Blame! (original title: ブラム!), 1998 – 2003, by Tsutomu Nihei

The main character, killy, a taciturn and undetermined young adult, is wandering in an endless succession of super-structure (megastructures in the manga) enclosing cities and vast empty space. Along the 10 volumes covering an undefined time, from several years to hundreds. During this journey, the different action scenes are separated by long periods of absolute loneliness. In this story, the city is not decaying but self-regenerate thanks to giant building robots, apparently left on their own and continuously creating new structures. The city is not actually moving by itself, but has no other reason of expending else than the fact of build. It is a self-sufficient object, liberated from its utility to mankind. [...WorkUnit:Disrupted Cities - docs...]

Essai de typologie de l’art numérique, et François Zajega à la galerie Charlot



Links about GLSL shaders in Godot engine



Visit @ museum boijmans, rotterdam, 2017/09/17



  • MegaFace Dataset - the largest publicly available facial recognition dataset with a million faces and their respective bounding boxes. 65GB of faces


Scanimate News Report


Je tends à penser que le nom même d'art est devenu un cache-misère pour éviter de penser les vraies questions esthétiques - ca fait un bien fou d'entendre ca! Je ressens qqle chose de cet ordre-là, intuitivement, sans vraiment prendre le temps de le formuler à cause de mon implication dans la production d'objets et dans le sensible de leur expérience.

À quoi sert l’art ? par Bernard Stiegler sur youtube

"Les systèmes automatisés ont envahi notre quotidien via les applications pour smartphone, les GPS, les objets connectés, les robots ou drones domestiques – et bientôt les voitures sans conducteur [...Bookmarks...]


quoi et où à new-york




DSC 0302.jpg

Indie / underground gaming place in manhattan (workspace, events). Visited on the 05/03/2018.

Rules of the place:

Babycastles is a community committed to being a safe, respectful and positive environment -- supporting artists and guests by providing a space for free expression of all people. Upon entry, all attendees agree to respect personal boundaries and take responsibility for their actions and experience.

Babycastles will not tolerate language or behavior that is oppressive. We define oppressive behavior as:

  • Any kind of uninvited physical contact, sexual or otherwise
  • Comments or other behaviors that are racist, sexist, homophobic, or transphobic, ableist, classist, ageist, or otherwise discriminatory
  • Deliberate intimidation
  • Harassing photography or recording
  • Sustained or willful disruption of events, programming, or services


Spherical Smackdown by rbazelais Mound by ohsqueezy


  • Current address: 145 W.14th St. - Downstairs - NY, NY 10011
  • website
  • twitter

Death by audio arcade



The Death By Audio Arcade is a series of local multiplayer arcade cabinets produced by local indie game developers that originate from Death By Audio, Brooklyn's influential DIY music venue.


Event i went to: DBAA NYC Dev Demo Night


Zarvot by snowhydra games Tuned Out by Shallow Games [...Notes:New-York...]

Question here below is simple: how to produce moving images with colored dots. The idea has been experimented in several technical and visual forms, all based on the manipulation of simple basic entities.


Researches related to particles, in different context:

  • colliding with a 3d model, researches of 2013
  • in relation with a vector field, for Pelléas et Mélisande opéra.

Accumulation management

FBO pipeline that:

  • control the accumulation of the particles in time by making them disappear gradually (fade2black)
  • transform the luminosity of pixels into alpha, darker => more transparent (lum2alpha)

Passes, by columns:

  1. current frame
  2. fade2black shader and accumulation of the current on top of previous ones
  3. lum2alpha shader, this is the output frame, shown on checkboard, black and green background
  4. delta between second and third pass, showing the color loss during the lum2alpha pass

Accumulation alpha shaders.png


All shaders below are pixels shaders. The vertex shader associated is ultra basic, and i'm not even sure you need one... (openframeworks binding)

vertex shader

#version 120
void main() {
   gl_Position = ftransform();


#version 120
uniform sampler2DRect tex0;
uniform float decay_factor;
uniform float decay_mult;
const float PI = 3.14159265358979323846;
const float HALF_PI = 1.57079632679489661923;
void main() {
   vec4 c = texture2DRect(tex0, gl_FragCoord.xy);
   float dfi = 1.0 - decay_factor;
   c.r -=  ( 1 - ( ( 1 + sin( -HALF_PI + c.r * PI ) ) * 0.5 ) ) * decay_factor;
   c.g -=  ( 1 - ( ( 1 + sin( -HALF_PI + c.g * PI ) ) * 0.5 ) ) * decay_factor;
   c.b -=  ( 1 - ( ( 1 + sin( -HALF_PI + c.b * PI ) ) * 0.5 ) ) * decay_factor;
   c.r *= decay_mult;
   c.g *= decay_mult;
   c.b *= decay_mult;
   gl_FragColor = c;


#version 120 [...WorkUnit:Particles...]

Chubby and caballo

Her comes the transi

Adding a character: Le Transi de Rene de Chalon, 3d scan.

All images below has been rendered in blender, just to mention.

It has been quite a work to rig it and uv unwrapped it, now it is ready for godot, where i will test animations.

Transi 001.png Transi 002.png Transi 003.png

Other point of view.

Transi rockandroll.png Transi backlight.png

First batch

First batch of ingame screenshots.


the 2 scenes




Main work units[1]


Disrupted Cities - ballad in a virtual city

Carnages-banner-hitomi and the yakuzas.jpg

Carnages - videos generation


Tanukis - avatar based


Genealogy - generative art

  1. I choose to avoid the word project (everybody has projects) and, from now on, I'll call the different pieces I'm working on work unit. About Work Unit.

online identity ∋ [ social ∋ [mastodon♥, twitter®, facebook®, diaspora, linkedin®] ∥ repos ∋ [github®, gitlab♥, bitbucket®, sourceforge] ∥ media ∋ [®, vimeo®, peertube♥,®, tumblr®] ∥ communities ∋ [godotengine♥, openprocessing, stackoverflow, threejs]]