最简单的解决方案
在(几乎没有记录的)ILNumerics.Drawing.Shapes 类中,您可以找到 UnitCubeFilled 形状及其线框版本:
private void ilPanel1_Load(object sender, EventArgs e) {
ilpanel1.Scene.Camera.Add(Shapes.UnitCubeFilled);
ilpanel1.Scene.Camera.Add(Shapes.UnitCubeWireframe);
ilpanel1.Scene.First<ILTriangles>().AutoNormals = false;
ilpanel1.Configure();
}
注意,立方体的所有边共享形状中仅有的 8 个顶点。因此,光照法线在所有边缘之间共享和插值,这会导致任何光照看起来不自然。这就是为什么我通过禁用自动法线创建来停用灯光。
您可以轻松地重复使用这些形状 - 它们的存储空间由 ILNumerics 共享。在大型设置中,您可以将其中几个形状放在单独的 ILGroup 节点下。这些组用于相应地重新定位和旋转形状。
高级解决方案
Shapes.UnitCubeFilled 专注于廉价设置。如果您需要侧面的单独颜色或更好的照明,您需要从每个边缘的单独顶点组装立方体。基本上,一个人会做什么:
- 从全新的
ILTriangles 形状开始
- 给它 24 个顶点:每边 4 个
- 创建 24 个颜色条目,并为侧面提供单独的颜色信息
一个简单的例子如下所示:
这是正面和右侧的代码。其他方面留作练习... ;)
ilpanel1.Scene.Camera.Add(new ILTriangles("tri")
{
Positions = new float[,] {
// front side
{0,0,0},{1,0,0},{1,1,0},
{0,0,0},{1,1,0},{0,1,0},
// right side
{1,0,0},{1,0,-1},{1,1,-1},
{1,0,0},{1,1,-1},{1,1,0},
},
Colors = new float[,] {
// front side
{0,0,1},{0,0,1},{0,0,1},
{0,0,1},{0,0,1},{0,0,1},
// right side
{0,1,0},{0,1,0},{0,1,0},
{0,1,0},{0,1,0},{0,1,0},
}
});
ilpanel1.Configure();