gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:12 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com