Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 投影矩阵变换&x27;环绕';_Directx_Direct3d_Directxmath - Fatal编程技术网

Directx 投影矩阵变换&x27;环绕';

Directx 投影矩阵变换&x27;环绕';,directx,direct3d,directxmath,Directx,Direct3d,Directxmath,我正在编写一些代码,必须将一些顶点坐标转换为CPU上的剪辑/投影空间(以便与现有应用程序集成;着色器在这里不是选项,因为应用程序稍后会提供自己的着色器),为此,我有一个测试用例,它打算让结果成为一个基本的“相机样式”变换+向下看绕X轴旋转的相机的投影 测试用例如下所示: #include <windows.h> #include <xnamath.h> #include <stdio.h> int main() { XMVECTOR atPos =

我正在编写一些代码,必须将一些顶点坐标转换为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);
}
#包括
#包括
#包括
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(xmconvertoradians(55.f)、1.0f、0.1f、5000.0f);
XMMATRIX viewProjMatrix=viewMatrix*projectionMatrix;
XMVECTOR坐标1=XMVectorSet(925.0f,-500.0f,0.0f,0.0f);
XMVECTOR coord2=XMVectorSet(925.0f,0.0f,0.0f,0.0f);
XMVECTOR坐标3=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前进相同的方式延伸,即使这些顶点不在给定的投影范围内,我怀疑这应该是一个问题)?

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

注意,写入XMVECTOR常量的有效方法是使用
XMVECTORF32
类型。例如,
static const XMVECTORF32 atPos={925.0f,-511.0f,0.0f,0.0f}
使用
XMVectorSet
实际上是用于变量而不是常量值。打印完整向量的有效方法是:
XMFLOAT4A tmp;XM4(和tmp、coord2);printf(“0:%g%g%g\n”,tmp.x,tmp.y,tmp.z)