Blender Italia forums Coding Script, addon e temi integrazione Blender-Matlab

Stai visualizzando 20 post - dal 1 a 20 (di 20 totali)
  • Autore
    Post
  • cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #18724

    Ciao,

    premetto che sono poco esperto di Blender, mentre ho una discreta conoscenza di Python.

    Ho realizzato un simulatore di imbarcazioni in Matlab e vorrei visualizzare la simulazione in Blender. Ho visto che la cosa più semplice da fare è:

    1) memorizzare in un file di testo (.txt) le posizioni e gli orientamenti (angoli di Eulero) prodotte durante la simulazione in Matlab. In pratica nel file .txt per ogni riga ho le tre posizioni e i tre orientamenti della nave

    2) creare il modello 3D della nave

    3) creare uno script python che legga il file .txt in cui sono memorizzate le posizioni e gli orientamenti e faccia muovere la nave all’interno di Blender (in funzione delle informazioni lette dal file txt)

    I primi due punti sono riuscito a risolverli… sto cercando di risolvere il terzo, sul quale avrei bisogno del vostro aiuto.

    In pratica, sono riuscito ad implementare uno script python che legge dal file txt e fa muovere l’oggetto.

    Ora però mi (e vi) chiedo: come faccio a far interagire l’utente con l’animazione così creata? Ad esempio io vorrei poter modificare la camera di osservazione dell’animazione. Per far questo devo comunque passare dagli add-on? Se si, mi potreste dare una mano per capire come funzionano?

    Bernardo
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 1316
    @sdados
    #208506

    mmmm… non credo di essere la persona piu' indicata ad aiutarti vista la mia pressoche' nulla conoscenza di python. I logic brick del game engine li conosci? Per fare dei semplici movimenti di camera controllati dall'utente bastano quelli e non sono per niente complessi da per cose cosi' semplici. Solo che non so se nel tuo caso possano andar bene visto che hai a che fare con queste “informazioni” esterne.

    Comunque sono molto curioso di vedere questa simulazione :)

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208507

    Innanzitutto grazie della risposta.

    Il problema fondamentale, forse, è capire un pò meglio cosa potrei riuscire a fare con Blender. Cerco di spiegare meglio quello che vorrei ottenere.

    Dopo aver eseguito la mia simulazione in Matlab e dopo aver salvato le posizioni e gli orientamenti della nave in un file .txt io vorrei avere un software che mi muovi la nave in un ambiente 3D, in funzione dei dati memorizzati nel file.

    Per far questo ho letto che un ottimo strumento potrebbe essere Blender. Per questo motivo mi sono creato (in realtà  ho trovato in internet e leggermente modificato) un modello 3D di nave e mi sono implementato un file .py che va a leggere le informazioni (posizione ed orientamento) dal file .txt e mi muove la nave.

    Questo script l'ho provato nel text editor di Blender ed ho visto che tutto fuinziona correttamente (ossia la nave si muove e ruora realmente). I miei problemi ora sono i seguenti:

    1) poichè questo strumento lo devo far utilizzare a persone inesperte, è possibile creare un “eseguibile” in modo che l'utente finale non debba utilizzare blender per visualizzare la sua scena?

    2) per poter far modificare all'utente finale il punto di osservazione come devo modificare lo script?

    3) in tutto ciò cosa centra il Blender Game? L'ho letto in diverse parti, ma ancora non ho capito cosa sia e se è questo lo strumento giusto per risolvere i due precedenti punti

    Grazie e scusate l'ignoranza

    Bernardo
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 1316
    @sdados
    #208508

    allora… possiamo dividere blender in due grandi parti (almeno per quanto ci riguarda qui).

    la parte chiamiamola di computer grafica e la parte del game engine.

    1. Con la prima parte di blender detto in modo molto semplice puoi creare immagini ed animazioni in 3d. Quindi nessuna parte interattiva.

    Nel tuo caso la nave si muove, posizioni te una telecamera e la fai muovere come ti pare setti luci e materiali. Quello che riceve l'utente finale è un filmato precalcolato dove non può far niente se non guardare.

    2. La parte del GE (game engine) è forse quella per te più interessante. Praticamente fai conto di avere la stessa scena di prima, solo che ad esempio (le possibilità  sono molte) la telecamera la puoi far muovere all'utente finale e puoi anche creare un eseguibile stand alone.

    Ovviamente la qualità  grafica data dal GE è molto inferiore a quella ottenibile con la parte di CG, in quanto va calcolato tutto in tempo reale.

    Quindi ricapitolando o crei un filmato “preconfezionato” (punto 1), oppure crei una simulazione interattiva (punto 2)in cui l'utente può muoversi liberamente all'interno dell'ambiente da te creato (calcola però che puoi anche far muovere la nave all'utente volendo…)

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #208509

    Ma l'animazione sarà  interattiva o sempre uguale? L'utente cosa deve poter fare? penso sia fondamentale capire questo. Se l'utente ad esempio può solo muovere la vista e mandare avanti e indietro l'animazione è un conto, mentre se deve guidare la nave è un'altro.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208510

    Grazie ragazzi per la collaborazione…..

    la mia idea è quella di far muovere la nave in funzione dei dati letti nel file txt. Per cui l'utente finale potrà  solo avviare la visualizzazione e modificare la camera (vista). La scena visualizzata sarà  diversa solo se cambiano i dati nel file .txt.

    Dalle vostre risposte mi sembra di capire che devo utilizzare il game engine….ma come devo fare per far eseguire nel game engine lo script che ho già  creato?

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #208511

    Ora è più chiaro. Ora ti chiedo: l'utente deve avere la possibilità  di caricare il proprio file coi dati della simulazione, o la simulazione sarà  sempre la stessa? Nel secondo caso, ti basta creare una action con il movimento della nave, e poi farla partire durante il gioco. Poi metti i controlli per il movimento sulla camera ed è fatta. Poi crei l'eseguibile. Se invece deve caricare file diversi allora non saprei.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208512
    'Lell' wrote:

    Ora è più chiaro. Ora ti chiedo: l'utente deve avere la possibilità  di caricare il proprio file coi dati della simulazione, o la simulazione sarà  sempre la stessa? Nel secondo caso, ti basta creare una action con il movimento della nave, e poi farla partire durante il gioco. Poi metti i controlli per il movimento sulla camera ed è fatta. Poi crei l'eseguibile. Se invece deve caricare file diversi allora non saprei.

    Purtroppo la simulazione non sarà  sempre la stesse, per cui tutte le volte che si avvia il gioco è necessario andare a leggere dal file (che avrà  sempre lo stesso nome e che sarà  posizionato nempre nella stessa directory) e muovere la nave in funzione dei dari letti dal file .txt.

    Come vi dicevo prima, ho già  implementato lo script con cui leggere le informazioni (da un file .txt) e muovere l'oggetto nave. Quello che volevo capire è cosa fare ora per creare un eseguibile che contenga sia l'oggetto 3d della nave sia lo script implementato in Python

    La successiva fase, sarà  poi quella di inserire un ulteriore script per modificare la camera…. ma un passo alla volta.

    Ogni consiglio è ben accetto

    {Genesis}
    Membro
    • Blenderista
    • Post sul Forum 311
    @genesis
    #208513

    Come ti e' già  stato detto devi usare il BGE e i logic bricks, purtroppo la documentazione in questo settore non e' il massimo, ma sia guardando nel forum che cercando sul web dovresti riuscire agevolmente ad ottenere quello che vuoi.

    Per non essere troppo stringato ti do' giusto un idea di come dovresti operare.

    Prima di tutti ti serve una property (una variabile) per sapere se il “gioco” e' inizializzato, questa property deve essere una booleana settata a false e deve essere abbinata ad un sensore che ne verifichi lo stato.

    Questo sensore va collegato ad un controllore al quale collegherai il tuo script.

    In questa configurazione se la property ha un determinato valore in automatico il BGE userà  lo script e caricherà  il percorso.

    Ecco un esempio, non lo ho provato quindi non so se sia davvero funzionante.

    [attachment=9508:BGE.jpg]

    Per il resto l'unico altro consiglio che posso darti e' fare un salto nella sezione GE del forum, sia per quello che concerne le possibili domande che per trovare un po' di risposte. https://www.blender.it/uploads/monthly_05_2012/post-1800-0-77870600-1338289485.jpg

    LeleDaRevine
    Membro
    • Veterano Bronzo
    • ★★★
    • Post sul Forum 2928
    @lell
    #208514

    Direi che in pratica ci siamo. Tutorial per muovere una camera con i tasti ce ne sono dappertutto, quindi quello è il problema minore. Poi metti un sensore timer, e ogni tot di centesimi di secondo fai spostare l'oggetto nave secondo i punti scritti nel file di testo. Se ci abbini un sensore tasto, puoi far fermare, ripartire, o far andare indietro l'animazione. Ci vorrà  un po' di python magari, ma pare non sia un groso problema.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208515

    OK. Ragazzi.

    Innanzitutto vi ringrazio per la collaborazione.

    Inizio a vedere e vi faccio sapere.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208516

    Allora, grazie al vostro aiuto sto iniziando a capire come funziona il GE.

    Sono riuscito a settare il Logic Editor come suggerito da {Genesis}, ma quando premo P non succede nulla. Se invece eseguo il file con il tasto Run Script la nave si muove.

    Ora mi chiedo: lo script per poter essere eseguito dal GE deve avere qualche import o qualcosa di particolare?

    Vi metto qui lo script in modo da verificare meglio se sto sbagliando qualcosa (nello script si muovono due oggetti… ma nn credo che questo faccia alcuna differenza):

    Code:
    import bpy
    obj1=[bpy.data.objects.get(“nave1”)] #oggetto da animare
    obj2=[bpy.data.objects.get(“nave2”)] #oggetto da animare
    file_componenti = open(“matlab.txt”,”r”)
    i=file_componenti.readline() #legge una riga di file
    f=0
    # Recupero la scena
    scene=bpy.context.scene
    while(i):
    scene.frame_set(f) #setta il frame
    LocRot=list(map(float,i.split())) #separa i dati della rotazionbe e li converte in float
    # Settaggio posizioni oggetto 1
    obj1[0].location.x = LocRot[0] #Posizione x
    obj1[0].location.y = LocRot[1] #Posizione y
    obj1[0].location.z = LocRot[2] #Posizione z
    # Si settano gli angoli di Eulero oggetto 1
    obj1[0].rotation_euler[0]=LocRot[3] #controllare se gli assi calcolati sono coincidenti
    obj1[0].rotation_euler[1]=LocRot[4]
    obj1[0].rotation_euler[2]=LocRot[5]
    # Settaggio posizioni oggetto 2
    obj2[0].location.x = LocRot[6] #Posizione x
    obj2[0].location.y = LocRot[7] #Posizione y
    obj2[0].location.z = LocRot[8] #Posizione z
    # Si settano gli angoli di Eulero oggetto 2
    obj2[0].rotation_euler[0]=LocRot[9] #controllare se gli assi calcolati sono coincidenti
    obj2[0].rotation_euler[1]=LocRot[10]
    obj2[0].rotation_euler[2]=LocRot[11]

    bpy.data.objects[“nave1”].select=True
    bpy.data.objects[“nave2”].select=True
    # imposta il keyframe
    bpy.ops.anim.keyframe_insert_menu(type='Location', confirm_success=False, always_prompt=False)
    bpy.ops.object.select_all(action='TOGGLE') #deseleziona l`oggetto
    i=file_componenti.readline()
    f=f+1 # avanza di un frame

    {Genesis}
    Membro
    • Blenderista
    • Post sul Forum 311
    @genesis
    #208517

    Beh! in vero quello che ti ho postato e' solo una parte del tutto, diciamo un indicazione per farti vedere come funzionano i logic bricks.

    La questione e' che dovresti vedere il logic editor un po' come un IDE e usarlo per combinare parti di codice.

    Ad esempio con la parte di logick brick che ti ho indicato dovresti inizializzare il tutto quindi come già  stai facendo caricare modelli ma anche aggiungere i keyframe dell'animazione agli oggetti.

    Una volta che tutto e' inizializzato, quindi sono caricati sia gli oggetti che le animazioni, puoi avviare l'animazione vera e propria usando un altra serie di logick bicks combinata opportunamente.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208518

    Arieccomi qui…

    Con un pò di fatica (mi ci è voluto un pò per entrare nell'ottica dei logic bricks) sono riuscito a fare quello che volevo. Ossia:

    – ho creato un Sensor di tipo always

    – ho collegato questo sensore ad un Controllers di tipo Payton in cui vado ad eseguire questo script:

    Code:
    import bge
    def main():
    cont = bge.logic.getCurrentController()
    owner = cont.owner
    # leggo dal file
    file_componenti = open(“matlab.txt”,”r”)
    i=file_componenti.readline() #legge una riga di file
    while (i):
    #separa i dati e li converte in float
    LocRot=list(map(float,i.split()))
    # Settaggio posizioni
    x0 = LocRot[0] #Posizione x
    y0 = LocRot[1] #Posizione y
    z0 = LocRot[2] #Posizione z
    # Si settano gli angoli di Eulero
    rho0=LocRot[3] #controllare se gli assi calcolati sono coincidenti
    pitch0=LocRot[4]
    yaw0=LocRot[5]
    #Leggo la successiva riga del file
    i=file_componenti.readline()
    # Sposto e ruoto l'oggetto nave
    owner.localPosition.x = x0
    owner.localPosition.y = y0
    owner.localPosition.z = z0
    owner.applyRotation([rho0,pitch0,yaw0])
    main()

    Ora vorrei fare un'altra cosa.

    Ho aggiunto nel Blender un altro oggetto nave (nave1 e nave2) ed ho inserito nel file matlab.txt altre sei componenti (3 per gli spostamenti e 3 per le rotazioni per la nave2), per cui per ogni riga di matlab.txt ho le posizioni e le rotazioni delle 2 navi.

    C'è un modo per richiamare ad esempio localPosition.x della nave2 nello stesso script (quello che ho inserito sopra) che fa riferimento al controller che gestisce nave1?

    Spero di essere stato chiaro

    {Genesis}
    Membro
    • Blenderista
    • Post sul Forum 311
    @genesis
    #208519

    Devi per forza avere tutto in un unico file?

    I logic bricks sono direttamente legati agli oggetti, quindi in una situazione di questo tipo tra le possibili soluzioni te ne propongo 2:

    1 – Usare due txt matlab e usare quindi due script (che sono lo stesso ma opportunamente modificato) da assegnare alle singole navi

    2 – Usare per entrambe le navi lo stesso script, ma modificato in modo che verifichi il “nome delle nave” recuperi le informazioni relative solo a quella nave

    Vi sono molte altre soluzioni come usare una empty, ma meglio non complicare le cose.

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208520
    '{Genesis}' wrote:

    Devi per forza avere tutto in un unico file?

    I logic bricks sono direttamente legati agli oggetti, quindi in una situazione di questo tipo tra le possibili soluzioni te ne propongo 2:

    1 – Usare due txt matlab e usare quindi due script (che sono lo stesso ma opportunamente modificato) da assegnare alle singole navi

    2 – Usare per entrambe le navi lo stesso script, ma modificato in modo che verifichi il “nome delle nave” recuperi le informazioni relative solo a quella nave

    Vi sono molte altre soluzioni come usare una empty, ma meglio non complicare le cose.

    La soluzione 1 è quella che mi è venuta in mente anche a me. Volevo però evitare di avere due script Python, ma soprattutto due file txt (meno sono le cose da far fare all'utente finale e meglio è).

    Vorrei pertanto utilizzare la soluzione due. Però non riesco a trovare il modo per richiamare all'interno dello script il nome della nave. Dovrebbe esere una cosa abbastanza semplice, ma non riesco a trovare nelle varie API la funzione che mi fa questo.

    Un aiutino?

    {Genesis}
    Membro
    • Blenderista
    • Post sul Forum 311
    @genesis
    #208521

    :?: Non puoi fare come nel primo script?

    Intendo una cosa tipo:

    Code:
    import bpy
    import bge

    def main():

    obj1=[bpy.data.objects.get(“nave1”)] #oggetto da animare
    obj2=[bpy.data.objects.get(“nave2”)] #oggetto da animare

    # leggo dal file
    file_componenti = open(“matlab.txt”,”r”)
    i=file_componenti.readline() #legge una riga di file
    while (i):
    #separa i dati e li converte in float
    LocRot=list(map(float,i.split()))
    # Settaggio posizioni nave1
    x1 = LocRot[0] #Posizione x
    y1 = LocRot[1] #Posizione y
    z1 = LocRot[2] #Posizione z
    # Si settano gli angoli di Eulero per nave1
    rho1=LocRot[3] #controllare se gli assi calcolati sono coincidenti
    pitch1=LocRot[4]
    yaw1=LocRot[5]

    # Settaggio posizioni nave2
    x2 = LocRot[6] #Posizione x
    y2 = LocRot[7] #Posizione y
    z2 = LocRot[8] #Posizione z
    # Si settano gli angoli di Eulero per nave2
    rho2=LocRot[9] #controllare se gli assi calcolati sono coincidenti
    pitch2=LocRot[10]
    yaw2=LocRot[11]
    #Leggo la successiva riga del file
    i=file_componenti.readline()
    # Sposto e ruoto l'oggetto nave1
    obj1.localPosition.x = x1
    obj1.localPosition.y = y1
    obj1.localPosition.z = z1
    obj1.applyRotation([rho1,pitch1,yaw1])

    # Sposto e ruoto l'oggetto nave2
    obj2.localPosition.x = x2
    obj2.localPosition.y = y2
    obj2.localPosition.z = z2
    obj2.applyRotation([rho2,pitch2,yaw2])
    main()

    In questo caso ti consiglierei di aggiungere una Empty e collegare il sensore a questa tanto alla fine vai a modificare direttamente gli oggetti non il proprietario del sensore.

    Come ultima cosa, ovviamente non posso provare lo script quindi e' altamente probabile che NON funzioni subito quindi devi darci uno sguardo. :wink:

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208522

    Grazie mille….. sono riuscito a muovere i due oggetti come.

    Lo script che hai postato funziona correttamente

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208523
    'cocci' wrote:

    Grazie mille….. sono riuscito a muovere i due oggetti come.

    Lo script che hai postato funziona correttamente

    In realtà  mi sbagliavo…. lo script che mi hai passato {Genesis} non funziona mel Blender Game… mentre funziona correttamente nel Render.

    Il problema è che ha me serve nel Game.

    Mi sa che utilizzo il primo metodo, ossia usare due script (uno per ogni nave)….. in modo da far prima

    cocci
    Membro
    • Blenderista
    • Post sul Forum 11
    @cocci
    #208524

    Ciao ragazzi,

    avrei bisogno di un vostro aiuto relativamente al problema posto in questa discussione un pò di tempo fa.

    Riassumo brevemente:

    ho due oggetti (due navi) che vorrei muovere (spostare e ruotare) nel Game Engine in funzione di valori memorizzati in due file .txt (files ottenuto mediante delle simulazioni in Matlab).Utilizzando i consigli che mi avete dato, ho creato due script python simili tra loro che vanno a leggere dai due file .txt in cui sono memorizzate le informazioni delle due navi. Attraverso poi due coppie sensore Always-controllore di tipo Python (una coppia per ogni nave) cerco di muovere le navi.

    Il problema è che nel Blender Game non vedo tutto il movimento (più frame consecutivi), ma soltanto un movimento (credo o il primo frame o l'ultimo)…… mi dite dove sto sbagliando ?

    Questo è lo script

    Code:
    import bge
    def main():
    cont = bge.logic.getCurrentController()
    owner = cont.owner
    # leggo dal file
    file_componenti = open(“matlab.txt”,”r”)
    i=file_componenti.readline() #legge una riga di file
    while (i):
    #separa i dati e li converte in float
    LocRot=list(map(float,i.split()))
    # Settaggio posizioni
    x0 = LocRot[0] #Posizione x
    y0 = LocRot[1] #Posizione y
    z0 = LocRot[2] #Posizione z
    # Si settano gli angoli di Eulero
    rho0=LocRot[3] #controllare se gli assi calcolati sono coincidenti
    pitch0=LocRot[4]
    yaw0=LocRot[5]
    #Leggo la successiva riga del file
    i=file_componenti.readline()
    # Sposto e ruoto l'oggetto nave
    owner.localPosition.x = x0
    owner.localPosition.y = y0
    owner.localPosition.z = z0
    owner.applyRotation([rho0,pitch0,yaw0])
    main()

Stai visualizzando 20 post - dal 1 a 20 (di 20 totali)
  • Devi essere connesso per rispondere a questo topic.