需要变换matrix将视图的中心转换为目标纹理内的自定义位置

我的问题如下:

我想使用一个渲染目标纹理来绘制16个视口,我想在这里显示16个不同的行进方块algorithm与我的3D图块的组合。 每个视口应该有自己的相机,并位于每个瓷砖组的中心自定义的距离,这个相机应该能够围绕他们的中心旋转,放大和缩小等。

我当前的问题是,我当前的投影设置是将相机视图的中心放置在目标纹理的中心,而不是将视图的中心定位在与该视口相对应的矩形的中心。

我假设我只需将翻译推到最终的转换,以便在标准化的屏幕坐标内翻译图像。 然而,当我试图做到这一点,它没有工作。 我应该怎么做?

注:目前我通过使用direct3d视口实现它,但我想知道如果我想要使用我的自定义变换管道应该怎么做。

Solutions Collecting From Web of "需要变换matrix将视图的中心转换为目标纹理内的自定义位置"

正如你所说,这正是视口打算要处理的事情。 设置单独的视口将使所有这一切变得简单,并且是处理这种渲染的推荐方式。

但是,因为您想知道如何使用单个全窗口视口来实现,而是使用剪切来将渲染限制在屏幕的一个位置(如果需要非矩形,也可以使用模板缓冲区来实现) ,那么你需要做的就是在你的投影matrix前乘一个平移matrix。 你想要的翻译是从窗口中间偏移到你想要投影中心的位置,以像素为单位。 实际上,你只是抵消了整个渲染的图像。 然后,您使用该组合的像素偏移量*投影matrix作为您的投影matrix,并正常进行。

人们为头戴式显示器(VR护目镜等)编写代码的方法与抵消渲染图像的方法相同,使得每只眼睛的视野朝向耳朵比朝向鼻子的视野更宽; 图像是有偏见的,以便从每只眼睛的角度来看,每只眼睛的视线中心更接近鼻子。

(请注意,这样做会导致裁剪问题,因为您最终会渲染一个视锥体,这个视锥体是基于对摄像机matrix的天真检查而被假定为可见的,这种情况下应该没问题。但是,如果您决定将整个屏幕的渲染向左偏移50像素,那么您将会比您的剪切代码更接近右边50个像素,因此它可能会select抛出出一些实际上在屏幕上可见的模型)

看来我错过了一些缩放。 通过在投影转换之后添加以下转换,我得到代码工作。

GMatrix4 trans1; trans1.Identity(); float TargetWidth = (vp->nWidth*4.0f), // our target is 4*4 viewports size TargetHeight = (vp->nHeight*4.0f); // switch( m_ProjectionType ) { default: case GPROJECTIONTYPE_PERSPECTIVE: m_mProjection.FieldOfView( pCameraData->fAngle, vp->nWidth/(float)vp->nHeight, pCameraData->fNearPlane, pCameraData->fFarPlane ); // Scale to viewport units. trans1.Scale( vp->nWidth/TargetWidth, vp->nHeight/TargetHeight, 1.0f ); // Move our center to the top-left screen corner. trans1._41 -= 1.0f; trans1._42 += 1.0f; // Add viewport offset in screen coordinates. trans1._41 += vp->x/(TargetWidth/2); trans1._42 -= vp->y/(TargetHeight/2); // Add offset from the top-left corner of the viewport to its center. trans1._41 += vp->nWidth/(TargetWidth); trans1._42 -= vp->nHeight/(TargetHeight); m_mProjection *= trans1; // push transform after projection. break; 

谢谢!