virtools二维坐标系概念总结

来源:互联网 发布:客观评价张学良知乎 编辑:程序博客网 时间:2024/05/23 05:08

用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);
}