【问题标题】:Transform vertex coordinate to "same" screen coordinate将顶点坐标转换为“相同”的屏幕坐标
【发布时间】:2013-05-04 05:41:48
【问题描述】:

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

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

我的顶点缓冲区包含坐标为(0,0,0)(1,0,0) 的两个顶点。我打算用基本的数学和转换将这条基本线转换为我的最后一行。

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

根据我的理解,在将世界、视图和投影矩阵设置为身份时,我应该以屏幕坐标 (0,0) 结束,但 (0,0,0) 然后结束在屏幕的中心。

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

【问题讨论】:

    标签: c++ directx rendering transformation direct3d


    【解决方案1】:

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

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

    T' = W * V * P
    

    (其中W是世界矩阵,V是视图矩阵,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) 的范围内。如果您因此希望将它们转换为 he 0 -> 1 空间,您建议您执行以下操作:

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

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

    另外值得注意的是,你在透视分割后得到的 z' 值可以放入 Z-buffer 中。如果 Z 值小于 0(或者它大于我无法记住的头顶),则它被前平面剪裁,大于/小于 +/-1 超出远剪裁平面。

    希望对您有所帮助。

    【讨论】:

    • 谢谢。我的错误是我假设你所谓的投影空间已经是以像素为单位的屏幕空间。我的目标是从 0,0 到 screenMaxX,screenMaxY 的空间,但这只是简单缩放的问题。
    • @typ1232:很高兴我能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多