rgl:绘制带有彩色面,顶点和线的立方体

use*_*089 4 r linear-algebra rgl

为了演示3D中线性变换的效果x -> A x,我想绘制一个立方体并在其下显示其变换A.为此,我需要分别为每个面着色,还要显示顶点和每个面的轮廓线.

我无法弄清楚如何为面部使用不同的颜色,以及如何使这更加通用,所以我不必重复转换结果的所有步骤.

我试过的:

library(rgl)
c3d <- cube3d(color=rainbow(6), alpha=0.5)
open3d()
shade3d(c3d)
points3d(t(c3d$vb), size=5)
for (i in 1:6)
    lines3d(t(c3d$vb)[c3d$ib[,i],])
Run Code Online (Sandbox Code Playgroud)

这给出了下面的图像.但我不明白脸是如何着色的.并且,我似乎必须使用points3d和形状lines3d的组件c3d,并没有我可以转换的单个对象.

在此输入图像描述

A下面的矩阵给出了一个特殊的变换,这是我如何将它添加到场景中,

A <- matrix(c( 1, 0, 1, 0, 2, 0,  1, 0, 2), 3, 3)
c3d_trans <- transform3d(c3d, A) 
shade3d( c3d_trans )
points3d(t(c3d_trans$vb), size=5)
Run Code Online (Sandbox Code Playgroud)

这给出了:

在此输入图像描述

有没有办法简化这个并使它更普遍有用?

use*_*330 6

rgl绘制基本形状时,将颜色应用于顶点而不是面.通过在顶点处插入颜色来对面进行着色.

但是,cube3d()它不是原始形状,而是"网格".它被绘制为6个单独的四边形.每个顶点使用3次.

它没有真正记录,但颜色的使用顺序是前4个用于一个面,然后下一个用于下一个面,等等.如果你想要你的颜色rainbow(6),你需要复制每种颜色4次:

library(rgl)
c3d <- cube3d(color=rep(rainbow(6), each = 4), alpha = 0.5)
open3d()
shade3d(c3d)
points3d(t(c3d$vb), size = 5)
for (i in 1:6)
    lines3d(t(c3d$vb)[c3d$ib[,i],])
Run Code Online (Sandbox Code Playgroud)

渲染立方体的截图

我建议更高的alpha价值; 我发现透明度有点令人困惑alpha = 0.5.

顺便说一下,出于同样的目的,我通常使用看起来更加球形的形状作为基线; 我认为它提供了更好的转型直觉.这是我用过的代码:

sphere <- subdivision3d(cube3d(color=rep(rainbow(6),rep(4*4^4,6)), alpha=0.9),
    depth=4)
sphere$vb[4,] <- apply(sphere$vb[1:3,], 2, function(x) sqrt(sum(x^2)))
open3d()
shade3d(sphere)
Run Code Online (Sandbox Code Playgroud)

这给了这个形状:

球

转变为:

A <- matrix(c( 1, 0, 1, 0, 2, 0,  1, 0, 2), 3, 3)
trans <- transform3d(sphere, A)
open3d()
shade3d(trans)
Run Code Online (Sandbox Code Playgroud)

变形球体

当然,如果你可以旋转它看起来更好.