/ / C ++ Управление на ролката на камерата в съответствие с глобалната ос, а не локална ос - c ++, игрален двигател, directx-11

C ++ камерата Roll контроли според глобалната ос, а не локална ос - c ++, игрален двигател, directx-11

Работя върху 3D игрален мотор, използващ DX11 иDXMath. В момента аз съм bussy прилагане на камера. Управлението работи добре за два от трите ъгъла на моя фотоапарат. накланянето и наклона вървят добре. Въпреки това, когато се опитвам да "преобърнем", контролът на завъртането и наклона се променя само по отношение на световната космическа ос и не използва новата ос на камерата. В резултат на това, когато завъртите камерата и искате да я завиете, бихте очаквали че да се върти локално на камерата, нали? но използва световната ос.Някой знае ли защо това се случи? И какво мога да направя, за да наклон и терена, в сравнение с камерата?

Двете трансформирани променливи са светъттрансформацията на камерата, (CT), за която използвам вектора на въртене, за да записвам моите ротации, и локалната трансформация, която е трансформация, която регистрира промените на позицията на камерата. (Тъй като трябва да локализирам позициите си по отношение на камерата и като такъв не мога просто да актуализирам световната позиция) Ротацията и мащабът не се използват в тази.

Transform CT = Parent.ObjectTransform;
Transform LCT = CurrentCamera.ChangeSinceLastFrame;

XMMATRIX World = GetWorldMatrix(Parent);

XMVECTOR DefaultForward = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
XMVECTOR DefaultRight = XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR DefaultUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

XMMATRIX camRotationMatrix = XMMatrixRotationRollPitchYaw(XMConvertToRadians(CT.Rotation.x), XMConvertToRadians(CT.Rotation.y), XMConvertToRadians(CT.Rotation.z));
XMVECTOR camTarget = XMVector3TransformCoord(DefaultForward, camRotationMatrix);
camTarget = XMVector3Normalize(camTarget);

XMVECTOR camRight = XMVector3TransformCoord(DefaultRight, camRotationMatrix);
XMVECTOR camForward = XMVector3TransformCoord(DefaultForward, camRotationMatrix);
XMVECTOR camUp = XMVector3TransformCoord(DefaultUp, camRotationMatrix);

XMVECTOR camPosition = XMVectorSet(CT.Position.x, CT.Position.y, CT.Position.z, 0.0f);

camPosition += LCT.Position.x * camRight;
camPosition += LCT.Position.y * camUp;
camPosition += LCT.Position.z * camForward;

XMFLOAT3 cp;
XMStoreFloat3(&cp, camPosition);

CurrentCamera.ChangeSinceLastFrame = Transform();
CurrentCamera.ChangeSinceLastFrame.Scale = Vector3f();

Parent.ObjectTransform.Position = Vector3f(cp.x, cp.y, cp.z);
camTarget = camPosition + camTarget;

XMMATRIX View = XMMatrixLookAtLH(camPosition, camTarget,camUp);
XMStoreFloat4x4(&ViewMatrix, View);
return View;

Отговори:

0 за отговор № 1

Мисля, че си XMMatrixRotationRollPitchYaw не прилага локално завъртане на въртене и наклон до предоставения ъгъл на въртене. Опитахте ли да приложите изрично ротациите в ред, така че да създадете матрица на въртене за roll, yaw и pitch индивидуално? По този начин бихте могли да свържете вашите матрици в ред, където вашите последващи завъртания на въртене и наклон се прилагат върху валцуваната рамка?

XMMATRIX mr = XMMatrixRotationRollPitchYaw(XMConvertToRadians(CT.Rotation.x),0.0, 0.0);
XMMATRIX my = XMMatrixRotationRollPitchYaw(0.0,XMConvertToRadians(CT.Rotation.y), 0.0);
XMMATRIX mp = XMMatrixRotationRollPitchYaw(0.0,0.0,XMConvertToRadians(CT.Rotation.z));
XMMATRIX camRotationMatrix = mr * (mp * my);

0 за отговор № 2

Използването на функция "поглед към" не е необходимо, акоВие поставяте камерата с ъглите на Ойлер.Имате нужда от матрица, която се трансформира от световното пространство в камерата, което е обратното на трансформацията, която ще използвате, ако камерата е обикновен обект.

Така че, след като стигнете camRotationMatrix, можете да го транспонирате (за да обърнете ротацията) и да го преведете -CT.Position, Това ви дава матрица, която се трансформира от световното пространство в пространството на камерата.