C++ 如何将三维坐标转换为二维屏幕空间

C++ 如何将三维坐标转换为二维屏幕空间,c++,math,3d,2d,C++,Math,3d,2d,我知道stackoverflow已经有了一些关于这个话题的问题和答案,但我不能针对我的具体问题来回答 这是我的密码: int main() { std::vector <int> v; double x_screen, y_screen; double screen_width = 640.0; double screen_height = 480.0; GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); double

我知道stackoverflow已经有了一些关于这个话题的问题和答案,但我不能针对我的具体问题来回答

这是我的密码:

int main()
{

std::vector <int> v;
double x_screen, y_screen;
double screen_width = 640.0;
double screen_height = 480.0;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
double half_screen_width = screen_width / 2;
double half_screen_height = screen_height / 2;
double window_aspect = screen_width / screen_height;
double x_3D, y_3D, z_3D;


for (int i = 0; i < 3; i++){
    v.push_back(i);
    ++v[i];
}

std::cout << "3D Point:" << std::endl;
for (int j = 0; j < v.size(); j++)
    std::cout << v[j] << std::endl;

x_3D = v[0] - viewport[0];
y_3D = v[1] - viewport[1];
z_3D = v[2] - viewport[2];


x_screen = (+(x_3D / z_3D)+half_screen_width)*half_screen_width;
y_screen = (-(y_3D / z_3D)+half_screen_height)*half_screen_height;

if (window_aspect > 1.0)
    x_screen = x_screen / window_aspect;
else
    y_screen = y_screen*window_aspect;

std::cout << "2D Point :" << std::endl;

std::cout << "[" << x_screen << "," << y_screen << "]" << std::endl;


getchar();
getchar();
return 0;
}
输出: 三维点:[1,2,3] 二维点:[7704057360]

我获得数学背景的教程如下:


有人能告诉我这个结果是否符合逻辑吗?我不熟悉这个话题,无法解释结果。

我很确定括号是错的。在我看来,它应该是:x_屏幕=+x_3D/z_3D*半屏幕宽度+半屏幕宽度;y_屏幕=-y_3D/z_3D*半屏幕高度+半屏幕高度;哦,好的,谢谢你,尼科!目前的结果是[480,2.79397e-007]。它看起来好多了,但我仍然不知道它是否正确。有没有人知道另一种方法来重新检查这个坐标,我可以实现这个方法来确保它是否是好的?