本文详细记述了,使用Blender创建3D柱状图的过程,来源于
(1/2) Visualize Real-World JSON Data in Blender (3D Chart Animation Nodes Tutorial)
系统:Win10, 版本:Blender 2.83
数据:https://opendata.blender.org/benchmarks/query/?group_by=benchmark点击页面 Download(JSON) 下载,共七条测试数据。下载重命名为opendata.blender_scene_7.json
一.加载数据
- 打开Blender创建新文件,删除默认Cube和Camera。
- 左下面板选择Animation Nodes。New,创建Script Node。
- 右下面板选择Text Editor。 New, 创建My Script。
- 顶部菜单Window-> Toggle System console,调出python控制台。
- 点击Text Editor的运行按钮查看数据。
二.生成AN柱形图
- 创建一个Cylinder。 tab进入Edit mode。调整Median的z为1m。将原点设置为柱子的底部圆心。返回Object mode。
2.1 创建AN Object, Cylinders
- AN中,Node Tree去掉Always,勾选其它三个。
- Script节点,选择My Script.
- 点击New Output,选择Generic List,命名对应脚本的变量data
- 鼠标放在节点红色标题栏上,快捷键W,选择“Create Invoke Node”, 创建Invoke Subprogram节点。
- 创建Object Instancer,连接Data与Instances。再选择Instance下拉框中的Cylinder。勾选“Copy Full Object”, “Deep copy”
2.2 各个柱子,拉开水平距离
- Object Instance上按快捷键w,选择“Loop through Objects”。 同时创建“Invoke Subprogram”, "Loop Input".
- 修改Loop Input中的Objects名为bars。
- 创建Object Transforms Outputs节点。连接它的Object与bars。
- 选中Translation的XYZ.
- 创建Combine Vector。 连接Vector与Location。
- 再在前面创建Math Float, 连接Index。最后将Result连接Combine Vector的X
2.3 高度依据数据变化
- 点击Loop Input中的New Iterator再创建Generic List,再引用循环变量data。
- 连接Invoke Subprogram的Data到Invoke Subprogram的generic List。 在Loop Input中将generic 改名成data
- 创建Get List Element。再按N快捷键,打开右侧菜单,选择Item标签页。Change Type按钮,选择Generic List。然后连接Loop Input的data与Get List Element的List。
- 取数组中的第二个字段对应Scale。再创建一个Convert节点。选择Float类型。连接Element与Old。
- 再创建combine vector, 连接New 到 Z。
- 选中Object Transforms Output的scale Z,再连接Vector 到Scale
这时第二个字段的数值已经体现在柱子的高度方向。但是数值都很大,为了使高度比例谐调,所以都除以一个系数。
- 创建Float Math节点,选择Devide ,系数设置为500 。
- 选择Loop Input ,在右侧菜单中点击New Generator,选择Object List。创建一个Object List,连接它的Object 到 Object Transforms Output的Object
- 创建Shade Object Smooth,连接它的输入Objects到Invoke Subprogram的Object List。
- 隐藏最初创建的Cylinder,同时选中所有其它Cylinder,Shader Smooth。
2.4 创建 Lables
- Shift+A创建一个样本Texts, 设置Paragraph下的Alignment,Horizontal-> Right, Vetical-> Center
- 选中Object Instancer,Shift+D复制一个,然后修改其中的Cylinder为新建的Text
- 再从Get List Length的节点的Length连线到新建的Object Instance的Instances
- 选中Loop Input节点,点New Iterator左边的+,新建一个Iterator,选择设置为Generic List。将它改名为labels.
- 这时Invoke Subprogram节点也相应增加输入端口,并相应修改名称为labels List。连接新建的Object Instancer的Objects到labels List。
- 再复制一个Object Transforms Output节点,选择Rotation Z,清掉Scale Z。设置Rotation Z为90。此时AN已经创建7个Text对象。
- 连接Loop Input的lables到Object Transform Output的Object输入,此时自动建立Convert节点。
- 创建一个Vector Math,选择Add。从Location路径的Combine Vector结点输出的Vector再拉一条线,连接它的A输入端。
- 上面Vector math 的Result输出连接新建的Object Transforms Output结点的Location输入端。设置B的Y为-2.00 .
- 复制Get List Element, 连接Loop Input的data到List。Index设置为0。因为标题字段位于第一个。
- 创建一个Convert节点,连接Element到它的Old,选择Text.
- 创建Text Object Output 节点,插入到Vector Math与Object Transform Output之间。连接Convert的New到它的Text输入。这时标签文本已更新于数据。
2.6 使颜色依照数值变化
- Outliner中选择样本Cylinder。在Properties中选择Data Data Properties。在Vertex Colors中点+,创建Col。
- 增加Set Vertex Color节点,连接第一个Object Transforms Output的Object到它的Object输入端。
- 复制Scale路径的Math节点。将系数设置为1000。再连接前面的to Float Convert节点到它的A输入端。
- 创建Combine Color节点,选择RGB。将Result连接R,再将Color连接Set Vertex Color的Color输入端。
- 切换顶部的标签页Shading,选择Material材料。
- 创建Vertex color,选择Col。
- 创建Separate RGB,连接Image输入和前面的Color。
- 创建ColorRamp,设置前后的颜色范围分别为绿色和红色。 连接Fac和前面的R 。再连接Color输出到Principled BSDF的Base Color输入端。
- Viewport Shading 选择 Material preview mode 。
切换其它的数据集,查看效果。
下载https://opendata.blender.org/benchmarks/query/?device_type=CPU&os=Windows&benchmark=classroom&group_by=device_name,重命名为opendata.blender_CPU_Windows_classroom_groupby_devicename_750.json