DirectX3D 11을 사용하여 응용 프로그램을 작성하고 카메라 목표 벡터는 xdelta, ydelta 및 zdelta 변수로 결정됩니다.마우스 이동을 카메라 패닝으로 변환하는 방법
화면을 가로 질러 마우스를 움직이면 & LMB을 눌러 XY로 내보기를 PAN해야합니다.
나는 그것이 새로운 것,그러나 내 생각이 아니라 세계 X에 X 및 Y 상대적으로 패닝와 Y 그래서 내가, 내 VIEW 공간에 마우스 이동에 델타를 추가 할 필요가 있다고 생각
이, 내 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
}
}
나는 다른 접근 방식을 시도하고 있습니다. 올바른 접근 방식이라고 생각하지만 여전히 올바르게 작동하지 않습니다. 마우스가 움직이고 "xdelta"및 "ydelta"변수에 변수를 저장하면 델타가 화면에서 X 및 Y로 나타납니다.
그때 그때 행렬의 값을 채울 변환 행렬
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;
지금, 내 타겟 벡터를 이동해야하는 변수 "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);
이제는 mTemp보기 매트릭스에 저장된 XY 델타의보기 좌표를 가져야합니까?
그렇다면, XY 델타보기 좌표를 mView XY 좌표에 추가 한 다음 월드 좌표로 다시 변환하여 대상을 설정해야하는 실제 XY 세계 값을 얻는 가장 좋은 방법입니까?
나는 이것을 달성하는 방법에 관해서 분실 상태입니다. 정말로 나에게 명확한 전부는 아니며 주제에 대해 구입 한 모든 책은 분명하지 않습니다.
나는 D3DXMatrixLookAtLH 함수를 사용하지만, 필자는 마우스의 움직임에 따라 타겟 위치의 변화를 계산하여 새로운 타겟을 그 함수로 공급하려고한다. 일부 코드 조각에 다음을 추가했습니다. – JeffS
대상이 표준화 된 벡터 일 수 있습니다. 카메라가 보이는 방향 만 정의하므로 카메라 벡터를 이동해도 대상 벡터와 동일하게 수행됩니다. – asmi84
오, 이제 알겠습니다. 우선, 행렬 곱셈은 의사 소통이되지 않습니다. 순서는 중요합니다. 두 번째로 회전에 따라 뷰 방향 벡터를 계산합니다. 그런 다음 카메라 위치 벡터를 계산하십시오. 두 좌표를 추가하여 목표 좌표를 얻은 다음 D3DXMatrixLookAtLH 함수에 입력합니다. 그리고 마지막으로 중요한 것은 행렬 연산에 익숙하지 않은 경우 직접 설정을 시도하지 말고 D3DXMatrix * 함수를 사용하십시오. – asmi84