3d проекция на 2d координаты экрана

Текущий код:

//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 дает одинаковую позицию спрайта.

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_);

это то, что я также использую, чтобы рисовать, поэтому я предполагаю, что это правильно.

используя векторы строк, я верю.

Код преобразования:

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];

1

Решение

Я понятия не имею, что такое пространство имен abfw означает, но если он обрабатывает векторы и матрицы так же, как DirectX, вы должны поменять местами проекцию и просмотреть преобразования:

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

Другие решения


По вопросам рекламы [email protected]