C ++相机胶卷根据全局轴而不是局部轴进行控制

时间:2016-08-10 10:00:12

标签: c++ game-engine directx-11

我正在使用DX11和DXMath开发3D游戏引擎。目前我正忙着实施相机。这些控件可以很好地适用于我相机的三个角度中的两个角度。偏航和投球很顺利。然而,当我尝试'滚动'时,偏航和俯仰控制仅改变世界空间轴,并且不使用新的摄像机轴。因此,当您滚动相机并且想要偏航时,您会发现它会偏向本地偏向相机,对吧?但它使用世界轴。有人知道为什么会这样吗?我能做些什么来相对于相机的滚动产生偏航和俯仰?

两个变换变量是摄像机的世界变换(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;

2 个答案:

答案 0 :(得分:0)

我认为,您的XMMatrixRotationRollPitchYaw不会将偏航和俯仰旋转局部应用于所提供的侧倾角。 您是否尝试按顺序显式应用旋转,以便分别为rollyawpitch创建旋转矩阵?这样你可以按顺序连接你的矩阵,你的后续偏航和俯仰旋转应用于滚动的框架?

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);

答案 1 :(得分:0)

使用"查看"如果您使用欧拉角定位相机,则无需功能。你只需要一个从世界空间转换到相机空间的矩阵,这是相机是常规物体时所使用的变换的反转。

因此,在获得camRotationMatrix后,您可以转置它(以反转旋转)并将其转换为-CT.Position。这为您提供了一个从世界空间转换到相机空间的矩阵。