2011-08-05 20 views
9

Se ho compreso correttamente la documentazione di Mathematica (non ho trovato esempi), Graphics3D non produce ombre di oggetti 3D, sebbene Graphics3D abbia un'opzione Illuminazione->.Shadows in mathematica Graphics3D

Domanda: Hai mai provato a produrre oggetti 3D Mathematica con ombre? Se è così l'hai risolto in Mathematica? O hai esportato la grafica ad altri visualizzatori 3D (scene-graph) come ad esempio J-Reality?

+1

Per quanto ne so, la soluzione più semplice è utilizzare un programma di raytracer esterno ed esportare la geometria. L'ho fatto usando Kerkythea (facile da imparare/usare per cose semplici, freeware). – Szabolcs

+0

Sembra molto bello. Attualmente sto sviluppando utilizzando un'architettura stage/attore/regista, dove attualmente lo stage è 'Graphics3D'. Quello che supponi funziona solo per una scena. Comunque vale la pena provare, grazie. –

risposta

14

Il modello di ombreggiatura used by MMA, il cosiddetto Phong shading, determina l'intensità dei pixel in base a una semplice relazione tra l'orientamento della superficie locale, direzione (s) della sorgente luminosa, direzione della telecamera e proprietà diffuse e speculari della superficie. Nessun altro aspetto della geometria viene preso in considerazione, il che significa che gli oggetti non influenzano i valori dei pixel di altri oggetti, anche se si trovano tra l'oggetto e la sorgente luminosa.

Ciò significa che il modello non genera ombre. Non è in grado di

È possibile simulare le ombre da soli proiettando i poligoni del proprio oggetto sul piano terra o sui piani del muro, a seconda dei casi. Non dovrebbe essere troppo difficile, ma le ombre su superfici non planari saranno piuttosto difficili.

Esempio:

polys = (PolyhedronData["GreatRhombicTriacontahedron", "Faces"] // 
     Normal // N) /. {x_, y_, z_}?VectorQ -> {x, y, z + 6}; 
    (* raise it slightly above ground plane*) 

shadow = polys /. {x_, y_, z_}?VectorQ -> {x - z, y, 0}; 
     (* projection from a directional light source at 45 deg elevation *) 

Graphics3D[{polys, EdgeForm[], FaceForm[[email protected]], shadow}, 
Lighting -> {{"Directional", White, {{1, 0, 1}, {0, 0, 0}}}}, 
Boxed -> False] 

enter image description here

Naturalmente, è necessario assicurarsi che le fonti di illuminazione (punto, punto, direzionale ...) e la vostra proiezione dell'ombra sono coerenti.

+0

Sembra carino! Ma, hmmm ... aggiungendo ombre = sarà = difficile. Nella mia (prossima) app comunque. - Grazie per la tua risposta. –