D3D11坐标系

2024-01-31

我的一些旧代码最终出现了一堆令人讨厌的黑客行为,以使事情“正确”工作,在移动物体和相机方面,例如必须采用“std::sin(-yaw)”而不是“std::sin(yaw)”在实现在线其他地方找到的方程时,通常会让一切变得混乱,在许多情况下都达到了追踪和错误的程度。

  1. 使用 D3D11 和 DirectXMath 的东西(所以左手坐标和行专业?),预期的坐标系到底是什么,例如假设相机位于原点并沿着图像中的黄色矢量看而不旋转,标签是否正确?

    然后考虑到这一点,以及由(x,y,z)和俯仰(y轴鼠标/控件),偏航(x轴鼠标/控件)描述的相机,并假设我没有其他方法应该做即使...

  2. 获取视图矩阵的正确函数是什么(当前我乘以一个平移矩阵和两个旋转矩阵,乘以投影,然后乘以相关对象的任何世界矩阵,并将结果转置以用作单个着色器常量)。

  3. 获取相机所观察的向量的方程是什么(当前将 (0,0,1) 向量乘以 2 中的矩阵)。

  4. ...以及“向上”和“向右”向量(因为即使不使用观察矩阵视图函数,似乎视锥体剔除也需要知道这些)。当前再次与 2 中的矩阵相乘。
  5. 根据方向矢量计算正确的俯仰和偏航标量/分量(例如,对于具有单独的俯仰/偏航关节的炮塔)。

编辑:代码示例:

//Moving a floating object with only yaw forwards (moveX,moveY,moveZ).
//Negative yaw seems wrong?
auto c = std::cosf(-yaw);
auto s = std::sinf(-yaw);
pos.x += moveX * c - moveZ * s;
pos.y += moveY;
pos.z += moveX * s + moveZ * c;

//Gets the vector the camera is looking along
//This time yaw is positive, but pitch is negative?
float c = std::cos(-pitch);
Vector3F facing(
    c * std::sinf(yaw),
    std::sinf(-pitch),
    c * std::cosf(yaw));

//Creating the view transform matrix, everything is negative
XMMATRIX xmviewrot;
xmviewrot = XMMatrixRotationY(-yaw);
xmviewrot*= XMMatrixRotationX(-pitch);
XMMATRIX xmview;
xmview = XMMatrixTranslation(-x, -y, -z);
xmview *= xmviewrot;
XMStoreFloat4x4A(&view, xmview);

//Other vectors needed for frustum culling
XMVECTOR xmup = XMVector3Transform(XMLoadFloat4A(&UP), xmview);
XMVECTOR xmright = XMVector3Transform(XMLoadFloat4A(&RIGHT), xmview);

//Matrix for stuff that is already in world space (e.g. terrain)
XMMATRIX xmviewProj = xmview * xmproj;
//Apparently needs transposing before use on the GPU...
XMStoreFloat4x4A(&constants.transform, XMMatrixTranspose(xmviewProj));

//In the shaders
output.pos = mul(input.pos, transform);

//vertex positions for an upwards facing square with triangle strip
v0 = (x1, y, z1);
v1 = (x1, y, z2);
v2 = (x2, y, z2);
v3 = (x2, y, z1);

所以在我看来,我在这里做了一些根本性的错误,需要在不同的地方使用 -yaw 和 +yaw、-pitch 和 +pitch?其中一些功能我最终通过反复试验来完成,以获得正确的结果,在线样本没有使用负数。


Direct3D 11 没有指定的坐标系,您可以使用任何您想要的坐标系。来自 Chuck Walbourn 博客条目Direct3D 11 入门 http://blogs.msdn.com/b/chuckw/archive/2011/07/11/getting-started-with-direct3d-11.aspx:

数学:由于 Direct3D 11 没有“固定功能”图形 Direct3D 9 的管道,图形数学约定的选择 (左手矩阵与右手矩阵,行优先矩阵与列优先矩阵, 等)完全取决于开发人员。 DirectXMath 可用于 创建 Direct3D 样式的“左手坐标”变换为 以及使用 OpenGL 风格的“右手坐标”变换 行优先矩阵约定,可以直接与行优先一起使用 着色器或转置为使用列主着色器。

您的着色器决定它们期望的坐标系。最终,它们必须在均匀剪辑空间中向光栅化阶段提供顶点,这Direct3D 11 定义 http://msdn.microsoft.com/en-us/library/windows/desktop/bb205125.aspx as:

假设进入光栅化阶段的顶点 (x,y,z,w) 是 在均匀裁剪空间中。在此坐标空间中,X 轴点 右图,Y 指向上方,Z 指向远离相机的方向。

因此,其他问题的答案取决于您为项目选择的坐标系。 DirectXMath 库有许多函数可以为您计算适当的矩阵。较旧的 D3DX 库文档显示了用于计算这些矩阵的数学方法。

您的其他问题不是很清楚,但它们似乎不了解如何使用矩阵来变换顶点。您可能想看看旧的 Direct3D 9 文档 http://msdn.microsoft.com/en-us/library/windows/desktop/bb206269.aspx它描述了如何以及为什么在固定函数管道中使用顶点,并对这些主题进行了很好的介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3D11坐标系 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐