Matrix 为什么这是最基本的;围绕原点旋转“;不工作?

Matrix 为什么这是最基本的;围绕原点旋转“;不工作?,matrix,rotation,shader,direct3d,Matrix,Rotation,Shader,Direct3d,我已经做了一百次了,但这是我第一次用“棍子”手工构建立方体,这是3D线条。它是围绕原点构建的,在X、Y和Z方向上从原点向外5个方向 当我旋转它时,我仍然“在它里面”,它围绕着我旋转(相机)。我正在应用平移和旋转,所以我无法确定我做错了什么 下面是旋转长方体的基本代码,我的意思是生成它的世界矩阵: float rotateX = 0.0f, rotateY = 0.0f, rotateZ = 0.0f; XMFLOAT4 positionBox = XMFLOAT4(0, 0, -50, 1);

我已经做了一百次了,但这是我第一次用“棍子”手工构建立方体,这是3D线条。它是围绕原点构建的,在X、Y和Z方向上从原点向外5个方向

当我旋转它时,我仍然“在它里面”,它围绕着我旋转(相机)。我正在应用平移和旋转,所以我无法确定我做错了什么

下面是旋转长方体的基本代码,我的意思是生成它的世界矩阵:

float rotateX = 0.0f, rotateY = 0.0f, rotateZ = 0.0f;
XMFLOAT4 positionBox = XMFLOAT4(0, 0, -50, 1);   // Camera at origin looking at this
XMMATRIX matrixCubeWorld;

void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
{
    auto pCamera = g_GameServices.GetService<CWorldCamera>();

    XMMATRIX translation = XMMatrixTranslationFromVector(XMLoadFloat4(&positionBox));
    XMMATRIX rotation = XMMatrixRotationRollPitchYaw(rotateX, rotateY, rotateZ);

    matrixCubeWorld = rotation * translation;

    if (GetKeyState('X') < 0)
        rotateX = RotateAround(rotateX, fElapsedTime);
    if (GetKeyState('Y') < 0)
        rotateY = RotateAround(rotateY, fElapsedTime);
}

那么我是有错误还是误解?我试过使用平移的相反方向,认为这样会“在旋转之前将其带回原点”,但没有改善它。

变换看起来不错。 可能是因为“xmmatrixtransationfromVector” 如文档()所示,只接受三维向量

同时确保RotateAround函数和camera view/proj矩阵给出正确的结果

致以最良好的祝愿

    D3D11_MAPPED_SUBRESOURCE MappedResource;
    V(pd3dImmediateContext->Map(_pVertexShaderVariables, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
    auto pCB = reinterpret_cast<VSCB3DLineChangesEveryFrame *>(MappedResource.pData);
    pCB->_gWorldViewProj = matrixCubeWorld * pCamera->GetViewMatrix() * pCamera->GetProjMatrix();
    pd3dImmediateContext->Unmap(_pVertexShaderVariables, 0);
    return hr;
VertexShaderOutput Line3DVertexShaderFunction(float3 position : POSITION, float4 color : COLOR, float2 tex : TEXCOORD0)
{
    VertexShaderOutput output;

    output.position = mul(float4(position, 1), _gWorldViewProj);
    output.color    = color;
    output.tex      = tex;
    return output;
}