opengl 如何用rgl得到一个暗哑和阴影的网格?

slmsl1lt  于 2023-02-22  发布在  其他
关注(0)|答案(1)|浏览(134)

下面是Barth六次曲面的两个网格,第一个是用R软件包rgl得到的,比较有光泽,几乎没有阴影,第二个是用Haskell软件包OpenGL得到的,比较暗淡,有阴影。

我想知道如何用rgl获得类似于Haskell的渲染?据我所知,这两个库都是openGL的 Package 器,所以这应该是可能的。

# isosurface f=0
phi <- (1 + sqrt(5)) / 2
f <- function(x, y, z){
  4 * (phi^2*x^2 - y^2) * (phi^2*y^2 - z^2) * (phi^2*z^2 - x^2) - 
    (1 + 2*phi) * (x^2 + y^2 + z^2 - 1)^2
}
# make the isosurface
nx <- 220L; ny <- 220L; nz <- 220L
x <- seq(-1.8, 1.8, length.out = nx) 
y <- seq(-1.8, 1.8, length.out = ny)
z <- seq(-1.8, 1.8, length.out = nz) 
Grid <- expand.grid(X = x, Y = y, Z = z)
voxel <- array(with(Grid, f(X, Y, Z)), dim = c(nx, ny, nz))
mask  <- array(with(Grid, X^2 + Y^2 + Z^2 > 3), dim = c(nx, ny, nz))
voxel[mask] <- -1000
library(rmarchingcubes)
cont <- contour3d(voxel, level = 0, x = x, y = y, z = z)
# plot
library(rgl)
mesh <- tmesh3d(
  vertices = t(cont[["vertices"]]),
  indices  = t(cont[["triangles"]]),
  normals  = cont[["normals"]],
  homogeneous = FALSE
)
#
open3d(windowRect = c(50, 50, 562, 562), zoom = 0.65)
shade3d(mesh, color = "#ff00ff")

Haskell场景中的(唯一)灯光位于(-50,100,100),颜色为环境光=黑色、漫反射=白色、镜面反射=白色。

zed5wv10

zed5wv101#

我想我明白了。首先要清除默认的灯光,然后添加一个像Haskell场景中的灯光。我还将网格的高光颜色设置为黑色。

open3d(windowRect = c(50, 50, 562, 562), zoom = 0.65)
clear3d(type = "lights")
light3d(x = -50, y = 100, z = 100, ambient = "black")
shade3d(mesh, color = "#ff00ff", specular = "black")

相关问题