gpt4 book ai didi

c++ - 3d 投影到 2d 屏幕坐标

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

当前代码:

//calculating View Project matrix
abfw::Matrix44 view_proj_matrix_ = camera_.GetMatrix(PROJ) * camera_.GetMatrix(VIEW);

//3D position
abfw::Vector3 ball_position_ = balls_[look_at_index_].GetPosition();
abfw::Vector3 sprite_position;

//transform world to screen ratio in rang -1 to 1
ball_position_ = ball_position_.Transform(view_proj_matrix_);

//move to range 0 - 2
ball_position_.x += 1;

//scale to range 0 -1
ball_position_.x /= 2;

//scale to screen size
ball_position_.x *= platform_.width();

// same as above
ball_position_.y -= 1;
ball_position_.y /= -2;
ball_position_.y *= platform_.height();

//set sprite position
sprite_position = ball_position_;

// z is discounted
sprite_position.z = 0;

我得到的 x 和 y 值超出了屏幕范围,但我不明白为什么。我已尽可能地分解算法以尝试查看哪里出了问题,但我做不到。

编辑:当相机位于 (0,0,7) 时,在相同 y 值的球之间切换会给出相同的 Sprite 位置。

GetMatrix() 使用此代码:

view_matrix_.LookAt(camera_eye_, camera_lookat_, camera_up_);
projection_matrix_ = platform_.PerspectiveProjectionFov(camera_fov_, (float)platform_.width() / (float)platform_.height(), near_plane_, far_plane_);

这也是我用来绘画的东西,所以我假设它是正确的。

我相信使用行 vector 。

转换代码:

Vector3 result = Vector3(0.0f, 0.0f, 0.0f);

result.x = x*_mat.m[0][0]+y*_mat.m[1][0]+z*_mat.m[2][0]+_mat.m[3][0];
result.y = x*_mat.m[0][1]+y*_mat.m[1][1]+z*_mat.m[2][1]+_mat.m[3][1];
result.z = x*_mat.m[0][2]+y*_mat.m[1][2]+z*_mat.m[2][2]+_mat.m[3][2];

最佳答案

我不知道命名空间 abfw 代表什么,但如果它以与 DirectX 相同的方式处理 vector 和矩阵,则必须交换投影和 View 转换:

abfw::Matrix44 view_proj_matrix_ = camera_.GetMatrix(VIEW) * camera_.GetMatrix(PROJ);

关于c++ - 3d 投影到 2d 屏幕坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23690906/

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