DirectX和DirectXTK转换限制

DirectX和DirectXTK转换限制,directx,directx-11,direct3d,Directx,Directx 11,Direct3d,我使用显示三维模型,在“”之后显示我的棱锥体: 尝试变换对象时,缩放和旋转效果很好,但我不确定如何移动对象(平移)。基本上,我正在寻找一种算法,该算法根据当前相机位置、焦距、视口和渲染模型(DirectX工具包为我提供了边界框,使其“大小”)确定XYZ平移的最小值和最大值,以便对象保持可见 无论视口大小如何,边界框总是相同的,因此如何将其大小与视口进行比较 请原谅我的生疏,至少现在我还不是3D开发者 绘制三角形的“简单渲染”示例: Matrix proj = Matrix::CreateSca

我使用显示三维模型,在“”之后显示我的棱锥体:

尝试变换对象时,缩放和旋转效果很好,但我不确定如何移动对象(平移)。基本上,我正在寻找一种算法,该算法根据当前相机位置、焦距、视口和渲染模型(DirectX工具包为我提供了边界框,使其“大小”)确定XYZ平移的最小值和最大值,以便对象保持可见

无论视口大小如何,边界框总是相同的,因此如何将其大小与视口进行比较

请原谅我的生疏,至少现在我还不是3D开发者

绘制三角形的“简单渲染”示例:

Matrix proj = Matrix::CreateScale( 2.f/float(backBufferWidth),
   -2.f/float(backBufferHeight), 1.f)
   * Matrix::CreateTranslation( -1.f, 1.f, 0.f );
m_effect->SetProjection(proj);

表示标准化三角形大小为[1,1,1],但此处的标准化值不起作用。

TL:DR:若要在世界各地移动模型,请创建一个转换矩阵,并使用
SetWorld
将其设置为世界矩阵

Matrix world = Matrix::CreateTranslation( 2.f, 1.f, 3.f);
m_effect->SetWorld(world);

// Also be sure you have called SetView and SetProjection for the 3D camera setup
//covered in the 3D shapes / Rendering a model tutorial
您应该从3D转换的基本回顾开始,特别是世界->视图->投影转换管道

  • 世界变换执行仿射变换,以将要渲染的模型转换到其“世界”位置。(又称“局部坐标到世界坐标的转换”)

  • 视图转换执行转换,以将世界位置转换为相机的视点(即位置和方向)(也称为“世界坐标到视图坐标转换”)

  • 投影转换执行转换,将视图位置转换为实际硬件使用的规范“-1到1”范围,包括任何透视投影(也称为“视图坐标到“剪辑”坐标的转换)

  • 硬件本身根据Direct3D
    SetViewport
    信息(也称“剪辑”坐标到像素坐标的转换),执行将“-1到1”转换为渲染目标中像素位置的最后一步

  • 虽然有点过时,但它很好地涵盖了整个想法

    在DirectX工具包BASICEFECT系统中,每个矩阵都有不同的方法:
    SetWorld
    SetView
    SetProjection
    。如果要同时设置所有三个
    setMatrix
    ,还有一个助手

    本教程涉及最简单的渲染形式2D渲染,您希望提供的坐标为自然“像素坐标”

    Matrix proj = Matrix::CreateScale( 2.f/float(backBufferWidth),
       -2.f/float(backBufferHeight), 1.f)
       * Matrix::CreateTranslation( -1.f, 1.f, 0.f );
    m_effect->SetProjection(proj);
    
    此矩阵的目的基本上是“撤消”设置视口将执行的操作,以便您可以在简单的像素坐标中思考。它不适用于三维模型

    在本教程中,我介绍了基本相机模型,但我将世界矩阵保留为标识,因此形状位于世界原点

    m_view = Matrix::CreateLookAt(Vector3(2.f, 2.f, 2.f),
        Vector3::Zero, Vector3::UnitY);
    m_proj = Matrix::CreatePerspectiveFieldOfView(XM_PI / 4.f,
        float(backBufferWidth) / float(backBufferHeight), 0.1f, 10.f);
    
    在本教程中,我还将世界矩阵保留为标识。我在教程中了解了这方面的基础知识

    的一个很好的特性是,通过将各个变换串联起来进行变换,可以同时执行所有变换。点p由矩阵W变换,然后由矩阵V变换,然后由矩阵p变换与点p由矩阵变换相同
    W*V*p