c++ - DirectX11 : Translating along z axis causes vertex deformation

标签 c++ directx

我正在渲染一个直角棱镜并翻译它。然而,当我将它从相机移开时,有时模型会做一些意想不到的事情;它会拉伸(stretch)或根本不翻译。这似乎完全取决于顶点的 z 坐标。如果模型的前端从 2.0f 开始,模型平移就很好。但是,如果正面处于最小 Z 距离 (1.0f),则模型将拉伸(stretch)并且不会平移同一面。如果前面在 1.0f 之后,则模型根本不会显示在屏幕上。

这是我的模型数据:

前三个 float 是position,后三个是normals,最后两个是uv pair

VertexData cubeData[] = 
{

    //back
    {-0.5f,-0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},
    {-0.5f, 0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},
    { 0.5f, 0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},
    {-0.5f,-0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},
    { 0.5f,-0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},
    { 0.5f, 0.5f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f},

    //front
    {-0.5f,-0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},
    {-0.5f, 0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},
    { 0.5f, 0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},
    {-0.5f,-0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},
    { 0.5f,-0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},
    { 0.5f, 0.5f,-1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f},

    //left
    {-0.5f,-0.5f, 1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},
    {-0.5f, 0.5f, 1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},
    {-0.5f,-0.5f,-1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},
    {-0.5f, 0.5f,-1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},
    {-0.5f, 0.5f, 1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},
    {-0.5f,-0.5f,-1.0f,-1.0f,0.0f,0.0f,0.0f,0.0f},

    //right
    {0.5f,-0.5f, 1.0f,1.0f,0.0f,0.0f,0.0f,0.0f},
    {0.5f, 0.5f, 1.0f,1.0f,0.0f,0.0f,0.0f,0.0f},
    {0.5f,-0.5f,-1.0f,1.0f,0.0f,0.0f,0.0f,0.0f},
    {0.5f, 0.5f,-1.0f,1.0f,0.0f,0.0f,0.0f,0.0f},
    {0.5f, 0.5f, 1.0f,1.0f,0.0f,0.0f,0.0f,0.0f},
    {0.5f,-0.5f,-1.0f,1.0f,0.0f,0.0f,0.0f,0.0f}
};

我正在使用 for 循环来更改每个顶点的 z 坐标

std::vector<VertexData> vertexDataCube;
float distance = 0.0f;
for(int i = 0;i < 24;i++)
{
    cubeData[i].z += distance;
    vertexDataCube.push_back(cubeData[i]);
}

这是程序的输出

距离 = 0.0f

距离 = 2.0f

距离 = 1.0f

距离 = -1.0f

在每张图片中,顶点都向前平移了 5 个单位,但正如我上面所说,如果 distance 为负,这似乎不会改变输出,如果距离是0.0f。

这是我用来设置模型、 View 和投影矩阵的代码。

DirectX::XMFLOAT3 look,pos,up;
look = DirectX::XMFLOAT3(0.0f,0.0f,100.0f);
pos = DirectX::XMFLOAT3(0.0f,0.0f,1.0f);
up = DirectX::XMFLOAT3(0.0f,1.0f,0.0f);

XMStoreFloat4x4(&constBufferData.mModel,DirectX::XMMatrixIdentity());
XMStoreFloat4x4(&constBufferData.mView,DirectX::XMMatrixLookToLH(DirectX::XMLoadFloat3(&pos),DirectX::XMLoadFloat3(&look),DirectX::XMLoadFloat3(&up)));
XMStoreFloat4x4(&constBufferData.mPerspective,DirectX::XMMatrixPerspectiveFovLH(3.14159f/4.0f,WINDOW_WIDTH/WINDOW_HEIGHT,1.0f,100.0f));

然后在我的主循环中,我根据用户输入翻译模型矩阵,但现在我只翻译 5.0f。

XMStoreFloat4x4(&constBufferData.mModel,DirectX::XMMatrixTranslation(0.0f,0.0f,5.0f));

最佳答案

您的屏幕截图绝对有意义:

  1. 距离=0:您在立方体内部并且看到内部的部分区域。由于近剪裁平面,很可能没有绘制两个平面。

  2. 立方体相距 2 个单位,大小为 1 个单位。因此你看到它的一面。如果稍微旋转一下,您还会看到另外两个面(试试吧!)。

  3. 距离为 1 个单位。立方体大小也是 1 个单位:立方体就在(数学上接触)相机前面。因此它覆盖了整个屏幕。

  4. 立方体在相机后面。没什么可看的。这就是渲染的内容:背景。

恕我直言,你所有的屏幕截图都显示了我希望它们显示的内容。

关于c++ - DirectX11 : Translating along z axis causes vertex deformation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24215663/

相关文章:

变量 '' 周围的 C++ 堆栈已损坏。 (D3D9)

c++ - GET_WHEEL_DELTA_WPARAM 从不返回负数

c# - 操纵杆 + c# : Analog button

c++ - 由 ShellExecuteEx 打开时,Windows 文件属性对话框中缺少数据

C++ wstring 到文件而不是字符串

c++ - DX10+ 多顶点缓冲区,单索引缓冲区

c++ - 将 DirectX 接口(interface)转换为 IUnknown 指针

c++ - 如何选择 DirectX 像素格式?

c++ - dynamic_cast 抛出的 std::bad_cast 异常

c++ - 在 Managed_shared_memory 中 boost 进程间互斥