[注:提出する前にこれを読み返すと、私はこのQが叙事詩のビットになったことを認識しました。この追求の背後にある理由について私が長い説明をしてくれてありがとう、ありがとう。私は同様のプロジェクトを進める別の人を助ける立場にあったと思うので、質問の背後にある動機を知っていればもっと上に乗ることができます。]最近、これは、Eisenscriptと呼ばれる(ほとんど)文脈自由文法から3Dジオメトリを生成するためのツールです。構造SynthはContext Free Artに触発されています。文脈自由文法は、驚くほど単純なルールセットから素晴らしい結果を生み出すことができます。Pythonで内部DSLとして文脈自由な設計文法を表現するには?
私の現在のStructure Synthワークフローでは、Structure SynthからOBJファイルをエクスポートし、Blenderにインポートし、ライト、マテリアルなどを設定してから、Luxrenderでレンダリングします。残念なことに、これらのOBJファイルをインポートすると、複雑なジオメトリを持つ数千ものオブジェクトが存在することがあるため、Blenderが頻繁に停止することがあります。 Structure Synthは基本的な形だけを生成するので、私は 'かなり'と言っていますが、三角形で表現された球はまだ多くの面を持っています。
したがって、Blenderで構造を直接生成する方が、現在のプロセスよりも望ましいでしょう(BlenderのPythonスクリプティングの深いサポートがこれを可能にするはずです)。インテリジェントなPythonライブラリは、Blenderのインスタンシング能力を使用して、1つのメッシュを使用して無数のオブジェクトを生成し、メモリを節約できます。 Plus Blenderはフル機能の3Dスイートで、CFDGを解釈する能力は、Structure Synthが提供できるものをはるかに超える創造的な可能性を提供します。
私の質問は、Eisenscript文法をPython DSLに変換するにはどのように最善の方法です。ここでは簡単なEisenscriptは次のようになります。説明するために
set maxdepth 2000
{ a 0.9 hue 30 } R1
rule R1 {
{ x 1 rz 3 ry 5 } R1
{ s 1 1 0.1 sat 0.9 } box
}
rule R1 {
{ x 1 rz -3 ry 5 } R1
{ s 1 1 0.1 } box
}
、R1への最初の呼び出し(2行目)は、ランダムにR1の二つの定義のいずれかを呼び出します。 R1の各定義は、R1を(再帰的に)呼び出し(2つの定義のうちの1つをランダムに呼び出す)、ボックスを作成します。再帰が2000年の深さに達した後、最初の行は世代を殺します。
Jeremy Ashkenas(CoffeeScriptの名声)は、ブロックを使用してcontext free DSL in Rubyを実装しました。内部的には、各ルール 'name'のハッシュキーを作成し、そのルールの各定義のブロックを配列に格納します。ルールが呼び出されるときにランダムに選択されます。
以前Eisenscriptルールの定義がそうのようなRubyのDSLに変換します:
rule :r1 do
r1 :x => 1, :rz => 3, :ry => 5
box :s => [1, 1, 0.1], :sat => 0.9
end
rule :r1 do
r1 :x => 1, :rz => -3, :ry => 5
box :s => [1, 1, 0.1]
end
私は初心者のPythonのユーザーだとそうPythonの関数型プログラミング機能のいくつかの研究を行ってきました。ラムダはあまりにもJeremyのRuby DSLに似たものを作成するにはあまりにも制限されているようですが、ラムダは匿名関数の唯一のオプションです
経験豊富なPythonistaがデザインにどのようにアプローチするのでしょうか?
'self.instancemethod'の代わりに' types.MethodType'を使うことができます。また '__dict__'を直接変更するのではなく、' setattr(obj、name、thing) 'を使うべきです。 – JBernardo