0

我正在编写一些代码,必须将多个顶点坐标转换为 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 值似乎环绕,使得视图“北”的坐标和视图“南”的坐标在投影空间中沿相同方向延伸,这导致在目标应用程序中使用类似代码转换的最终面相互重叠,而不是按正确的顺序绘制。

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

4

1 回答 1

0

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

于 2014-03-14T08:00:20.443 回答