【发布时间】:2018-11-16 08:11:16
【问题描述】:
我用 Haskell OpenGL 绘制了 Barth 六分仪,但出现了问题。我也在 R 中画了它(带有包rgl 和misc3d),没有问题。这两种算法(在 Haskell 和 R 中)非常相似。 Barth sextic 是一个隐式曲面,在 Haskell 中,我使用行进立方体算法计算该曲面的三角剖分,我通过将 misc3d 中的一个转换为 Haskell 和 C。我使用顶点法线,每个法线由梯度定义的隐式方程。
问题来了:
我不想要这些黑色阴影。当我看六分仪的背面时,旋转了 180°,没有这样的阴影:
完整代码可在this Github repo 中找到。以下是与颜色相关的代码部分:
fuchsia :: Color4 GLfloat
fuchsia = Color4 1.00 0.00 1.00 1
discord :: Color4 GLfloat
discord = Color4 0.21 0.22 0.25 1
renderPrimitive Triangles $ mapM_ drawTriangle triangles
swapBuffers
where
drawTriangle ((v1,v2,v3), (n1,n2,n3)) = do
materialDiffuse FrontAndBack $= fuchsia
normal n1
vertex v1
normal n2
vertex v2
normal n3
vertex v3
clearColor $= discord
materialAmbient FrontAndBack $= black
materialDiffuse FrontAndBack $= white
materialEmission FrontAndBack $= black
lighting $= Enabled
lightModelTwoSide $= Enabled
light (Light 0) $= Enabled
position (Light 0) $= Vertex4 0 0 (-1000) 1
ambient (Light 0) $= white
diffuse (Light 0) $= white
specular (Light 0) $= white
我已尝试更改最后一段代码中的颜色,但无法摆脱这些阴影。我对颜色做坏事了吗?我确信法线是正确的,因为这在 R 中有效。但是阴影出现在表面不光滑的地方,所以我想知道问题是否是由法线引起的。
R 渲染:
编辑
我已经设法摆脱了这些阴影:
我真的不知道怎么做的,我做了这么多尝试......但不管怎样,现在的问题是六分仪的背面太轻了:
【问题讨论】:
-
对法线进行颜色调试
-
@Nadir 你是什么意思?
-
不要绘制隐式表面的阴影颜色,而是将颜色输出设置为就好像法线向量是一种颜色一样。
-
问题是表面的真实法线变化太快,粗三角无法重现它们。因此,您可以尝试的一件事是增加 Marching Cubes 分辨率。像这样的尖点对于每个顶点法线来说总是有问题的,因为您无法合理地对它们进行插值。第二种选择是将它们保留为角,并使用单独的法线复制顶点(您对面内的顶点进行一点评估)。
-
这真的很奇怪。当只有一盏灯时,我观察到类似的行为,在 (0,0,0),这是对象的中心。
标签: haskell opengl marching-cubes