c++ - 将顶点坐标转换为 "same"屏幕坐标

标签 c++ directx rendering transformation direct3d

我正在使用 Direct3D 从顶点格式 FVF_XYZ 的顶点缓冲区中绘制顶点。

我现在想实现画线的功能。在 3D 空间中绘制一条线时,我将端点投影到 2D 屏幕空间并使用我的函数从 2D 空间绘制一条线。我的问题出在这个函数上。

我的顶点缓冲区包含两个坐标为 (0,0,0)(1,0,0) 的顶点。我计划使用基本数学和转换将这条基本线转换为我的最终线。

问题是当我想渲染一个顶点到屏幕坐标 (0,0) 例如我不知道如何设置变换矩阵。

根据我的理解,在将世界、 View 和投影矩阵设置为标识时,我应该结束屏幕坐标 (0,0),但是 (0,0,0) 然后在屏幕中央结束。

我需要如何设置世界、 View 和投影矩阵,以便从 (0,0,0) 转换为 (0,0) 并从(1,0,0)(1,0) 等等?

最佳答案

首先值得注意的是,在投影空间中 (-1, 1, z, w) 变换为 (0,0) 和 (1, -1, z, w) 变换为 (1, 1)。

因此,在您想要将给定顶点变换到其投影空间的基础上,只需执行以下操作即可:

T' = W * V * P

(其中 W 是世界矩阵,V 是 View 矩阵,P 是投影矩阵)。

您现在可以将任何齐次坐标(4,即 x,y,z,1)乘以投影空间。

现在,如果您想执行透视除法,只需除以 w 即可。即

x' = x / w;
y' = y / w;
z' = z / w;
w' = w / w; // or 1

现在您有了一组坐标,其中 x,y 坐标在 -1、-1 到 (1, 1) 范围内。如果您因此希望将它们转换为 0 -> 1 空间,您建议您执行以下操作:

x'' = (x'  + 1) / 2;
y'' = (-y' + 1) / 2;

您现在在空间中有了您的坐标,其中 0, 0 是左上角,0, 1 是右下角。超出该范围的任何内容都在屏幕之外。

还值得注意的是,透视划分后的 z 值可以放入 Z 缓冲区。如果 Z 值小于 0(或者大于我记不清了),则它会被前平面裁剪,大于/小于 +/-1 超出远裁剪平面。

希望对您有所帮助。

关于c++ - 将顶点坐标转换为 "same"屏幕坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467000/

相关文章:

c++ - VS2010、DirectX 和 Intellisense 问题

c++ - 由于 DirectX,OpenCV 构建失败

c++ - 在现代游戏设计中,游戏的哪些部分被编写为可移植的?

graphics - Vulkan - 直接绘制纹理,无需顶点和着色器

c++ - cocos2d-x 3 如何让 Sprite 吞掉所有接触它的东西

c++ - 使用 AES-256 解压 Zip Archive 库

javascript - 如何从 JavaScript 中计算 HTML 表格的呈现高度?

java - 视频不在页面上呈现(html5 视频标签)

c++ - std::map 用于小型稀疏集合

c++ - 为什么我的程序不能正常工作