魔方吧 关注:511,245贴子:11,826,795

RubikNotes -- 献给魔友们的一个作图用脚本

只看楼主收藏回复

写了一个用来作图的Python脚本:
https://github.com/fynv/RubikNotes/
以及用它渲染的一个古老版本的Gan's CFOP:
https://fynv.github.io/RubikNotes/CFOPRemade/
详情见:
https://www.bilibili.com/read/cv10637682


IP属地:北京1楼2021-04-05 22:58回复
    试试分段贴。
    由于一个意外的契机,时隔十几年后的今天,我又捡起了魔方(Rubik's Cube)这个玩具,然后发现很多公式都记不起来了,不得不又翻出已经发黄的葵花宝典--Gan's CFOP。

    当年每个魔友手中大概都有这几页纸吧。即使是现在拿出来,我依然很感叹其作图的精美。但是很遗憾的是,大多数普通魔友的手里并没有能快捷地做出这类示意图的软件。在重新熟悉这些公式的过程中,我也意识到,很多公式当时已经被我自己“改”过了,但是除了模糊的记忆,没有留下任何的记录。


    IP属地:北京5楼2021-04-06 13:56
    回复
      作图的需求一直是存在的,就像下围棋需要阅读和制作各种棋谱一样,魔友们也需要类似的介质进行交流和做笔记。但是这方面的软件即使在“魔方相关软件”这个小范围里也是比较少见的,能查到的只有下面这几个。


      IP属地:北京6楼2021-04-06 13:57
      回复
        本文将要介绍的RubikNotes是我刚刚开发的一个基于Python的接口,可以以公式驱动的方式制作出各种魔方图片,代码完全开放,有需要的魔友甚至可以自行扩展。
        脚本地址位于 https://github.com/fynv/RubikNotes
        这个脚本需要Python3.x运行环境,依赖于以下几个库,都可以用pip install来安装:
        numpy: 数学库
        pillow: 图像IO库
        pyglm: 图形学相关的数学库
        VkInline: 我之前开发的一个基于Vulkan的离屏渲染库
        安装完这几个库之后,下载包括RubikNotes.py在内的整个代码库,就可以使用了。由于这个脚本是基于VkInline的,你需要一个支持Vulkan的GPU,这在2021年来说应该也不是特别高的要求吧。


        IP属地:北京7楼2021-04-06 13:58
        回复
          下面通过一个例子来说明如何使用RubikNotes渲染你所需要的魔方图片。
          import glm
          from RubikNotes import RubiksCube, PerspectiveView, TopView
          包含块,glm 用来计算一个观察矩阵,也就是观看魔方的角度,RubiksCube 类维护一个魔方的状态,PerspectiveView类用透视的角度来渲染魔方,TopView类用顶视图渲染魔方。
          cube = RubiksCube()
          cube.exec_seq("x2y2U'DF'BR'LU'D")
          首先创建一个RubiksCube 对象,然后通过exec_seq(),用一个给定的公式来设置魔方的状态。公式中支持RLUDFB这些单层顺时针旋转的符号,带撇号的逆时针旋转符号,小写rludfb旋转两层的符号,xyz x'y'z' 这些整体旋转符号,以及“2”,代表连续旋转两次。为了简单起见,这里不支持 (RUR'U')2 这类的整块重复操作。
          一个可选的参数是reverse=True,代表反向执行公式,这在生成公式图谱的时候非常有用,因为做完公式得到的是“复原态”,那么如果从魔方的默认状态反向执行一个公式,得到的自然是复原前的状态。这里使用的是正向执行的方式。


          IP属地:北京8楼2021-04-06 14:00
          回复
            p_view = PerspectiveView()
            创建一个PerspectiveView对象,参数 fn_skin 可用来指定一个“皮肤”文件,默认值为 "skin_default.png",是一个标准配色的魔方贴图,初始方向为上黄下白左蓝右绿前红后橙。除此之外,代码库还提供了以下几个皮肤:
            skin_debug.png: 带数字编号的贴图,用来Debug。
            skin_f2l.png:顶层9个方块被设成灰色,用来作F2L的示意图。
            skin_ul_only.png:除了最上面的黄色面以外均设成灰色,适合作OLL的示意图
            skin_ul.png:下方两层17个方块被设成灰色,适合作PLL的示意图
            这个脚本允许你用任何图片作为魔方的贴图,通过修改贴图,你可以把魔方调成你习惯用的方向。顺便一提,Up主是习惯于用橙色作为底色的极少数派。。
            原则上,你也可以把女朋友的照片放进去作为魔方的贴图。


            IP属地:北京9楼2021-04-06 14:01
            回复
              p_view.set_camera(512, 512, 45, glm.lookAt(glm.vec3(8.0,6.0,10.0), glm.vec3(0.0,-0.5,0.0), glm.vec3(0.0, 1.0, 0.0)))
              这一行用来设置拍摄魔方的相机。前两个参数是输出图片的长宽,第三个参数fovy=45是相机的视场角(内参数),最后一个参数这里用glm生成一个观察角度:观察点位于(8.0,6.0,10.0),看向(0.0,-0.5,0.0),上方向为(0.0, 1.0, 0.0)。我们的魔方位于(-3,-3,-3) - (3,3,3) 这个范围,这样就正好位于视野中心。
              p_view.render(cube, 'perspective.png')
              这句话执行后,魔方被渲染到'perspective.png'这个图像文件中。


              IP属地:北京10楼2021-04-06 14:01
              回复
                t_view = TopView()
                在顶层OLL和PLL的还原演示中,通常顶视图更加清晰全面,这里创建一个TopView对象来作这类渲染。
                t_view.set_size(512)
                这里设置输出图像的长宽,设计上比较偷懒,要求输出是正方形。
                t_view.render(cube, 'top.png')
                执行渲染,输出到 'top.png'。一个可选的参数是 up_face_only = True。在作PLL的时候,我们只关心顶面的位置和朝向,这个参数帮我们把顶面(黄色)之外的各个面都设为灰色。


                IP属地:北京11楼2021-04-06 14:02
                回复
                  在下面这个网页上,我用RubikNotes重置了所有的经典CFOP公式。
                  https://fynv.github.io/RubikNotes/CFOPRemade/

                  这个版本时间久远,现在应该有更新的了。
                  有了这个工具,魔友们就可以把自己修改过的公式记录下来了。我后续也会贴一些自己改过的公式来和大家分享,今天先写到这里。


                  IP属地:北京12楼2021-04-06 14:02
                  回复

                    免费给你们一个能瞬间生成100多个公式配图的脚本,你们就连理都不理我。小破吧NB,告辞。


                    IP属地:北京13楼2021-04-06 17:23
                    收起回复
                      dd@哀木涕🔥 给他个精


                      IP属地:福建来自手机贴吧14楼2021-04-12 20:03
                      回复
                        哇,非常好哎~已加精


                        星座王
                        点亮12星座印记,去领取
                        活动截止:2100-01-01
                        去徽章馆》
                        IP属地:山东来自Android客户端15楼2021-04-12 21:09
                        回复
                          嗐,是个好帖子,可惜现在贴吧没落,这个吧已经没有多少有热心的活人了。虽然我不会Python,但还是给你点个赞,


                          IP属地:广东16楼2021-04-12 21:56
                          回复
                            dd


                            IP属地:陕西来自Android客户端17楼2021-04-12 22:42
                            回复
                              顶顶楼主!


                              IP属地:江苏来自Android客户端18楼2021-04-13 06:14
                              回复