gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:19:23 25 4
gpt4 key购买 nike

为了演示 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],])

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

enter image description here

下面的矩阵 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)

这给出:

enter image description here

有什么方法可以简化这一点并使其更普遍有用吗?

最佳答案

rgl 中,绘制原始形状时,将颜色应用于顶点,而不是面。通过在顶点处插入颜色来为面着色。

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

它没有真正记录在案,但使用颜色的顺序是前 4 种用于一张脸,然后下 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],])

Screenshot of rendered cube

我建议使用更高的 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)

这给出了这个形状:

sphere

转换为:
A <- matrix(c( 1, 0, 1, 0, 2, 0,  1, 0, 2), 3, 3)
trans <- transform3d(sphere, A)
open3d()
shade3d(trans)

transformed sphere

当然,如果你能旋转它,它看起来会更好。

关于rgl:绘制一个带有彩色面、顶点和线的立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39730889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com