Fixed the issue. Turns out it was a Gazebo sim bug: camera_info follows the REP 103 standard, but point cloud generation in Gazebo sim doesn’t.
There are two possible approaches:
1. Use a additional frame to make it align with rep 103
2. Use depth_image_proc(i chose this one)
Okay i don't understand why this is happening, i set the camera according to rep 103(z forward[points to the scene], x right, y down)