2013-07-19 21 views
9

Dire che ho questo carattere e voglio consentire all'utente di selezionarlo, quindi quando viene selezionato voglio mostrare un contorno attorno ad esso.Profilo carattere forma complessa

enter image description here enter image description here

il carattere è un object3D con alcune maglie. Ho provato a clonare e impostare un materiale sul retro, ma NON ha funzionato, il problema era che ogni cubo nella forma è stato renderizzato separatamente con il retro, quindi il contorno era sbagliato.

ho bisogno di creare un'altra maglia per il contorno, c'è un modo più semplice?

+0

si può solo clonare e impostare il materiale normale, poi scalare il clone un po 'e allontanarlo dalla fotocamera. Quindi il contorno è solo un modello più grande dietro al modello attuale. Solo un'idea, ricordo di aver letto un gioco che lo ha fatto in quel modo ... – yaku

+0

beh, grazie yaku. Proverò a spostare il clone dalla fotocamera per testare la tua strada, ma il fatto è che i miei personaggi sono più complessi di questo, e camminano per terra, suppongo che solo perché la cinepresa sta guardando dall'alto, il clone dello schema andare dietro la terra e pasticciare tutto! –

+0

Sei riuscito a farlo funzionare alla fine? Sono molto interessato alla soluzione. – spassvogel

risposta

14

Cosa @spassvolgel scritto è corretto;

Quello che sospetto deve essere fatto è qualcosa di simile: 1. In primo luogo il fondo ha bisogno di essere reso 2. Poi, uno strato trasparente a parte, il modello di personaggio con un colore piatto, leggermente più grande rispetto all'originale 3. Su un altro livello trasparente il personaggio con il suo materiale/consistenza normale 4.Infine, lo strato di carattere ha bisogno di andare in cima alla strato di contorno e li combinato bisogno di essere messi in bg

basta creare più scene e combinarle con passaggi di rendering sequenziali:

renderer.autoClear = false; 
. . . 

renderer.render(scene, camera); // the entire scene 
renderer.clearDepth(); 
renderer.render(scene2, camera); // just the selected item, larger, in a flat color 
renderer.render(scene3, camera); // the selected item again 

Ecco un violino realizzato con GPU picking, ma potrebbe altrettanto facilmente essere implementato con il più familiare Raycaster:

Fiddle: http://jsfiddle.net/Tcb3z/

Screenshot of selected item outlined

three.js.r.66

+0

Grazie mille! Questo sembra molto promettente. La taglia scadrà presto, ma ho poco tempo per tuffarmi nel codice, quindi te lo assegnerò. Di nuovo! – spassvogel

+0

grazie per la tua risposta, la demo è stata fantastica. ma c'è qualcosa che mi infastidisce ancora. il punto della mia domanda era che gli oggetti non erano una singola mesh ... –

+0

@AshkanGhodrat Non sei riuscito a ottenere questo approccio per lavorare con un oggetto che ha mesh figlio? – WestLangley

1

Una soluzione generica che si applica alle geometrie di qualsiasi complessità potrebbe essere l'applicazione di uno shader di frammenti tramite lo ShaderMaterial class in three.js. Non sei sicuro di quale sia il tuo livello di esperienza, ma se ne hai bisogno, puoi trovare un'introduzione agli shader here.

Un buon esempio in cui si utilizzano gli ombreggiatori per evidenziare le geometrie è here. Nella loro vertex, calcolano il normale per un vertice e un parametro utilizzato per indicare l'intensità di un effetto di incandescenza:

uniform vec3 viewVector; 
uniform float c; 
uniform float p; 
varying float intensity; 
void main() 
{ 
    vec3 vNormal = normalize(normalMatrix * normal); 
    vec3 vNormel = normalize(normalMatrix * viewVector); 
    intensity = pow(c - dot(vNormal, vNormel), p); 

    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
} 

Questi parametri vengono passati allo shader frammento dove vengono utilizzati per modificare i valori di colore dei pixel circonda la geometria:

uniform vec3 glowColor; 
varying float intensity; 
void main() 
{ 
    vec3 glow = glowColor * intensity; 
    gl_FragColor = vec4(glow, 1.0); 
} 
+0

Guarda questa immagine, questo è il mio problema con gli shader http://s30.postimg.org/oxpnl0xsx/shaders.jpg –

0

non ho ancora trovato la risposta ma voluto dimostrare cosa succede quando creo più mesh, e mettere un'altra maglia dietro ciascuno di questi maglie con

side: THREE.BackSide 

http://jsfiddle.net/GwS9c/8/

come potete vedere, non è l'effetto desiderato. Vorrei un contorno pulito dietro TUTTE le tre mesh, che non si sovrappongono. Il mio livello di shaders di programmazione è davvero inesistente, ma sulla maggior parte delle risorse online le persone dicono di usare questo approccio per la clonazione delle mesh.

+1

Penso che il risultato degli shader non sarebbe molto diverso a meno che tu non scriva alcuni complicati shader, che posso 't: D e il backside non è la migliore idea per questa materia ... –