[PYTHON] Comment déplacer l'objet BufferImageStim dans PsychoPy

Si vous devez écrire beaucoup de stimuli, le dessin prendra du temps. Puisque GL travaille dans les coulisses de Psycho Pai, vous pouvez gagner beaucoup de temps de dessin en utilisant la liste d'affichage. BufferImageStim est un wrapper pour la liste d'affichage, vous pouvez donc l'utiliser. Même si vous changez de position avant de dessiner, elle ne sera pas reflétée, vous ne pourrez donc pas la déplacer.

Il peut être utilisé en appelant la fonction GL directement dans la solution de contournement suivante.

BufferImageStim is useful for fast rendering, but at the moment pos has no effect, so you cannot move the stimulus.

Here is workaround.

from psychopy import visual, core, event, monitors
import numpy as np

# need these lines to use GL functions
import pyglet
pyglet.options['debug_gl'] = False
GL = pyglet.gl

#create a window
mywin = visual.Window([800,600],monitor="testMonitor", units="pix")

N = 800
xs = np.random.rand(N)*800-400
ys = np.random.rand(N)*600-300
rs = np.random.rand(N)*10

slist = [visual.Circle(win=mywin, radius=r, pos=(x,y)) for x,y,r in zip(xs,ys,rs)]
stim = visual.BufferImageStim(mywin, stim=slist)

t0 = core.getTime()
while True: #this creates a never-ending loop
    nw = core.getTime()
    
    cx = np.sin(-nw*np.pi)

    # stim.draw() # position doesn't change
    
    stim._selectWindow(stim.win)

    GL.glPushMatrix()
    GL.glTranslated(cx, 0, 0) # NOTE: gl coordinate. by default, [-1 to 1, -1 to -1](probably)

    GL.glScalef(stim.thisScale[0] * (1,-1)[stim.flipHoriz],
                stim.thisScale[1] * (1,-1)[stim.flipVert], 1.0)
    GL.glColor4f(stim.desiredRGB[0], stim.desiredRGB[1], stim.desiredRGB[2], stim.opacity)
    GL.glCallList(stim._listID)
    GL.glPopMatrix()

    mywin.flip()

    if len(event.getKeys())>0: break
    event.clearEvents()

#cleanup
mywin.close()
core.quit()

Comparons la version sans BufferImageStim

Here is non-BufferImageStim version. Pretty slow.

from psychopy import visual, core, event, monitors
import numpy as np

#create a window
mywin = visual.Window([800,600],monitor="testMonitor", units="pix")

N = 800
xs = np.random.rand(N)*800-400
ys = np.random.rand(N)*600-300
rs = np.random.rand(N)*10

slist = [visual.Circle(win=mywin, radius=r) for x,y,r in zip(xs,ys,rs)]

t0 = core.getTime()
while True: #this creates a never-ending loop
    nw = core.getTime()
    
    cx = np.sin(-nw*np.pi)*400

    for i in range(0, N):
        slist[i].pos = (xs[i]+cx, ys[i])
        slist[i].draw()
        
    mywin.flip()

    if len(event.getKeys())>0: break
    event.clearEvents()

#cleanup
mywin.close()
core.quit()

Enjoy!!

Recommended Posts

Comment déplacer l'objet BufferImageStim dans PsychoPy
Comment développer en Python
[Python] Comment faire PCA avec Python
Comment gérer une session dans SQLAlchemy
Comment écrire sobrement avec des pandas
Comment utiliser SQLite en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Comment refléter CSS dans Django
Comment tuer des processus en vrac
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment gérer le japonais avec Python
Comment se connecter à Docker + NGINX
Comment connaître la structure interne d'un objet en Python
Comment utiliser les colonnes calculées dans CASTable
Comment définir dynamiquement des variables en Python
Comment faire R chartr () en Python
Comment convertir csv en tsv dans la CLI
[Itertools.permutations] Comment créer une séquence en Python
Comment utiliser Google Test en langage C
Comment utiliser BigQuery en Python
Comment exécuter des commandes avec Jupyter Notebook
Comment faire 'git fetch --tags' dans GitPython
Comment obtenir stacktrace en python
Comment afficher la table quatre-vingt-dix-neuf en python
Comment extraire une zone de polygone en Python
Comment réattribuer un index dans pandas dataframe
Comment vérifier la version d'opencv avec python
Comment activer SSL (TLS) dans Apache
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
Comment spécifier une cible non vérifiée dans Flake8
Comment gérer des valeurs consécutives dans MySQL
Comment changer de version de Python dans cloud9
Comment régler le contraste de l'image en Python
Comment utiliser __slots__ dans la classe Python
Comment remplir dynamiquement des zéros avec Python
Comment faire des événements envoyés par le serveur dans Django
Comment utiliser Map dans ViewPager d'Android
Comment afficher Hello World en python
Comment lire des fichiers CSV avec Pandas
Comment changer la couleur de l'éditeur dans PyCharm
Comment écrire ce processus en Perl?
Comment utiliser is et == en Python
Comment écrire Ruby to_s en Python
Comment afficher les images dans l'administration de Django
Comment dessiner une image OpenCV avec Pygame
Comment faire revivre des cellules dans le notebook iPython
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Comment gérer les fuites de mémoire dans matplotlib.pyplot
Comment utiliser la bibliothèque C en Python
Comment recevoir des arguments de ligne de commande en Python
Comment effacer un taple dans une liste (Python)
Comment suivre le travail avec Powershell
Comment implémenter la fonctionnalité de type helper Rails dans Django
Comment incorporer des variables dans des chaînes python