Bu Nasıl Çalışır? #
Bu belge, 3ds Max sahnesini Arnold sahnesine çeviren çevirici olan MAXtoA’nın belirli nesne türlerini çevirirken kullandığı bir yöntemi açıklamaktadır. Bu yöntem, üçüncü taraf geliştiricilere veya hatta kullanıcılara, gölgelendirici olmayan Arnold düğümleri etrafında güzel bir özel kullanıcı arayüzüne sahip hoş 3ds Max “sarmalayıcıları” oluşturmanın basit bir yolunu sunar . Arnold gölgelendiricileri için kullanıcı arayüzünü özelleştirmek için, çok daha gelişmiş, Qt tabanlı farklı bir işlevsellik mevcuttur.
MaxScript “Betik Tabanlı Eklentiler” #
3ds Max’te herkes “komut dosyası tabanlı eklenti” yazabilir. Bunlar, tüm gerçek işi tamamen komut dosyasıyla yapan tam teşekküllü eklentiler olabileceği gibi, mevcut eklentilerin etrafında çok hafif “sarmalayıcılar” da olabilirler. Sadece mevcut altta yatan işlevselliğin kullanıcı arayüzünü değiştirirler.
Bunu MAXtoA’da kullanıyoruz. Belirli özel adlandırılmış parametreleri ortaya çıkaran bir eklenti yazarak, MAXtoA çeviricisi bu parametrelerle etkileşime girer ve yalnızca parametrelere, adlarına ve değerlerine dayalı bir çeviri görevi gerçekleştirir. MAXtoA, eklentinin “iç yapısını” tamamen göz ardı eder; eğer eklenti boş bir kukla ise veya mevcut bir 3ds Max sınıfının etrafına “sarmalanmış”sa.
3ds Max’in kendisi (veya diğer render motorları) içteki (sarmalanmış) sınıfı “görür” ve bu, görünüm pencerelerinde görünen veya değiştirici yığınında vb. işlev gören şey olur; oysa MAXtoA ve dolayısıyla Arnold render motoru yalnızca özel parametrelere tepki verir, belirli bir Arnold düğümünü örneklendirir ve parametrelerini buna göre ayarlar.
Neler Uzatılabilir? #
MAXtoA’daki her şey henüz bu şekilde genişletilemiyor. Şu anda üç şey çalışıyor:
- Geometri: Herhangi bir betik tabanlı geometri eklentisi, herhangi bir Arnold şekil düğümüne dönüştürülebilir.
- Kameralar: Senaryoya göre oluşturulmuş bir kamera, herhangi bir Arnold kamera düğümüne dönüştürülebilir.
- Işıklara Uygulanan Değiştiriciler: Arnold ışığına uygulanan komut dosyası tabanlı bir değiştirici, herhangi bir Arnold ışık filtresi düğümüne dönüştürülebilir.
Bunlarla, Arnold’a entegre edilmiş olsun ya da üçüncü taraf bir eklenti DLL’sinden gelsin, herhangi bir Arnold şekil, kamera veya ışık filtresi düğümünü 3ds Max’te çalıştırmak ve neredeyse her şeyi yapmak mümkün olmalıdır.
Parametre Düzeni ve Adlandırması #
Tüm süreç son derece basit; betik tabanlı eklenti, belirli bir adlandırma kuralı kullanarak parametreleri ortaya koyuyor ve MAXtoA bu adlandırma kuralına göre hareket ederek çeviriyi gerçekleştiriyor.
“Özel” parametre adları şunlardır:
- arnold_node: MaxScript türünde #string olmalı ve bu belirli komut dosyası için örneklendirilecek Arnold düğümünün adını içermelidir.
- arnold_node_xxx : Bu , Arnold düğümünde xxx parametresini ayarlamanın yoludur . Yani, “arnold_node_” önekinden sonra gelen her şey parametre adı olarak kabul edilir. Komut dosyası eklentileri parametre bloğundaki türün, Arnold düğümünün beklediği türle eşleştiğinden emin olun!
- arnold_link_xxx : Bu , Arnold düğümündeki bir shader’a (3ds Max’te doku haritası) bağlantı olarak xxx parametresini ayarlamanın yoludur . Yani, “arnold_link_” önekini takip eden her şey Arnold düğümündeki parametre adı olarak kabul edilir. MaxScript türünde #texturemap olmalıdır . MAXtoA, Arnold tarafında shader düğümü oluşturma ve parametre atamasını üstlenir ve çevrilmiş shader’ı Arnold düğümündeki parametreye (burada arnold_node olarak tanımlanmıştır) bağlar.
- arnold_decl_xxx : Kullanıcı parametre türleri için, kullanılmadan önce bildirilmeleri gerekir . “arnold_decl_” önekini takip eden her şey parametre adı olarak kabul edilir. Parametrenin kendisi MaxScript türünde #string olmalı ve bir Arnold parametre bildirim dizesi içermelidir; örneğin, bir ondalık sayı değeri için “constant FLOAT”. Arnold 5.0’da bu nadiren gereklidir.
Parametrelerin yukarıdan aşağıya doğru “kullanıldığını” ve bildirimlerin kullanımdan önce gelmesi gerektiğini unutmayın.
Kod Örnekleri #
Basit Örnek: Küresel Kamera Eklentisi #
Bu işlem, Arnold kategorisinde “Spherical Cam” adında yeni bir kamera oluşturur ve Arnold “spherical_camera” düğümünü etkinleştirir. Ayarlanacak herhangi bir parametre yoktur.
plugin Camera arnold_spherical_camera
extends:FreeCamera
name:"Spherical Cam"
classID:#(135251,542126)
category:"Arnold"
replaceUI:true
(
parameters main rollout:params
(
arnold_node type:#string default:"spherical_camera"
)
rollout params "Nothing to see here"
(
)
)
Biraz Daha Detaylı Örnek: Bir Küre Eklentisi #
Aşağıdaki betik eklentisi, “Arnold” kategorisinde “Küre” adında yeni bir geometri türü oluşturacaktır. Bu eklenti, 3ds Max’in yerleşik küresini sararak (genişleterek) görünüm penceresinde bu şekilde görünmesini sağlar. Ancak Arnold, render işlemi sırasında matematiksel olarak tam “küre” şekil düğümünü alacaktır.
Kodun karmaşıklığının büyük kısmının, fareyle oluşturmak istediğimiz ve Arnold nesnesini tanımlayan parametreyle senkronize tutmak istediğimiz gerçek küre nesnesini sarmalamamızdan kaynaklandığını unutmayın. Sarmalanmış nesneyi tamamen göz ardı etseydik çok daha basit bir kod yazılabilirdi; açılır menüdeki kullanıcı arayüzünü doğrudan Arnold stil parametrelerine uygulanacak şekilde ayarlayabilirdik, bu da updateArnold() fonksiyonuna gerek kalmayacağı ve sadece birkaç satır olabileceği anlamına gelirdi:
İşte Sphere eklentisinin tam kodu:
plugin Geometry Arnold_Sphere
name:"Sphere"
classID:#(0xf00df103, 0xc55744a1)
category:"Arnold"
extends:Sphere
replaceUI:true
(
local lastSize, meshObj
parameters pblock rollout:params
(
arnold_node type:#string default:"sphere"
arnold_node_radius type:#float default:1.0
arnold_node_center type:#point3 default:[0.0,0.0,0.0]
radius type:#float animatable:true ui:radius default:1.0
)
fn fmax val1 val2 = if val1 > val2 then val1 else val2
fn updateArnold =
(
-- Modify the Arnold Sphere
arnold_node_radius = delegate.radius
)
tool create
(
on mousePoint click do
case click of
(
1: nodeTM.translation = gridPoint
2: #stop
)
on mouseMove click do
(
if click == 2 then (
radius = delegate.radius = fmax (abs gridDist.x) (abs gridDist.y)
updateArnold()
)
)
)
rollout params "Sphere Parameters"
(
Spinner radius "Radius:" range:[0, 1e9, 1]
on radius changed val do (
delegate.radius = val
updateArnold()
)
)
)
Önemli Kısım #
Buradaki asıl önemli nokta parametre bildirimi, yani şu birkaç satır.
arnold_node type:#string default:"sphere"
arnold_node_radius type:#float default:1.0
arnold_node_center type:#point3 default:[0.0,0.0,0.0]
Bu satırlar şunu söylüyor: “Beni gördüğünüzde, ‘küre’ adında bir düğüm oluşturun ve ‘yarıçap’ parametresine float türünde, ‘merkez’ parametresine ise point türünde bu değişkenlerden gelen değeri atayın. Özellikle…”
Bildirim (Arnold 5.0’da nadiren gereklidir)
Eğer özel olarak tanımlanmış kullanıcı değişkenlerine ihtiyaç duysaydık (örneğin Arnold 4.2 hacim düğümünde olduğu gibi), şöyle görünebilirdi:
arnold_node type:#string default:"volume"
arnold_node_min type:#point3 default:[-0.5,-0.5,0]
arnold_node_max type:#point3 default:[0.5,0.5,1]
arnold_node_dso type:#string default:"volume_openvdb"
arnold_decl_filename type:#string default:"constant STRING"
arnold_node_filename type:#filename default:"smoke.vdb"
arnold_decl_bounds_slack type:#string default:"constant FLOAT"
arnold_node_bounds_slack type:#float default:0.0
Bu, daha önce olduğu gibi bir “hacim” düğümü örneği oluşturacak ve min , max ve dso parametrelerini ayarlayacaktır. Ancak geri kalan parametreler (Arnold 4.2 hacimlerinin eklenti yapısı nedeniyle) kullanıcı tanımlıydı, bu nedenle “dosya adı” adlı bir dize parametresi, “sınır_gevşekliği” adlı bir ondalık sayı parametresi vb. tanımlamamız gerekiyordu…
MAXtoA’da arnold_decl _… işlevi korunmuştur ancak Arnold 5.0 ile nadiren gereklidir.
Bağlantı Örneği: Bir Arnold Gobo Filtre Eklentisi #
Bir sonraki betik, Arnold Gobo filtre değiştirici eklentisinin ( arnoldlight_gobofilter.ms ) basitleştirilmiş bir sürümüdür . Bu betik, hem renk seçiciyi hem de Texmap aramasını desteklemek için kullanıcı arayüzü kontrollerinin nasıl ekleneceğini göstermektedir. (Buradaki Arnold hedef parametresi gobo.slidemap’tir .)
plugin modifier Arnold_Light_Gobo
name:~ARNOLD_LIGHT_FILTER_GOBO_NAME~
category:"Arnold"
classID:#(0xf00df10d,0x4001a10d)
extends:ArnoldLightFilterModifier replaceUI:true version:1
(
parameters main rollout:params
(
arnold_node type:#string default:"gobo"
arnold_node_slidemap type:#color ui:slidemapcolor default:[255,255,255]
arnold_link_slidemap type:#texturemap ui:slidemap
)
rollout params ~ARNOLD_LIGHT_FILTER_GOBO_ROLLOUT_NAME~
(
colorpicker slidemapcolor "Color" color:[255,255,255] modal:false
mapButton slidemap "Map"
)
)
Ek Notlar #
ENUM Parametreleri Hakkında Özel Bir Not #
Betik eklentisinin parametre bloğundaki parametrenin türü, Arnold düğümündeki türle eşleşmelidir. MaxScript kullanıcı arayüzü çalışmalarını basitleştirmek için özel bir tür vardır: Arnold türü “enum” ise, bu normalde sıfırdan başlayan bir tamsayı değeriyle temsil edilir. Ancak, 3ds Max “açılır menü” kontrolleri bir tabanlı olarak indekslendiğinden ve bir “enum” türündeki parametrenin kullanıcı arayüzünü doğrudan “açılır menü” türündeki bir kontrole bağlamak en doğal yol olduğundan, ENUM parametreleri aslında bir tamsayı olarak, ancak bir tabanlı biçimde döndürülür. Yani 1 (0 değil) ilk enum değerini, 2 ikinciyi vb. temsil eder.
Örnek kod parçası:
parameters main rollout:params
(
. . .
arnold_node_mode type:#integer default:2 ui:mode
. . .
)
rollout params " Parameters"
(
. . .
dropdownlist mode "Mode" items:#("Blend", "Mix", "Replace", "Add", "Sub")
. . .
)
Bu, komut dosyası düğümündeki tam parametrenin ( arnold_node_mode adlı parametre ) açılır menüden seçilen değere bağlı olarak 1, 2, 3, 4 veya 5 değerlerine sahip olacağı anlamına gelir; ancak Arnold’a gönderilen gerçek değer 0, 1, 2, 3 veya 4 olacaktır.
Teknik Not (aslında sadece betik yazımıyla sınırlı değil) #
Teknik olarak, bu belgede açıklanan davranış aslında yalnızca betik tabanlı eklentilerle sınırlı değildir. Daha ziyade şöyle söylenebilir: İlk parametre bloğu bu adlandırma kuralına uyan parametreler içeren herhangi bir 3ds Max eklentisi, bu tür bir çeviriyi tetikleyecektir. Dolayısıyla, varsayımsal olarak, bir C++ eklentisi bile bu mekanizmayı kullanarak bir Arnold düğümüne değerler gönderebilir.
Ancak 3ds Max’teki eklenti artık sadece şu amaçla kullanılıyor…
- Görüntüleme alanında görünüyor.
- Kullanıcı arayüzü gösteriliyor.
- Diğer render motorları için de mevcuttur.
…burada belirtildiği gibi basit bir “boş” betik eklentisi oluşturmak en mantıklısı gibi görünüyor. Ancak aslında bir test yok çünkü eklentinin betik olup olmamasına bakılmaksızın yalnızca parametrelerin adlandırma kuralı test ediliyor. Özellik, “arnold_node” adlı bir dize türündeki parametrenin varlığıyla tetikleniyor.
