R:rgl 包的 writePLY 函数未正确写入顶点颜色

Posted

技术标签:

【中文标题】R:rgl 包的 writePLY 函数未正确写入顶点颜色【英文标题】:R: rgl package's writePLY function not writing Vertex Colors correctly 【发布时间】:2017-01-07 10:27:08 【问题描述】:

这是一个有趣的练习,它使用 rgl 包绘制 3D 参数化苹果,并将生成的网格写入文件。该对象在“RGL 设备”窗口中正确显示颜色(参见下面的屏幕截图)。但是,当我尝试使用 Blender 打开生成的 .PLY 文件时,颜色显示不正确(meshlab 也不起作用)。

问题:如何修复代码以便将苹果的颜色正确导入搅拌机。

下面这个例子在屏幕上生成了一个苹果对象,以及一个“.ply”

require(rgl)
require(plot3D)

M  <- mesh(seq(-pi, pi, length.out = 200),
           seq(-0.8*pi, pi, length.out = 170))
u  <- M$x
v  <- M$y
R1 <- 4
R2 <- 4
# Apple parametric Equation from http://www.econym.demon.co.uk/isotut/real.htm
x <- cos(u)*(R1 + R2*cos(v)) + ((v/pi)^100)
y <- sin(u)*(R1 + R2*cos(v)) + 0.25*cos(5*u)
z <- - 2.3*log(1 - v*0.3157) + 6*sin(v) +2*cos(v)
zlim <- range(z)
zlen <- zlim[2] - zlim[1] + 1
colorlut <- rainbow(zlen)
col <- colorlut[ z - zlim[1] + 1 ]
surface3d(x, y, z, col=col, smooth=TRUE)
writePLY('apple_v07.ply',
         pointRadius = 0.005, pointShape = icosahedron3d(),
         withColors=TRUE)

【问题讨论】:

我试图找到一个可以导入到 Blender 中的带有颜色的 .ply 文件示例,但我找不到。你知道一个有效的例子吗?然后我们可以将它的作用与rgl 的作用进行比较。 我现在找到了一个例子(在blender.stackexchange.com/questions/36783/… 的评论中)。查看苹果时我没有得到全部颜色,但如果我缩小它(通过将 200 x 170 网格缩小到 20 x 17):所以我怀疑问题出在导入而不是导出文件。 您是否有任何证据表明问题出在rgl 生成的文件中,而不是在导入它的代码中? 【参考方案1】:

我发现 writePLY 错误地将顶点颜色声明为浮点,而实际上它输出的是 uchar(无符号字节整数)。

输出为 ASCII 并将四种颜色定义(包括 alpha)更改为 uchar 并解决问题。 请看下面的图片链接:

enter image description here

【讨论】:

你能提供你提议的解决方案的代码吗? 嗯,这是手动编辑,我还没有修改 writePLY 函数(这将是解决方案),但这里有一个示例:原始输出:ply format ascii 1.0 element vertex 1196667 property float x 属性 float y 属性 float z 属性 float red 属性 float green 属性 float blue 属性 float alpha 属性 float nx 属性 float ny 属性 float nz 元素面 398889 property list int int vertex_indices end_header 更正输出:ply ... property uchar red property uchar green属性 uchar blue 属性 uchar alpha 抱歉,cmets 不能用换行符格式化。

以上是关于R:rgl 包的 writePLY 函数未正确写入顶点颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 rgl R 包的 plot3d 函数生成的 3D 图上使众多组易于区分

R:将rgl小部件组合并保存为单个html文件

R rgl text3d() 工件块对象并更改绘图范围

如何在 R 包中正确使用其他包中的函数

使用 Mac OS X 加载 rgl 包时出错

如何导出交互式 rgl 3D 绘图以共享或发布?