用vsl或SDK编写BB或插件时,获取二维平面坐标需要区分RenderContext的不同窗口,如下图所示:
1.Entire Window: RenderContext 上图最外侧红色圆点标记处
2.Window Rect:窗口矩形,与窗口分辨率有关。
3.View Rect:视口矩形,与摄像机分辨率(摄像机窗口纵横比)有关。
当调用Pick2D()方法获取二维帧时,需要注意的是传入的Vector2D参数是基于RenderContext坐标系的,而通过GetPosition()方法获取的Vector2D是基于ViewRect(视口矩形)坐标系的,由于坐标系的不同,如果不做处理,必然导致程序逻辑错误,达不到预期效果。
解决方法也简单,做Pick2D处理时,将二维坐标与窗口坐标和视口坐标相加,转换到渲染环境坐标系下。
VSL参考代码如下:
pIn:
_dEntity Entity2D
_picked Entity2D
///
// 功能:二维帧捕获
// 输入:鼠标二维帧
// 输出:如果成功捕获,输出到的二维帧,否则为空
///
static Vector2D vTL2dF;
static Vector2D vSize2dF;
main()
{
if(_dEntity == NULL)
{
_picked = NULL;
return;
}
RenderContext rc = bc.GetPlayerRenderContext();
rc.GetViewRect(viewRect);
rc.GetWindowRect(renderRect);
Vector2D subVect = renderRect.GetTopLeft() + viewRect.GetTopLeft();
_dEntity.GetPosition(vTL2dF);
_dEntity.GetSize(vSize2dF);
vTL2dF += (vSize2dF/2);
_picked = rc.Pick2D(vTL2dF + subVect);
}