问题描述
我尝试创建一个看起来像圆柱体的 3D 网格,然后将其切成两半,如下所示:
library(rgl)
library(Morpho)
xpos = c(-500,500)
ypos = c(0,0)
zpos = c(-200,-200)
rad = 50
cylinder = cylinder3d(center = cbind(xpos,ypos,zpos),radius = rad,sides = 100)
plot3d(cylinder,axes = FALSE,xlab = "",ylab = "",zlab ="")
upperHalf = cutMeshPlane(cylinder,v1 = c(0,-200),normal = c(0,1),keep.upper = TRUE)
plot3d(t(upperHalf$vb),zlab ="")
plot3d(upperHalf) #this produces an error: index out of bounds
第一幅图显示了圆柱体,红线表示我想沿其切割圆柱体的平面。
第二个图显示了使用 cutMeshPlane
沿 z 轴分离圆柱后的角坐标。根据需要,只剩下上半部分。
但是,我无法绘制代表半个圆柱体的新 3d 网格。我相信 cylinder$ib
的顶点索引没有在 upperHalf$ib
中更新,这就是原因。但是,我无法弄清楚如何解决此问题或使用剩余坐标创建新的 3d 网格。非常感谢帮助!
解决方法
Morpho::cutMeshPlane
函数需要由三角形组成的网格,但您的网格由四边形组成。最简单的解决方法是改用 rgl::clipMesh3d
:
upperHalfrgl <- clipMesh3d(cylinder,"z",-200)
plot3d(upperHalfrgl,axes = FALSE,xlab = "",ylab = "",zlab ="")
您也可以使用内部 rgl
函数 rgl:::as.tmesh3d
将网格转换为三角形,但使用内部函数存在风险。
我刚刚更新了 cutMeshPlane
以处理四边形网格。我用你的例子进行了测试(见下文)
您可以使用 devtools::install_github("zarquon42b/Morpho")