如何将鼠标移动转化为相机平移

4

我使用DirectX3D 11编写应用程序,我的相机目标向量由变量xdelta、ydelta和zdelta确定。

当我按住鼠标右键和左键在屏幕上移动时,我必须在XY平面上PAN视图。

我想到需要将鼠标移动中的增量添加到我的VIEW空间中,以便它相对于我的视图而不是世界X和Y平移。

然而,作为新手,我不知道如何将我的VIEW坐标转换回WORLD坐标。

希望我遵循了所有格式规则,因为我没有经常在这里发布,无法完全记住它们。

如果有任何帮助,将不胜感激。以下是我的代码片段。也许还有更好的方法。

if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
{
if ( curX != mouseX || curY != mouseY ) {
//Get Target Coordinates in View Space
D3DXVECTOR3 targetView = (D3DXVECTOR3 ( mView(2,0), mView(2,1), mView(2,2) );
//Add mouse XY delta vector to target View Coordinates
     D3DXVECTOR3 delta ( (float)curX-(float)mouseX, 
                         (float)curY-(float)mouseY, zdelta );
targetView += delta;
//Convert back to World Coordinates


}
}

我正在尝试一种不同的方法,我相信这是正确的方法,但它似乎仍然不能正常工作。当我的鼠标移动时,我从屏幕中获取X和Y的增量并将它们存储在变量"xdelta"和"ydelta"中。

然后,我创建了一个转换矩阵。

D3DXMATRIX mTrans;

然后我填充矩阵中的值

// Rotation
mTrans(0,0) = delta.x;
mTrans(1,1) = delta.y;
// Translation
mTrans(0,3) = delta.x;
mTrans(1,3) = delta.y;

现在要获取它们对应的视图坐标,我认为应该将其乘以视图矩阵,我称之为mView。

mTrans= mTrans*mView;

现在将这些翻译后的值添加到我的当前目标X和Y上,这由变量“target_x”和“target_y”确定,它应该相对于我的视图坐标X和Y移动我的目标向量(即垂直于我的当前视图)。

target_x += mTrans(0,3);
target_y += mTrans(1,3);

但它并没有。它沿着世界X和Y轴移动我的目标,而不是我的视图X和Y轴。

更多片段

我确实使用了D3DXMatrixLookAtLH函数,但我正在尝试根据我的鼠标移动计算目标位置的变化,以获取新的目标并将其馈入该函数。我添加了一些代码片段:

if ( m_Input->RMBPressed() == true && m_Input->LMBPressed() == true ) // Pan View
    {
        if ( curX != mouseX || curY != mouseY ) {
            //Get mouse XY delta vector
            D3DXVECTOR3 delta ( (float)curX-(float)mouseX, (float)curY-(float)mouseY, zdelta );
            //Create Transformation Matrix
            D3DXMATRIX mTemp;
            // Rotation
            mTemp (0,0) = delta.x;
            mTemp (1,1) = delta.y;
            mTemp (2,2) = delta.z;
        // Translation
            mTemp (0,3) = delta.x;
            mTemp (1,3) = delta.y;
            mTemp (2,3) = delta.z;
            //Convert to View Coordinates
            mTemp = mTemp*mView;
            xdelta += mTemp(0,3);
            ydelta += mTemp(1,3);

    // Convert Spherical to Cartesian coordinates: mPhi measured from +y
    // and mTheta measured counterclockwise from z.
    float height = mRadius * cosf(mPhi);
    float sideRadius = mRadius * sinf(mPhi);
    float x = xdelta + sideRadius * cosf(mTheta);
        float z = zdelta + sideRadius * sinf(mTheta);
    float y = ydelta + height;

    // Build the view matrix.
    D3DXVECTOR3 pos(x, y, z);

    D3DXVECTOR3 target(xdelta, ydelta, zdelta);

    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.

    D3DXMatrixLookAtLH(&mView, &pos, &target, &up);

首先,感谢您提供的所有信息。这有助于我逐渐了解DirectX矩阵。 以下的逻辑是否正确? 假设我的鼠标在屏幕上的改变是X轴5.0和Y轴5.0。那就是我的delta。Z始终为0.0。 我可以按如下方式找到视图坐标。
 D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); // Y Axis is up. Looking down Z.
 D3DXVECTOR3  delta ( 5.0f,  5.0f, 0.0f );
 D3DXVECTOR3 origin ( 0.0f. 0.0f, 0.0f );
 D3DMATRIX mTemp;
 D3DXMatrixIdentity (&mTemp);
 D3DXMatrixLookAtLH (&mTemp, &delta, &origin, &up );

我现在应该已经将XY delta的视图坐标存储在mTemp视图矩阵中了吗?

如果是这样,最好的方法是将XY delta视图坐标添加到mView XY坐标中,然后将其转换回世界坐标,以获得我必须设置目标的实际XY世界值吗?

我不知道如何实现这一点。这对我来说真的不是很清楚,我购买的所有有关此主题的书籍也都不太清楚。

1个回答

2
您可以通过将本地坐标乘以世界矩阵来计算世界坐标。如果您想让相机移动,只需使用3D向量定义其当前位置,然后使用D3DXMatrixLookAtLH从当前位置计算视图矩阵。请查看此教程以获取更多详细信息:http://www.braynzarsoft.net/index.php?p=D3D11WVP

我确实使用了D3DXMatrixLookAtLH函数,但我正在尝试根据我的鼠标移动计算目标位置的变化,以获得新的目标值并输入该函数中。我加入了一些代码片段: - JeffS
目标可以是一个归一化向量,它仅定义相机所看方向的方向,因此当您移动相机向量时,请对目标向量执行相同操作。 - asmi84
哦,我现在明白了。 首先,请记住矩阵乘法不是可交换的-顺序很重要。 其次,仅基于旋转计算视图方向向量。然后计算您的相机位置向量。将这两个向量相加以获得目标坐标,然后将它们提供给D3DXMatrixLookAtLH函数。 最后但同样重要的是-如果您不熟悉矩阵运算,请勿直接设置它们,而是使用D3DXMatrix *函数。 - asmi84
谢谢你的所有帮助。我仍然有一些问题,但这是由于我对DirectX缺乏经验。我在上面发布了更多信息。再次感谢。 - JeffS
是的,我能看到。看看这个教程:http://www.braynzarsoft.net/index.php?p=D3D11WVP 它更详细地解释了各种空间。还有其他教程可能对你也很有趣。 - asmi84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接