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 函数未正确写入顶点颜色的主要内容,如果未能解决你的问题,请参考以下文章