【问题标题】:DirectX11: Translating along z axis causes vertex deformationDirectX11:沿 z 轴平移会导致顶点变形
【发布时间】:2014-06-14 01:03:31
【问题描述】:

我正在渲染一个矩形棱镜并平移它。但是,当我将其从相机中移开时,有时模型会做出一些意想不到的事情;它会拉伸或根本不翻译。这似乎都取决于顶点的z坐标是什么。如果模型的前部从 2.0f 开始,则模型可以正常平移。但是,如果前面处于最小 Z 距离 (1.0f) 处,则模型将拉伸并且同一面将不会被平移。如果前面在 1.0f 之后,则模型根本不会显示在屏幕上。

这是我的模型数据:

前三个浮点数是位置,后三个是法线,最后两个是 uv 对

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 个单位,但就像我上面所说的,如果 距离 为负数,这似乎不会改变输出,如果距离是0.0f。

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

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

【问题讨论】:

  • 你是如何设置世界/视图/投影矩阵的?这很重要,尤其是投影矩阵。
  • 我将在上面的编辑中发布我的矩阵设置。
  • 对我来说似乎没有什么失真,你看到的是完全正常的,当距离为 0 时,相机在图元内,当距离大于 0 时,你只会看到未被剔除的面你会看到部分/完整的原语,当它小于 0 时,它就在视野之外,所以你根本看不到它

标签: c++ directx


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-11-21
    • 1970-01-01
    • 2019-12-11
    • 2016-05-16
    • 1970-01-01
    相关资源
    最近更新 更多