🧊

Clojure nREPL で Blender を操作できる Basilisp Blender を試してみた。

に公開

Blender Python API

御存知の方も多いと思いますが、Blender には 公式の SDK として Python 製の bpy というものがあります。
https://docs.blender.org/api/current/info_overview.html

Basilisp (Python 上で動く Clojure 処理系)

で、こっちはほとんど誰も知らないと思いますが、Python 上で動く Clojure 処理系で Basilisp というものがあります。(私も知りませんでした。さすがユーザ数よりも処理系が多いと言われる Lisp。と思いましたが、Clojure の仕様に準拠しているのは珍しいかも)
https://github.com/basilisp-lang/basilisp

Basilisp Blender Extension

そんな Basilisp を使って bpy を呼ぶ、Basilip Blender Extension というアドオンを作成された方がいて、おもしろそうだったので試してみました。
https://github.com/ikappaki/basilisp-blender

試した動画

画面左が Blender (v4.5.3)、画面右上がエディタ(helix)、画面右下がターミナルです。
https://youtu.be/W7GQU8eZkXY?si=P7KjTh-GeuN4DOvL

nREPL でコードを実行しています。Emacs CIDER とか使えば、エディタだけで動かせると思います。
私は Emacs は使わないので、$ lein repl :connect で nREPL に接続して、tmux を使ってターミナルにコードを送っています

使い方

インストール

Basilip Blender の releases ページから、最新の basilisp_blender_extension-x.x.x.zip をダウンロードします。

その後、Blender の プリファレンスで、エクステンションを入手ディスクからインストール を押下し、先ほどダウンロードした zip ファイルを選択します。

アドオンで Basilisp Blender Extension が有効になっていることを確認します。

そうすると、出力パネルの最下部に Basilisp nREPL server というのが表示されます。
serverport とフォルダ先を指定します。.blend ファイルを置いているフォルダと同じでいいと思います。(フォルダ先には、basilisp.ednscratch.lpy ファイルが自動で追加されます。)
START SERVER を押下すると、nREPL サーバが起動します。

nREPL クライアントの起動

ターミナルで以下を実行して接続します。

$ lein repl :connect 64644

なんか、ワーニングっぽいのがいろいろ出ますが普通に使えます。

コードの実行

上記動画で試したコードです。
どんなことができるかまだよくわかっていないですが、(dir bpy.ops/mesh) とかを使って調べれるのでぼちぼち調べていこうと思います。

(ns bpy-test
  (:import bpy
           math))

(dir bpy)
(dir bpy/ops)
(dir bpy.ops/action)

(defn clear-mesh-objects []
  (.select-all     bpy.ops/object ** :action "DESELECT")
  (.select-by-type bpy.ops/object ** :type "MESH")
  (.delete         bpy.ops/object))


(clear-mesh-objects)

(->> (dir bpy.ops/mesh)
     (filter #(re-find #"add" %))
     (map prn))

(.primitive-monkey-add bpy.ops/mesh)


(for [x [-3 0 3]]
  (.primitive-cube-add bpy.ops/mesh **
    :location [x 2 2]))

以上です。

Discussion