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

如何在rgl包中使用球体以外的点形状绘制3D投影点?

在rgl中为3D点设置自定义形状实现投影可视化

我想用rgl展示10³立方体顶点的3D形态及其2D投影,以此解释投影概念。2D绘图中已用4种颜色(红、蓝、深绿、棕)和4种pch形状(正方形、圆形、三角形、菱形)区分顶点,但在rgl的3D绘图里,使用type="s"时pch参数无效,只能显示球体,希望替换成立方体、球体、金字塔、菱形这类3D形状。

现有代码

生成立方体顶点及投影数据

vals <- c(0, 10)
X <- expand.grid(x1 = vals, x2=vals, x3=vals) |> as.matrix()

# 正交投影到x1-x2平面
P1 <- rbind(diag(2), c(0,0))
Y1 <- X %*% P1
# 斜投影
P2 <- matrix(c(0.71, 0.71, 0, -0.42, .42, 0.84), ncol=2)
Y2 <- X %*% P2

2D绘图代码

pch <- rep(15:18, 2)
colors <- c("red", "blue", "darkgreen", "brown")
col <- rep(colors, each = 2)

plot(Y1, cex = 3, 
     pch = pch, col = col,
     xlab = "Y[,1]", ylab = "Y[,2]",
     xlim = c(-1, 11), ylim = c(-1, 11))

plot(Y2, cex = 3, 
     pch = pch, col = col,
     xlab = "Y[,1]", ylab = "Y[,2]",
     xlim = c(-1, 15), ylim = c(-5, 14)
     )

尝试的rgl代码(仅能显示球体)

library(rgl)
open3d()
plot3d(X, type = "s", size = 2,  pch = pch, col = col)

解决方案

rgl的plot3d()函数中,type="s"仅支持球体,pch参数在此模式下不生效。要实现自定义3D形状,需要逐个顶点绘制对应的3D几何体,利用rgl提供的cube3d()、sphere3d()、tetrahedron3d()(金字塔)、octahedron3d()(近似菱形的3D形状)等函数,结合循环为每个顶点匹配对应形状。

实现代码

library(rgl)

# 定义pch到3D形状的映射
shape_map <- list(
  15 = cube3d(),       # 对应2D的正方形
  16 = sphere3d(),     # 对应2D的圆形
  17 = tetrahedron3d(),# 对应2D的三角形(金字塔)
  18 = octahedron3d()  # 对应2D的菱形(八面体)
)

open3d()
# 循环每个顶点,绘制对应形状
for (i in 1:nrow(X)) {
  # 获取当前点的形状、颜色和位置
  shape <- shape_map[[as.character(pch[i])]]
  # 缩放形状大小,调整位置,设置颜色
  shade3d(translate3d(scale3d(shape, 0.8, 0.8, 0.8), 
                      X[i,1], X[i,2], X[i,3]), 
          col = col[i])
}

# 添加坐标轴标签
axes3d()
title3d(xlab = "x1", ylab = "x2", zlab = "x3")

关键说明

  • scale3d():调整3D形状的大小,避免过大遮挡其他顶点;
  • translate3d():将形状移动到对应顶点的坐标位置;
  • shade3d():渲染带填充颜色的3D形状;
  • 可根据需求替换shape_map中的几何体,比如icosahedron3d()等其他rgl支持的3D模型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:07:41