4

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

当我按下 RMB 和 LMB 在屏幕上移动鼠标时,我必须在 XY 中平移我的视图。

我想我需要将鼠标移动中的增量添加到我的 VIEW 空间,以便它相对于我的视图在 X 和 Y 中平移,而不是在世界 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;

现在要获得它们对应的 View 坐标,我想我应该将它乘以 View Matrix,我称之为 mView。

mTrans= mTrans*mView;

现在将这些转换后的值添加到由变量“target_x”和“target_y”确定的当前目标 X 和 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。那是我的三角洲。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 增量的视图坐标存储在 mTemp 视图矩阵中吗?

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

我不知道如何实现这一目标。这对我来说真的不是那么清楚,我购买的关于这个主题的所有书籍也不是很清楚。

4

1 回答 1

2

您可以通过将本地坐标乘以世界矩阵来从本地坐标计算世界坐标。如果您希望您的相机移动,而不仅仅是使用 3D 矢量定义它们的当前位置,然后使用 D3DXMatrixLookAtLH 从您当前位置计算视图矩阵。查看本教程了解更多详情:http ://www.braynzarsoft.net/index.php?p=D3D11WVP

于 2012-02-01T15:07:09.557 回答