我使用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世界值吗?
我不知道如何实现这一点。这对我来说真的不是很清楚,我购买的所有有关此主题的书籍也都不太清楚。