Blender Live Shapes (018; 06.09.2009; blender, processing)

 

 

 

Blender Live Shape 1.0 from MyInventions on Vimeo.

 

 

 

Koncepcja.

 

  • Program w środowisku Processing pobiera obraz z kamery internetowej z ustaloną częstotliwością, kolejne klatki obrazu zapisuje w pętli do plików graficznych, przy czym każdy zapis obrazu potwierdza wysłaniem wartości numeru pliku na wirtualny port szeregowy COM10,
  • skrypt w środowisku edycji Blendera lub w silniku gry Blendera odczytuje dane z portu szeregowego COM11 i wczytuje jako teksturę ostatnio zapisany obraz z kamery,
  • ten sam skrypt po wczytaniu obrazu aktualizuje nadany obiektowi 3D modyfikator Displacement, który to na podstawie jasności obrazu tekstury w danym punkcie określa w jakim stopniu dany fragment obiektu musi zostać zdeformowany. Powstały obiekt określam mianem BLS (Blender Live Shape).

 

 

 

Uwagi praktyczne.
  • Częstotliwość odświeżania obiektu zależna jest od konfiguracji komputera i gęstości siatki obiektu / rozdzielczości przesyłanego obrazu. Dla mojej konfiguracji przykładowo:
    siatka 4225 punktów, obraz 200px / 150px, 26klatek/s
    siatka 16641 punktów, obraz 200px / 150px, 22klatek/s
  • Plik programu w środowisku Processing oraz plik Blendera muszą znajdować się w tym samym katalogu.
  • Do działania programu niezbędne jest utworzenie wirtualnego połączenia szeregowego portów COM10 i COM11, tak jak opisano to w artykule nr 015.
  • W pierwszej kolejności uruchamiamy program w Processing'u a następnie uruchamiamy skrypt w Blenderze lub silnik gry. Wyłączanie musi przebiegać w odwrotnej kolejności.
  • Dobierając rozdzielczość obrazu i gęstość siatki należy pamiętać, aby liczba punktów siatki (vertex) nie była mniejsza niż liczba pikseli obrazu.
  • Główny wpływ na częstotliwość odświeżania siatki obiektu w Blenderze ma ilość punktów tejże siatki, jak również oświetlenie sceny itp.
  • Test wydajność danej konfiguracji rozpoczynać należy od ustalenia małej wartości częstotliwość pętli programu w Processingu (podanej w parametrach funkcji Capture). Jeśli uzyskamy dla niej płynność obrazu w Blenderze zwiększamy ją i dalej testujemy.
  • Ponieważ w Blenderze jako teksturę ustawić można również pliki GIF i pliki wideo, możliwe jest tworzenie obiektów BLS opartych o tego typu tekstury (np. na potrzeby silnika gry).

 

 

 

I co dalej?

Mam nadzieję, że wraz z nową wersją Blendera (2.5) pojawi się działające polecenie, które pozwoli dynamicznie odświeżać siatkę kolizji obiektu. W efekcie pozwoliło by to na zaistnienie fizycznych interakcji między obiektem typu BLS, a innymi obiektami dynamicznymi.

 

 

Pliki do pobrania:

 

Processing: BlenderLiveShape.pde
Blender: BlenderLiveShape.blend
Blender Game Engine: BlenderGameEngineLiveShape.blend

 

 

Kod źródłowy Processing:

import processing.serial.*;
import processing.video.*;
Serial myPort;
Capture webcam;
int liczbaPikseli;
color Kolor;
int A, R, G, B, Y, j=1;
String name;
int t, T;

void setup() {
  size(200, 150);
  println(Serial.list());
  myPort = new Serial(this,"COM10", 9600);
  webcam = new Capture(this, width, height, 10); //framerate:10
  liczbaPikseli = webcam.width*webcam.height;
  //webcam.settings();
}

void draw(){
  if (webcam.available() == true){
    webcam.read();
    set(0, 0, webcam);
    loadPixels();
    for (int i=0; i < liczbaPikseli; i++){
      Kolor = pixels[i];
      R = (Kolor >> 16) & 0xFF;
      G = (Kolor >> 8) & 0xFF;
      B = Kolor & 0xFF;
      Y=int(0.3*R+0.59*G+0.11*B);
      A = 255 << 24;
      R = Y << 16;
      G = Y << 8;
      B=Y;
      pixels[i]=A|R|G|B;
    }
    updatePixels();
    name=str(j)+".png";
    saveFrame(name);
    myPort.write(char(j));
    j++;
    if (j==6){
      //T=millis()-t;
      //println(5000.0/T); //print real frame rate
      //t=millis();
      j=1;
    }
  }
}

 

Blender python API:

import Blender
from Blender import Image
from Blender import Texture
from Blender import Material
from Blender import Object
from Blender import Window
from Blender import Modifier
from Blender import Scene
import serial
myPort = serial.Serial('COM11', 9600)

texture=Texture.Get('Textura')
texture.setType('Image')
scene=Scene.getCurrent()
plane=Object.Get('Plane')
modifier=plane.modifiers[0] 
myPort.flushInput()

for i in range(1, 301):
	y = ord(myPort.read(size=1))
	name=str(y)+".png"
	image=Image.Load(name)
	texture.image=image
	modifier[Modifier.Settings.TEXTURE] = texture
	Window.EditMode(1)
	Window.EditMode(0)
	Window.Redraw()

 

Blender Game Engine python:

import Blender
from Blender import Image
from Blender import Texture
from Blender import Material
from Blender import Object
from Blender import Window
from Blender import Modifier
from Blender import Scene
import serial
myPort = serial.Serial('COM11', 9600)
texture=Texture.Get('Textura')
texture.setType('Image')
scene=Scene.getCurrent()
plane=Object.Get('Plane')
modifier=plane.modifiers[0] 

y = ord(myPort.read(size=1))
name=str(y)+".png"
image=Image.Load(name)
texture.image=image
modifier[Modifier.Settings.TEXTURE] = texture

controller = GameLogic.getCurrentController()
obj = controller.owner
mesh = obj.meshes[0]
obj.replaceMesh(mesh)
© Copyright Sebastian Korczak 2009 - 2024 english versionpolish version