概述
![](https://pic4.zhimg.com/80/v2-c6f8d6709975cc38fa877be5052fb0b7_720w.jpg)
很多人喜欢乐高积木,但是苦于囊中羞涩,媳妇不给钱买,怎么办呢?不要愁!虫虫今天给大家介绍一个很有意思的项目brickr,利用它我们可以利用R语言编程来玩乐高积木,学习游戏两不误,何乐而不为呢?
brickr是基于R tidyverse和rayshader包来创建LEGO 2D和3D模型的工具包。利用它我们可以:
将图像文件转换为2D和3D LEGO马赛克
从简单的数据框架构建3D乐高模型
安装
必备软件和包:
必须安装Rgui(或RStudio),Rtools,基本依赖包devtools,tidyverse,rayshader,dplyr等。
R和Rtools必须下载二进制安装包安装。
依赖包的安装方法很简单直接利用install.packages(”XXX”)
安装brickr
安装brickr要利用devtools从github库安装,安装方法如下:
devtools::install_githu(”ryantimpe/brickr”)
基本使用
3D建模
3D模型可以用两种方法构建:bricks_from_table函数和或bricks_from_coords函数。
bricks_from_table():将矩阵数组转换为乐高积木。对于简单模型,可以通过data.frame()或tibble::tribble()函数手动构建。对于更高级的模型,建议可以通过Excel或.csv文件导入数据。导入的表格数据中最左侧的列与模型的Level或z轴相关联。默认情况下,该功能会将此值转换为数字。其他列是x坐标,每行是y坐标。
bricks_from_coords():则使用用带有x,y和z整数值以及颜色列的数据框,其中x,y和z的每个组合都是三维空间中的一个点。颜色必须是display_colors()列出的官方乐高颜色名称。这种方法比bricks_from_table函数更灵活,还允许进行3D模型的编程开发。
将任何brick_from _*()函数的输出传递给display_bricks()就可以查看其3D模型图。从一个简单例子开始:
![](https://pic4.zhimg.com/80/v2-a045e33d130beddd179cb89cfe2c686f_720w.jpg)
结果:
![](https://pic3.zhimg.com/80/v2-1badcb1a6f2828e2a3e6221329454f26_720w.jpg)
打印这个图
![](https://pic1.zhimg.com/80/v2-6c4bb1aa1254e4489c85103709f6089c_720w.jpg)
![](https://pic4.zhimg.com/80/v2-6736a455bf42d1a00ff0d37e146e27e7_720w.jpg)
上色
有两种方法给brickr上色。display_colors()可以列出,支持的颜色标识ID和名称:
![](https://pic3.zhimg.com/80/v2-98180107d034b24c2c685fe292e5b226_720w.jpg)
在模型输入表中使用brickrID值而不是”1″。值”0″表示空值。
创建颜色分配表并将其传递给bricks_from_table()即可,比如:
![](https://pic1.zhimg.com/80/v2-2e04bb46b9698985f5acdb622c374164_720w.jpg)
结果显示:
![](https://pic2.zhimg.com/80/v2-a4ef7a8b55e105ac73e97bfe3b752c49_720w.jpg)
堆积
输入数组的Level列确定砖块的高度。bricks_from_table()会将字母数字级别转换为z坐标。
![](https://pic2.zhimg.com/80/v2-057d183dd48e1e0a826a03d749ec3ce5_720w.jpg)
结果:
![](https://pic3.zhimg.com/80/v2-0ea0e51635fc3eb369cbef07fb2b9936_720w.jpg)
同理,我们可叠更多的层,不同的层使用不同的颜色
![](https://pic1.zhimg.com/80/v2-4c0917174adfefb971acf9006d0c2cf4_720w.jpg)
结果如下:
![](https://pic2.zhimg.com/80/v2-b3f46464ee81fc0398525cf92530ff0d_720w.jpg)
一个比较的模型
对于较大的模型,可以使用tibble::tribble(),从而更轻松地显示模型。如果在大一点的模型就需要从外部文件(exce)导入数据了。下面是一个使用tibble::tribble()的实例:
![](https://pic3.zhimg.com/80/v2-664d225e941e52dac2cc6a8b450c49be_720w.jpg)
结果显示如下:
![](https://pic2.zhimg.com/80/v2-2b786343e5fd34e83dec51c37b7b1a11_720w.jpg)
以编程方式构建模型
使用bricks_from_coords()以编程方式构建3D LEGO模型,而不是通过表格手动绘。使用该函数,必须要提供x,y和z的坐标数组,以及每个点的颜色名称。比如:
![](https://pic1.zhimg.com/80/v2-8966bfb7042edecdedc37ed4ff49b118_720w.jpg)
结果如下:
![](https://pic1.zhimg.com/80/v2-1bc27126af9df5875fcdbc5774046408_720w.jpg)
马赛克
马赛克功能可以对导入的JPG或PNG图像文件用乐高颜色和brick渲染生成2D和3D的马赛克拼图。我们以最近流行的苏大强表情为原始图进行处理:
原始图:
![](https://pic1.zhimg.com/80/v2-fc58be0ce0d0560da8ee57f1d069d5d0_720w.jpg)
对原始图做渲染处理,渲染出蒙太奇拼图效果
mosaic1 <- jpeg::readJPEG(“sdq.jpg”) %>%
image_to_bricks(img_size = 148)
mosaic1 %>% display_set()
显示效果图如下:
![](https://pic4.zhimg.com/80/v2-f09725228d8f11f7fd5aedf867c406a7_720w.jpg)
分辨率太高显示不出拼图效果来,我们把分辨率调小:
mosaic1 <- jpeg::readJPEG(“sdq.jpg”) %>%
scale_image(img_size = 48) %>%
legoize() %>%
collect_bricks()
效果如下:
![](https://pic4.zhimg.com/80/v2-6fe3f1fceea7a42323c1090f675d8657_720w.jpg)
2D马赛克
image_to_brick函数可以参数设置如下:
img_size: 单个值(例如148)表示图像裁剪为正方形;2元素阵列c(56,48)将输出宽度*高度的矩形图像。
color_table:马赛克中可能的拼块颜色的数据框。默认为包含的数据集lego_colors。
brightness:大于1的值将使图像变亮,而小于1的值将使图像变暗。
display_set(): 引入的ggplot图像。
3D马赛克
另外两个函数可以以使用rayshader包将image_to_bricks数据输出转换为3D马赛克:
collect_3d(): 将2D LEGO马赛克转换为两个矩阵:一个用于彩色图像,另一个用于图像上每个点的高度。默认情况下,生成的图像具有6个LEGO板(2个LEGO砖)的高度,颜色较浅,具有较高的高度。可以使用mosaic_height设置马赛克的高度,通过highest_el =’dark’设置最高的砖块以较暗的颜色。
display_3d: 调用rayshader::plot_3d(),但是从collect_3d的输出中提取山体阴影和高程矩阵并修复一些参数。更详细信息参考rayshader::plot_3d()的官方文档。比如:
library(rayshader)
mosaic1 %>%
collect_3d() %>%
display_3d(fov=0,theta=-20,phi=30,windowsize=c(1000,800),zoom=0.7)
render_snapshot()
3D拼图效果如下:
![](https://pic3.zhimg.com/80/v2-107c68ed3bc7807c726ec8137c1afd92_720w.jpg)
乐高马赛克IRL
该项目还支持,建立乐高马赛克拼图过程图集。具体功能介绍如下:
使用generate_instructions()将LEGO马赛克图像分解为更易于阅读的构建集合的步骤。默认为6步,具体步骤可以通过整数参数设置。
mosaic1 %>% generate_instructions(9)
![](https://pic1.zhimg.com/80/v2-33190802267637f7d44851e2eedec86c_720w.jpg)
实需部件计数
当然brickr实际上不是一个纯指上谈兵的项目,而是一个可以线下实操的项目,项目可以这些提供功能,包括display_piece和table_pieces函数。
使用display_pieces()函数可以生成所有必需的插图块的形状和数量。这些按颜色和大小排序,可以适用男高级搜索选项在乐高官网的Pick-a-Brick购买,当然前提是你必须先让媳妇批准你的预算。也可以使用table_pieces()生成所有必需砖块的数据框表。
mosaic1 %>% display_pieces()
![](https://pic3.zhimg.com/80/v2-f2a5565e45b533d8cbe831a99a118102_720w.jpg)
mosaic1 %>% table_pieces()
![](https://pic2.zhimg.com/80/v2-53b55ba0a5df491d9b668a71c77a4885_720w.jpg)
怎么样,少年?是不是心动了,那就赶紧整一个,拼呗。什么?没钱!那好吧,今天的内容就到这里,欢迎关注虫虫。