我正在使用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;
答案 0 :(得分:0)
我认为,您的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);
答案 1 :(得分:0)
使用"查看"如果您使用欧拉角定位相机,则无需功能。你只需要一个从世界空间转换到相机空间的矩阵,这是相机是常规物体时所使用的变换的反转。
因此,在获得camRotationMatrix
后,您可以转置它(以反转旋转)并将其转换为-CT.Position
。这为您提供了一个从世界空间转换到相机空间的矩阵。