You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rgl包在Shiny的rglWidget中纹理映射异常的解决方法

修复Shiny中rgl纹理球体映射不一致的问题

问题原因

原生RGL设备与rglwidget依赖的WebGL在球面纹理的默认映射规则上存在差异,导致纹理显示错位。以下是具体修复方案:

修复方案1:手动指定纹理坐标

通过自定义球面UV纹理坐标,强制WebGL使用与原生RGL一致的映射逻辑:

library(shiny)
library(rgl)

shinyApp(ui = bootstrapPage(
  rglwidgetOutput("widget")
),
server = function(input, output, session) {
  output$widget <- renderRglwidget({
    try(close3d(), silent = TRUE)
    open3d(useNULL = TRUE)
    
    # 生成匹配原生RGL的球面纹理坐标
    n_long <- 100
    n_lat <- 50
    theta <- seq(0, 2*pi, length.out = n_long)
    phi <- seq(0, pi, length.out = n_lat)
    
    # 构建UV映射:经度对应U轴,纬度对应V轴
    texcoords <- expand.grid(u = theta/(2*pi), v = phi/pi) |> as.matrix()
    
    spheres3d(
      x = 0, y = 0, z = 0,
      radius = 1,
      texture = system.file("textures/sunsleep.png", package = "rgl"),
      alpha = 1,
      texmode = "replace",
      textype = "rgb",
      col = "white",
      texcoords = texcoords  # 启用自定义纹理坐标
    )
    
    rglwidget()
  })
}
)

修复方案2:使用细分网格构建球体

通过subdivision3d生成更精细的球体网格,并手动计算每个顶点的纹理坐标,适配性更强:

library(shiny)
library(rgl)

shinyApp(ui = bootstrapPage(
  rglwidgetOutput("widget")
),
server = function(input, output, session) {
  output$widget <- renderRglwidget({
    try(close3d(), silent = TRUE)
    open3d(useNULL = TRUE)
    
    # 细分立方体得到近似球体
    sphere_mesh <- subdivision3d(cube3d(), depth = 3)
    
    # 计算每个顶点的球面UV坐标
    vertex_coords <- sphere_mesh$vb[1:3, ]
    theta <- atan2(vertex_coords[2, ], vertex_coords[1, ])
    theta[theta < 0] <- theta[theta < 0] + 2*pi
    phi <- acos(vertex_coords[3, ] / sqrt(colSums(vertex_coords^2)))
    
    sphere_mesh$texcoords <- rbind(theta/(2*pi), phi/pi)
    
    # 渲染带纹理的球体
    shade3d(sphere_mesh,
            texture = system.file("textures/sunsleep.png", package = "rgl"),
            alpha = 1,
            texmode = "replace",
            textype = "rgb",
            col = "white")
    
    rglwidget()
  })
}
)

额外注意事项

  1. 先更新rgl到最新版本,避免旧版本的WebGL纹理bug:
    install.packages("rgl")
    
  2. 确保纹理图片路径正确,system.file能正常读取到目标PNG文件。

内容的提问来源于stack exchange,提问作者Ege Can

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:42:38