为什么这个基本"旋转原点"没工作?

时间:2015-08-11 18:19:51

标签: matrix rotation shader direct3d

我已经完成了这一百次,但这是我第一次使用由#34; stick"制成的手动构造的立方体,这是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);
}

当我开始画画时,我使用那个矩阵:

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

我是否有错误或误解?我已经尝试过翻译的反转,认为在旋转之前会将其带回原点。但没有改善它。

1 个答案:

答案 0 :(得分:0)

转换看起来很好imho。 也许是因为&#39; XMMatrixTranslationFromVector&#39; 只需要3d-vector作为文档(msdn)说。

还要确保RotateAround功能和相机视图/项目矩阵能够提供正确的结果。

最好的问候。