投影矩阵转换'环绕'

时间:2014-03-13 18:13:00

标签: directx direct3d directxmath

我正在编写一些代码,必须将多个顶点坐标转换为CPU上的剪辑/投影空间(与现有应用程序集成;着色器不是此处的选项,因为应用程序提供了自己的着色器稍后一点),我有一个测试用例,打算让结果成为一个基本的,相机风格的'转换+投影俯视围绕X轴旋转的相机。

测试用例如下:

#include <windows.h>
#include <xnamath.h>
#include <stdio.h>

int main()
{
    XMVECTOR atPos = XMVectorSet(925.0f, -511.0f, 0.0f, 0.0f);
    XMVECTOR eyePos = XMVectorSet(925.0f, -311.0f, 200.0f, 0.0f);
    XMVECTOR upDir = XMVectorSet(0.f, 0.f, 1.f, 0.0f);

    XMMATRIX viewMatrix = XMMatrixLookAtLH(eyePos, atPos, upDir);
    XMMATRIX projectionMatrix = XMMatrixPerspectiveFovLH(XMConvertToRadians(55.f), 1.0f, 0.1f, 5000.0f);

    XMMATRIX viewProjMatrix = viewMatrix * projectionMatrix;

    XMVECTOR coord1 = XMVectorSet(925.0f, -500.0f, 0.0f, 0.0f);
    XMVECTOR coord2 = XMVectorSet(925.0f, 0.0f, 0.0f, 0.0f);
    XMVECTOR coord3 = XMVectorSet(925.0f, -1000.0f, 0.0f, 0.0f);

    coord1 = XMVector3TransformCoord(coord1, viewProjMatrix);
    coord2 = XMVector3TransformCoord(coord2, viewProjMatrix);
    coord3 = XMVector3TransformCoord(coord3, viewProjMatrix);

    printf("    0: %g %g %g\n", XMVectorGetX(coord2), XMVectorGetY(coord2), XMVectorGetZ(coord2));
    printf(" -500: %g %g %g\n", XMVectorGetX(coord1), XMVectorGetY(coord1), XMVectorGetZ(coord1));
    printf("-1000: %g %g %g\n", XMVectorGetX(coord3), XMVectorGetY(coord3), XMVectorGetZ(coord3));

    getc(stdin);
}

如果我只是通过视图矩阵进行变换,我注意到Y值正确移动与坐标的输入Y值相关;但添加投影矩阵时,Y值似乎环绕,使得两者的坐标都变为“北”。的视图和坐标到南方的&#39;视图中的视图在投影空间中以相同的方向延伸,这导致最终的面使用目标应用程序中的相似代码相互重叠而不是以正确的顺序绘制。

在这方面我做错了什么,以及如何获得至少此输入的有效结果(即以与输入Y前进相同的方式延伸,即使这些顶点超出给定的投影范围,我怀疑应该是一个问题)?

1 个答案:

答案 0 :(得分:0)

XMVECTOR upDir = XMVectorSet(0.0f, 1.0f ,0.0f,0.0f);