[PYTHON] So verschieben Sie das BufferImageStim-Objekt in PsychoPy

Wenn Sie viele Reize schreiben müssen, dauert das Zeichnen einige Zeit. Da der GL hinter den Kulissen von Psycho Pai arbeitet, können Sie mithilfe der Anzeigeliste viel Zeichenzeit sparen. BufferImageStim ist ein Wrapper für die Anzeigeliste, sodass Sie diesen verwenden können. Selbst wenn Sie die Position vor dem Zeichnen ändern, wird sie nicht reflektiert, sodass Sie sie nicht verschieben können.

Sie kann verwendet werden, indem Sie die GL-Funktion in der folgenden Problemumgehung direkt aufrufen.

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()

Vergleichen wir die Version ohne 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

So verschieben Sie das BufferImageStim-Objekt in PsychoPy
Wie man in Python entwickelt
[Python] Wie man PCA mit Python macht
Umgang mit Sitzungen in SQLAlchemy
Wie man nüchtern mit Pandas schreibt
Verwendung von SQLite in Python
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie man CSS in Django reflektiert
Wie man Prozesse in großen Mengen abbricht
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Umgang mit Japanisch mit Python
So melden Sie sich bei Docker + NGINX an
Wie Sie die interne Struktur eines Objekts in Python kennen
Verwendung berechneter Spalten in CASTable
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
So konvertieren Sie csv in tsv in CLI
[Itertools.permutations] So löschen Sie eine Sequenz in Python
Verwendung von Google Test in C-Sprache
So arbeiten Sie mit BigQuery in Python
So führen Sie Befehle mit einem Jupyter-Notebook aus
Wie man in GitPython '--gags fetch --tags' macht
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So extrahieren Sie einen Polygonbereich in Python
So weisen Sie den Index im Pandas-Datenrahmen neu zu
So überprüfen Sie die Version von opencv mit Python
So aktivieren Sie SSL (TLS) in Apache
Verwendung von Anacondas Interpreter mit PyCharm
So legen Sie ein nicht geprüftes Ziel in Flake8 fest
Umgang mit aufeinanderfolgenden Werten in MySQL
So wechseln Sie die Python-Version in Cloud9
So passen Sie den Bildkontrast in Python an
Verwendung von __slots__ in der Python-Klasse
So füllen Sie mit Python dynamisch Nullen aus
So führen Sie vom Server gesendete Ereignisse in Django durch
So verwenden Sie Map in ViewPager von Android
So zeigen Sie Hello World in Python an
Lesen von CSV-Dateien mit Pandas
So ändern Sie die Editorfarbe in PyCharm
Wie schreibe ich diesen Prozess in Perl?
Verwendung ist und == in Python
Wie schreibe ich Ruby to_s in Python
So zeigen Sie Bilder in Djangos Admin an
So zeichnen Sie ein OpenCV-Bild mit Pygame
So beleben Sie Zellen in iPython Notebook wieder
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
Umgang mit Speicherlecks in matplotlib.pyplot
Verwendung der C-Bibliothek in Python
So empfangen Sie Befehlszeilenargumente in Python
So löschen Sie einen Taple in einer Liste (Python)
So verfolgen Sie die Arbeit mit Powershell
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Einbetten von Variablen in Python-Strings