Windows11下Matlab Psychtoolbox 3.0如何将屏幕划分为多个独立功能区域
Windows 11 环境下 Matlab Psychtoolbox 3.0 屏幕分区实现方案
你不需要修改系统层面的屏幕拆分逻辑,直接在PTB的全屏绘制窗口中定义互不重叠的坐标矩形即可实现独立区域的内容渲染,具体实现步骤如下:
1. 基础参数获取
首先初始化PTB并获取屏幕基础坐标:
% 调试阶段可临时关闭同步测试,正式实验请删除该行 Screen('Preference', 'SkipSyncTests', 1); % 获取主屏幕ID,打开全屏黑色窗口 screenId = max(Screen('Screens')); [windowPtr, screenRect] = Screen('OpenWindow', screenId, 0); % 获取屏幕物理宽高 [screenW, screenH] = Screen('WindowSize', screenId);
注意:请先将Windows 11的系统显示缩放比例调整为100%,避免PTB坐标和实际物理像素不匹配导致区域错位
2. 自定义各独立区域坐标
按照你的需求定义居中视频区域和其余实验任务区域,只要保证各区域的矩形坐标[left, top, right, bottom]没有重叠,就能实现内容互不干扰:
% 自定义视频区域尺寸,示例为16:9的800*450分辨率 videoW = 800; videoH = 450; % 生成居中的视频区域矩形 videoRect = CenterRectOnPoint([0 0 videoW videoH], screenW/2, screenH/2); % 定义其余实验任务区域,可根据需求自由拆分,示例拆分为左右两个任务区 % 左侧任务区:从屏幕左边缘到视频区左边缘,留20px安全间距避免重叠 leftTaskRect = [0, 0, videoRect(1)-20, screenH]; % 右侧任务区:从视频区右边缘到屏幕右边缘,留20px安全间距 rightTaskRect = [videoRect(3)+20, 0, screenW, screenH];
你也可以根据需求拆分为顶部、底部等其他区域,只要调整坐标参数即可。
3. 分区域绘制内容
PTB的所有绘制接口都支持指定目标矩形参数,只需要在绘制时对应到不同区域的rect即可:
- 视频播放:如果使用逐帧解码渲染,调用
Screen('DrawTexture')时指定dstRect为videoRect;如果使用内置播放器,调用MoviePlayback时指定drawRect参数即可 - 实验任务渲染:绘制文字、图片、交互按钮等刺激时,指定目标rect为对应的任务区域即可
- 交互逻辑隔离:如果需要响应鼠标点击,使用PTB内置的
IsInRect(mouseX, mouseY, targetRect)函数即可判断当前操作属于哪个区域,实现交互逻辑互不干扰
最小可运行测试Demo
你可以直接运行以下代码验证分区效果:
clear all; clc; close all; Screen('Preference', 'SkipSyncTests', 1); screenId = max(Screen('Screens')); [screenW, screenH] = Screen('WindowSize', screenId); [windowPtr, ~] = Screen('OpenWindow', screenId, 0); % 定义分区 videoW = 800; videoH = 450; videoRect = CenterRectOnPoint([0 0 videoW videoH], screenW/2, screenH/2); leftTaskRect = [0, 0, videoRect(1)-20, screenH]; rightTaskRect = [videoRect(3)+20, 0, screenW, screenH]; % 绘制分区测试背景 Screen('FillRect', windowPtr, [255 0 0], leftTaskRect); Screen('FillRect', windowPtr, [0 255 0], rightTaskRect); Screen('FillRect', windowPtr, [0 0 255], videoRect); % 绘制分区说明文本 DrawFormattedText(windowPtr, '左侧实验任务区', 'center', 'center', 255, [], [], [], [], leftTaskRect); DrawFormattedText(windowPtr, '右侧实验任务区', 'center', 'center', 255, [], [], [], [], rightTaskRect); DrawFormattedText(windowPtr, '视频播放区', 'center', 'center', 255, [], [], [], [], videoRect); % 刷新屏幕显示,按任意键退出 Screen('Flip', windowPtr); KbWait; sca;
内容的提问来源于stack exchange,提问作者yasaman.h
相关产品推荐
相关产品推荐

