0

前段时间我问了一个类似的问题,但我想我现在可以更好地表述它。

下面的代码(我正在改编,而不是从头开始编写)在正确的位置和正确的角度绘制了一个白条,如下图所示。它使用Psychtoolbox中的 OpenGL 命令(在 Matlab 上运行)。Psychtoolbox 坐标非常简单且基于像素:(0,0) 位于左上角。Y 向下增加,x 向右增加。

我无法理解 OpenGL 和 Psychtoolbox 坐标之间的映射。特别是,这条线glTranslatef( SkitSet.xLever, SkitSet.yLever, 0 );将白条向下平移了 1.5 个单位。这些单位是什么?我在哪里告诉 matlab OpenGL 中的 1.5 个单位大约是垂直屏幕的一半?

%% Psychtoolbox settings
whichScreen  = 0;
Screen('Preference', 'SkipSyncTests', 1); %1->without testing
inScreenRect = [0 0 500 500];


% Open window and specify some OpenGL settings
InitializeMatlabOpenGL( [], [], [], 0 );
[win , winRect] = PsychImaging( 'OpenWindow', whichScreen, 0, inScreenRect, [], [], 0, 0 );
Screen( 'BeginOpenGL', win );
aspectRatio = winRect( 4 ) / winRect( 3 );                       %% Get the aspect ratio of the screen
[winCenter.x, winCenter.y] = RectCenter(winRect);        %find the center of the screen
glMatrixMode( GL.PROJECTION );
glLoadIdentity;
gluPerspective( 25, 1 / aspectRatio, 0.1, 100 );
glMatrixMode( GL.MODELVIEW );
glLoadIdentity;
gluLookAt( 0, 0, 8, 0, 0, 0, 0, 1, 0);          %Set view point, center and direction
glClearColor( 0, 0, 0, 0 );
Screen( 'EndOpenGL', win );

SkitSet.xLever          = 0;        
SkitSet.yLever          = -1.5000;
SkitSet.LeverLength     = 0.4000;
SkitSet.LeverWidth      = 0.0400;


Screen( 'BeginOpenGL', win );
glClear;
glPushMatrix;
glTranslatef( SkitSet.xLever, SkitSet.yLever, 0 );
glRotatef( -45, 0.0, 0.0, 1.0 );                                         
glRectf( -SkitSet.LeverLength, -SkitSet.LeverWidth / 2, 0, SkitSet.LeverWidth / 2 );
glPopMatrix;
Screen( 'EndOpenGL', win );
Screen( 'Flip', win, [], [], 0 );                                   

最少代码的结果

4

1 回答 1

0

这更像是一个 OpenGL 问题,而不是任何特定于 Psychtoolbox 的问题。您正在设置投影平截头体。因此,您绘制的任何刺激都将使用您设置的投影和模型视图进行投影。单位是任意的,但以米为单位来考虑它们会很有帮助。如果 zNear 和 zFar ingluPerspective以米为单位,则所有其他调用(例如glTranslatef和)glRectf也采用同一单位的输入参数。如果你想把东西移到屏幕的一半,你必须计算 Y 和 Z 中的位置,给定你指定的 FOVgluPerspective. 如果你只是画一个杠杆,你确定要设置自己的投影和模型视图矩阵吗?Psychtoolbox 默认值将为您解决问题,然后您可以在 OpenGL 模式下处理单个像素。如果 PTB 默认值不起作用,则gluortho2d使用窗口矩形作为四个顶点设置一个。

于 2017-06-29T21:06:43.743 回答