R中重置网格原点与3D地标问题:原点偏离网格中心
解决方案:在R中同步居中网格与3D地标坐标
你可以通过计算网格的偏移量,同时调整网格顶点和地标坐标的方式解决错位问题,无需重新标注。具体步骤如下:
1. 读取未居中的网格并计算偏移中心
首先读取存在原点偏移的网格,然后计算其场景包围盒(BBox)的中心——这和MeshLab「Centre on Scene BBox」功能的逻辑一致:
library(rgl) library(geomorph) # 读取未居中的网格 uncentred <- read.ply("uncentred.ply") # 计算网格顶点的包围盒范围 bbox <- apply(uncentred$vb[1:3, ], 1, range) # 计算包围盒中心(即需要偏移的量) centre <- (bbox[, 1] + bbox[, 2]) / 2
2. 调整网格顶点实现居中
直接修改网格的顶点坐标,减去计算出的中心值:
# 调整网格顶点坐标(rgl的mesh顶点矩阵前3行是x/y/z) uncentred$vb[1:3, ] <- uncentred$vb[1:3, ] - centre # 可选:保存居中后的网格到本地 write.ply(uncentred, "centred_in_R.ply")
3. 同步调整3D地标坐标
对已标注的地标数据应用相同的偏移量,确保地标与网格对齐:
# 假设Data.train是geomorph格式的三维地标数组(p×3×n,p=地标数,n=样本数) # 对每个样本的地标坐标减去中心值 Data.train_centred <- sweep(Data.train, 2, centre)
4. 验证对齐效果
用rgl可视化验证网格和地标是否正确对齐:
# 绘制居中后的地标 plot3d(Data.train_centred[,,1], aspect = FALSE, size = 10, col = "green") # 绘制居中后的网格 shade3d(uncentred) # 添加参考坐标系 rgl.bbox()
这样操作后,网格和地标会同时以新原点居中,完全匹配MeshLab的居中效果,且不需要重新标注地标。
内容的提问来源于stack exchange,提问作者Erin
相关产品推荐
相关产品推荐

