3d version,todo:rotate