Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
leota

Problema Duplicazione Omni Su Vertici

Recommended Posts

Salve, da un pò di tempo ho deciso di dedicarmi al maxscript, quindi sono andato nella sezione dei tutorial e mi sono messo a studiare i videotutorial che c'erano. All'inizio tutto bene ma poi mi sono bloccato al quarto (Ciclo For-Generazione Di Una Calotta Di Omni, qui http://www.treddi.com/forum/index.php?showtopic=14972).

Il tutorial non è chiarissimo (e a volte non si vede benissimo), ma comunque ho creato una geosphere e una omni e poi ho scritto questo:

post-44711-1253932281_thumb.jpg

risultato? la geosphere diventa trasparente, ma nient'altro. Le luci non vengono duplicate sui vertici. Dove sbaglio?

Grazie in anticipo

Share this post


Link to post
Share on other sites

dimenticavo...ecco cosa risponde 3ds max:

$GeoSphere:GeoSphere01 @ [-14.337097,15.081863,0.000000]

0

$Omni_Light:Omni01 @ [-37.041710,-64.157372,0.000000]

-- Error occurred in i loop; filename: ; position: 132

-- Frame:

-- ll: undefined

-- newPos: undefined

-- i: 1

-- get: undefined

-- istance: undefined

-- Unknown property: "Vert" in undefined

Share this post


Link to post
Share on other sites

inanzitutto se anzichè uno screen del tuo script posti lo script all'interno dei TAG codice copiando ed incollandolo ti si dà una mano più facilmente...

Comunque la riga

newpos = sfera.transform
non è così, ma così
newpos *= sfera.transform
Direi che ti dà errore per questo:
get.Vert sfera.Mesh i

va scritto togliendo il punto tra get e vert.

ciao

Share this post


Link to post
Share on other sites

Ecco il tag, spero ti servirà ad aiutarmi

sfera = $GeoSphere01

sfera.visibility = 0

luce = $Omni01

for i = 1 to sfera.mesh.numverts do (

	newpos = getVert sfera.mesh i

	newpos *= sfera.transform

	if newpos.z != sfera.pos.z then (

		ll = istance luce

		ll.pos = newpos

		ll.name = ("luce" + (1 as string) )

	)


)

Share this post


Link to post
Share on other sites
Ecco il tag, spero ti servirà ad aiutarmi

sfera = $GeoSphere01

sfera.visibility = 0

luce = $Omni01

for i = 1 to sfera.mesh.numverts do (

	newpos = getVert sfera.mesh i

	newpos *= sfera.transform

	if newpos.z != sfera.pos.z then (

		ll = istance luce

		ll.pos = newpos

		ll.name = ("luce" + (1 as string) )

	)


)

mi dispiace deludere le tue speranze perchè non sono la persona più indicata per lo script però avrei una domanda:

mi spieghi sfera.transform perchè vista così effettivamente non ha un significato molto evidente...almeno per me...

cosa dovrebbe fare?

Share this post


Link to post
Share on other sites

aggiungerei la stranezza di newpos.z perchè newpos non è un oggetto ma una variabile numerica a cui hai assegnato la coordinata z.

è ben diverso da sfera.pos.z

sostanzialmente hai detto questo partendo dal ciclo for:

newpos=1 (primo vertice)

newpos=1*sfera.transform...?

se l'asse z di newpos (valore di newpos?)... etc etc etc

se ho detto una cavolata perdonami ma sono andato per logica con quei pochi elementi che conosco di maxscript.

ciao

Share this post


Link to post
Share on other sites

l'errore è qui:

ll = istance luce
non si scrive istance ma instance. @HiRes in sfera all'inizio dello script viene salvato un riferimento all'oggetto $GeoSphere01 in questo modo ci si riferisce a quest'ultimo usando il termine sfera e se si vuol cambiare oggetto di riferimento basta cambiare la prima riga. Scrivendo:
sfera.transform
si va ad accedere alla sua matrice di trasformazione(in essa sono memorizzate le informazioni di traslazione, rotazione e scalatura dell'oggetto in questione) per quanto riguarda:
newpos.z

in newpos viene salvato il vertice preso in esame, i vertici delle mesh sono memorizzati come coordinate nello spazio e quindi [x,y,z], questo tipo di dato si chiama point3 ed è costituito da tre valori che come ho scritto prima rappresentano un punto nello spazio e quindi per accedere ad uno solo di questi basta aggiungere un . e x,y o z.

in realtà nel primo ciclo del for succede questo:

newpos=[un numero,un numero,un numero](le coordinate del primo vertice)

newPos*=sfera.transform(che significa moltiplicare il valore di newpos per la matrice di trasformazione di sfera)

il tipo di valore point3 può anche essere visto come un vettore di 3 elementi(quindi scrivere newpos.z o newpos[3] è uguale) e un vettore può essere moltiplicato per una matrice a patto che il numero degli elementi del vettore corrisponda al numero di righe della matrice(mi sembra, forse le colonne ma non ne sono sicuro perchè non riesco mai a ricordarmelo, devo guardarci ogni volta)

non so se sono stato molto chiaro.

se hai bisogno son qua

ciao

Share this post


Link to post
Share on other sites

Grazie 1000 coren, ho risolto. Avrei un'altra domanda però...se volessi dire a 3Ds di spostare quell'omni(anzichè duplicarla) nel vertice più alto di quella geosphere, cosa dovrei modificare in quello script?

Grazie ancora

Share this post


Link to post
Share on other sites
@HiRes

in sfera all'inizio dello script viene salvato un riferimento all'oggetto $GeoSphere01 in questo modo ci si riferisce a quest'ultimo usando il termine sfera e se si vuol cambiare oggetto di riferimento basta cambiare la prima riga...

ok. sicuramente più chiaro di prima. chiedo venia per l'intervento poco utile. ;)

ciao

Share this post


Link to post
Share on other sites

@hires

figurati! lieto di essere stato utile!

@leota

Il modo più semplice è salvarti il primo vertice in una variabile di appoggio, poi prendere in esame tutti gli altri(e quindi far partire il for dal numero 2) e confrontarli mano a mano col valore z di quello memorizzato, se la z di quello preso in esame è maggiore di quello memorizzato allora si memorizza quello preso in esame, e così via..

Una volta arrivati in fondo al ciclo for ti ritrovi memorizzato il vertice più in alto.

Poi fare instance ti basta dire

luce.pos=vertice memorizzato

se hai domande son qua

Share this post


Link to post
Share on other sites

Insomma non ho capito molto bene. Comunque ti dico subito dove voglio arrivare, senza troppi giri.

Ho un piano e ci applico un modificatore displace con mappa animata (un video .avi), poi creo una piramide e vorrei che questa restasse incollata al rilievo (generato dal displace) ad ogni suo spostamento.

Posto due immagini per intenderci

Ecco il piano con il rilievo generato dal displace, con sopra la piramide

post-44711-1254413486_thumb.jpg

Premendo play il rilievo si sposta, ma la piramide no, giustamente...

post-44711-1254413763_thumb.jpg

Tramite lo script delle luci sui vertici tentavo di risolvere questo problema, ma mi sono accorto che le luci non vengono incollate ai vertici, bensì solamente spostate in determinate coordinate....quindi non so come procedere (avendo solo 18 anni e poche conoscenze sul maxscript :D ).....una mano mi sarebbe davvero utile

Share this post


Link to post
Share on other sites

ma la forma di questo video è sempre la stessa?

Il rilievo si sposta solo o cambia anche forma?

comunque se questo video non è troppo lungo non ti conviene animare a mano?

Share this post


Link to post
Share on other sites

Questo video dura soltanto 100 frames e il rilievo non cambia forma. Ma voglio creare un script perchè devo utilizzare questa tecnica in un progetto più ampio (il piano e la piramide è soltanto un esempio per farti capire cosa cerco), quindi non mi converrebbe fare a mano. Il mio intento è di dire a 3Ds max:

sposta la piramide nel vertice con valore Z più alto

se nel frame successivo il valore Z più alto dovesse averlo un altro vertice, spostala su quello...e così via

lo so è una cosa complicata, ma credo sia possibile....confido in te coren

grazie di tutto


Edited by leota

Share this post


Link to post
Share on other sites

il fatto è che in quel rilievo ci sono molti vertici alla stessa altezza e quindi non funzionerebbe in quel modo..

ed anche se avessi il rilievo che ogni volta ha un solo vertice più alto la piramide si sposterebbe a scatti(a meno che tu non abbia una marea di vertici molto fitti(che poi rischi di riavere il problema dei vertici complanari)

per questo ho chiesto se è necessario usare il video...

Share this post


Link to post
Share on other sites

Vabbè supponendo che avessi un rilievo che ha un solo vertice più alto e nel suo centro geometrico(del rilievo, non del piano), si potrebbe fare? Non dovrebbe muoversi a scatti perchè seguirebbe il movimento del rilievo

Share this post


Link to post
Share on other sites

i vertici col displace si muovono solo in verticale e quindi il fatto che uno è più alto dell'altro è una cosa non graduale ma bensì a scatti e quindi se segui il rilievo tramite il vertice più altro scatterà sicuramente a meno che tu non abbia una mesh molto ma molto fitta.

comunque basta scrivere un position controller per la piramide che vada ad esaminare l'oggetto con displace e che calcoli la posizione del vertice più alto.

Appena ho tempo ci guardo, ma secondo me scatterà o sarà mooooolto lento(dovendo aumentare di molto i vertici della mesh col displace.

ciao

Share this post


Link to post
Share on other sites

allora, questa è una prima prova.

questa è la cosa più semplice e veloce da fare.

quando esegui lo script ti si apre una finestra dove hai tre pulsanti.

Il primo (con la scritta "terreno" a fianco) lo usi per selezionare l'oggetto col displacement.

Il secondo(scritta "sorgente") lo usi per selezionare la tua piramide.

il terzo lo clicchi per far creare lo script controller.

lo script è questo:

rollout positionScriptRollout "assegna script controller!!" width:162 height:85

(

	label lbl1"Terreno:" across:2

		pickButton btnterreno "none" width:80 


	label lbl2"Sorgente:" across:2

		pickButton btnsorgente "none" width:80 



	button btnOK "assegna Controller"  width:100  align:#center



	on btnterreno picked obj do 

	(

		btnterreno.caption=obj.name

	)


	on btnsorgente picked obj do 

	(

		btnsorgente.caption=obj.name

	)



	on btnOK pressed do

	(

		btnsorgente.object.pos.controller=position_script ()

		btnsorgente.object.pos.controller.script="terreno=snapshotasmesh $"+btnterreno.object.name +"  \n

																newpos=getVert terreno 20  \n

																 for ind=1 to terreno.numverts do (  \n

																	 vertice=getVert terreno ind   \n

																		if vertice.z>newpos.z then newpos=vertice  \n

																 )  \n

																newpos  \n"


		destroyDialog positionScriptRollout

	)



)


createDialog positionScriptRollout

IMPORTANTE: lo script non è testato!!! salva prima di usarlo e sopratutto non sono responsabile di eventuali problemi che potrebbero essere causati dal suo utilizzo!!!

ciao

p.s.per non farlo scattare si potrebbe provare ad usare una mesh mooolto fitta(intendo quella per il displace)

Share this post


Link to post
Share on other sites

Sei un genio!!! Non so proprio come ringraziarti...lo script funziona alla grande! E con una mesh fitta non scatta.

GRAZIE GRAZIE GRAZIE

Per fortuna che c'è gente così disponibile...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...
Aspetta! x