異なる2つの視覚刺激を呈示する方法

146 views
Skip to first unread message

谷恵介

unread,
Apr 8, 2019, 4:03:52 AM4/8/19
to 心理学実験について話そう
黒木先生

はじめまして、谷と申します。
Psychtoolboxを用いて以下の視覚課題を作成したいのですが、なかなかうまくいかないため質問させていただきます。


まず、作成したい刺激ですが、異なる2種類の視覚刺激を同時に呈示する、というものです(添付ファイルの図参照)

1つ目は、画面中心に線分を呈示し、被験者がキー操作により任意の方向まで回転できるというものです。
2つ目は、線分の周りのランダムドットが一定方向へ回転するというものです。これは、課題(被験者が動かす線分)とは無関係に動くものです。
すなわち、被験者には動く背景画像が呈示されている最中に、ある方向へ線分をあわせる課題を行ってもらいます。

現状、ここに載っていたプログラムを参考に、ランダムドットが回転する刺激を単独で呈示はできており、キー入力で動く線分もそれ単独では呈示できています。
しかしながら、この2つの刺激を同時に刺激することができていない状況です。
具体的には、背景は、ランダムドット作成しそれを回転移動→呈示をループで回しておりますが、そのループ中には1つ目の刺激は呈示できない、ということになっております。


初歩的な質問になるかもしれませんが、もし何かいい方法等がございましたら教えていただけると幸いです。
どうぞよろしくお願いいたします。




なお、以下に、現状作成している背景画像(ランダムドット)のプログラムを記載します。

try
  % 背景色
  bgColor = [255 255 255];
 
 
  screenNumber=max(Screen('Screens'));
  %ウィンドウでの呈示
  [windowPtr, windowRect]=Screen('OpenWindow', screenNumber, bgColor);
 
  %画面中央の座標
  [centerX centerY] = RectCenter(windowRect);
 
  xmax = 1000; % -xmaxから+xmaxまでのピクセル数がランダムドットを描画する四角形の水平方向の大きさです。
  ymax = 1000; % 同様に-ymaxから+ymaxまでのピクセル数がランダムドットを描画する四角形の垂直方向の大きさです。
 
  %ランダムドットの数
  numDots = 1000;     %最大値は1000?
  %ドットの大きさ
  dotSize = 20;       %最大値は20?
  %ドットの色
  col1 = [0 0 0];

  
  %ドットのx座標
  dots(1, :) = 2*xmax*rand(1, numDots) - xmax;
  %ドットのy座標
  dots(2, :) = 2*ymax*rand(1, numDots) - ymax;
  %ドットの像差量(像差を持たないドットについては0を代入する)

  %1フレームでの回転量
  Ang_sec = 30 / 180; %1秒間での回転角度
  Ang = Ang_sec / 60; %1フレームに変換
 
  for r = 1: 600 %画像呈示時間
  %回転後のドットの座標
    for k = 1:numDots
      dots(1,k) = dots(1,k)*cos(Ang)-(dots(2,k))*sin(Ang);
      dots(2,k) = dots(1,k)*sin(Ang)+(dots(2,k))*cos(Ang); 
    end
 
  %ドットの表示
   Screen('DrawDots', windowPtr, dots(1:2, :) + [dots(3, :)/2; zeros(1, numDots)], dotSize, col1, [windowRect(3:4)/2], 1);  
   Screen('Flip', windowPtr);
 end
図.pptx

黒木@九州大学

unread,
Apr 9, 2019, 10:56:47 PM4/9/19
to 心理学実験について話そう
谷様

おたずねの件、決して初歩的なものではないと考えます。かなり難しい要素を含んでいます。
私もあまり経験はありません。

おおざっぱな説明としては、
%ドットの表示
   Screen('DrawDots', windowPtr, ・・・
のあとにでも、線分の描画を入れるのだろうと思います。
ただし、その段階でキー押しの状態を判別する必要があります。
まさにその瞬間のキーの状態を調べるには、KbCheckを使います。

問題は、KbCheckを呼び出したその瞬間に、キーを押しているとは限らない点です。
押しっぱなしでしたら、大丈夫かもしれません。

さらに問題は、キーの状態をチェックするときに、ランダムドットの運動にがたつきが生じる恐れがあります。
運動刺激を呈示中にキー反応を取得するのは結構鬼門で、キー反応があったときに運動を止めるのでしたら大きな問題はないのですが、運動を継続させるとなると、どうしてもそこで運動の一時停止のようなことが起こりそうです。

うまくいくか分かりませんが、ドットの表示のあとに、

[ keyIsDown, keyTime, keyCode ] = KbCheck; % キーが押されたか、そのときの時間、どのキーか、の情報を取得する

if keyIsDown

  if keyCode(KbName('LeftArrow')) % 

    Screen('DrawLine'・・・ % 線分を左に傾ける

  elseif keyCode(KbName('RightArrow'))

    Screen('DrawLine'・・・ % 線分を右に傾ける

  end;

end


みたいな感じで加えてみてはいかがでしょう?

谷恵介

unread,
Apr 10, 2019, 10:17:21 PM4/10/19
to 心理学実験について話そう
黒木先生

早速御連絡ありがとうございます。
先生の仰られた方法を試しましたところ、無事に動作することが確認できました。
危惧されていたキー入力によるドットのグラつきや刺激の一時停止などは(一見して)見られず、支障はなさそうです。

ありがとうございました。

Reply all
Reply to author
Forward
0 new messages