Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Matrix3D

Elementi di calcolo matriciale e il loro utilizzo nelle trasformazioni 3D
Elementi di calcolo matriciale e il loro utilizzo nelle trasformazioni 3D
Link copiato negli appunti

Parlando di 3D è impossibile non accennare all'uso delle matrici. Wikipedia definisce le matrici come schieramenti regolari di oggetti formati da righe, colonne ed elementi di N*M dimensioni. Se la somma di matrici è uguale alla somma dei singoli elementi, la moltiplicazione risulta più complessa ed è il risultato del prodotto di tutte le righe per tutte le colonne.

Per fortuna Papervision (ma anche flash cs4) ci mette a disposizione una classe che ci aiuta a svolgere la maggior parte delle operazioni che comunemente dovremo svolgere.

La classe Matrix3D() è presente nel package org.papervision3d.core.math, ma è già istanziata al caricamento del package core. Questo significa che per risolvere un prodotto matriciale non abbiamo bisogno di istanziare una nuova classe, ci basterà scrivere

var risultato:Matrix3D = Matrix3D.multiply(matriceA,matriceB);

Nota: Alcuni metodi della classe Matrix3D hanno la particolarità di salvare il risultato direttamente nei parametri passati.

Le proprietà più usate sono n11 ... n44 che chiamano i singoli elementi di una matrice fino 4x4, mentre i metodi che generalmente si usano sono

  • multiply(a:Matrix3D, b:Matrix3D):Matrix3D
  • multiplyVector(m:Matrix3D, v:Number3D):void
  • rotationMatrix(x:Number, y:Number, z:Number, rad:Number, targetmatrix:Matrix3D = null):Matrix3D
  • calculateInverse(m:Matrix3D):void

Quando abbiamo parlato dei vertici, abbiamo detto che, ottenendo i singoli vertici, possiamo trasformare il
nostro solido 3D a piacere. L'affermazione è vera però i vertici che papervision ci restituisce di una figura sono quelli della figura originale (prima delle varie trasformazioni per intenderci). Ciò significa che se abbiamo un cubo e lo spostiamo nella scena i vertici del cubo ricavati da DisplayObject3D.geometry.vertices rimangono quelli della posizione originale.

trace ("posizioni originali dei vertici");

for each (var vertex:Vertex3D in solido.geometry.vertices)
{
	trace (vertex.x+" "+vertex.y+" "+vertex.z);
}

trace ("posizioni traslate dei vertici");

for each (var vertex:Vertex3D in solido.geometry.vertices)
{
	var vert=new Number3D(vertex.x,vertex.y,vertex.z);
	Matrix3D.multiplyVector(piano.transform,vert);
  trace (ver.x+" "+ver.y+" "+ver.z);
}

Vediamo di capire la differenza tra il primo e il secondo ciclo. Il primo ci restituisce i valori dei vertici del nostro solido posizionato al centro della scena.

Il fatto è che se noi trasliamo il solido con le proprietà x,y e z il primo ciclo continuerà a restituirci sempre gli stessi valori!

Per ovviare a questo dobbiamo imporre ad ogni vertice la matrice di trasformazione del solido stesso. Grazie alla proprietà transform presente nel package DisplayObject3D possiamo ricavare la matrice di trasformazione e applicarla ai singoli vettori tramite Matrix3D.multiplyVector.

Notiamo infine che multiplyVector non vuole tra i suoi parametri un Vertex3D bensì Number3D. La differenza tra le due classi è sottile, ma la conversione tra i due è molto semplice visto che richiamano pressocché le stesse proprietà.

Facciamo un ultimo esempio per chiarire meglio il concetto delle Matrici. Poniamo di voler disporre una spirale. Per fare questo possiamo utilizzare una semplice matrice di rotazione e moltiplicarla per un vettore che identifica un raggio sempre maggiore. Se volessimo creare una circonferenza basterà non aumentare il raggio del vettore stesso.

var old_vert:Number3D;

old_vert = new Number3D(0,0,0);

for (var l=0; l<100; l++)
{
	var lm:LineMaterial = new LineMaterial(0x8000ff,1);
	var lines3D:Lines3D = new Lines3D(lm,"Linea");
	var vert=new Number3D(0,l*10,0);
	
	Matrix3D.multiplyVector(Matrix3D.rotationX(l),vert);
	
	lines3D.addNewLine(1,old_vert.x,old_vert.y,old_vert.z, vert.x,vert.y,vert.z);
	old_vert=new Number3D(vert.x,vert.y,vert.z);
	
	scena.addChild(lines3D);
}

È possibile scaricare il file sorgente dell'esempio qui.

Ti consigliamo anche