View Categories

Prosedürel Kürk

4 dakika okuma

giriiş #


V-Ray Fur, oldukça basit bir prosedürel kürk eklentisidir. Kürk yalnızca render sırasında oluşturulur ve sahnede gerçekte mevcut değildir.

Parametreler #


 V-Ray Fur , birçok parametreye sahip olan GeomHair eklentisinde uygulanmıştır  . Bu parametreler şunlardır:

Ana #

  • mesh  – Üzerine saçların oluşturulacağı üçgen ağ modeli.

  • length_base  – Kürk tellerinin taban uzunluğu.

  • thickness_base  – Tellerin taban kalınlığı.

  • gravity_base – Bu, kürk tellerini gravity_vector  yönünde aşağı doğru çeken kuvveti kontrol eder  .

  • gravity_vector  – Yerçekimi kuvvetinin yön vektörü.

  • Bükülme  – bu parametre kürk tellerinin esnekliğini kontrol eder. Değeri 0,0 olduğunda teller serttir ve hepsi düz çizgiler halindedir. Daha yüksek değerler, tellerin bükülmesine neden olur (örneğin yerçekiminin etkisiyle).

  • Koniklik – Kürk tellerine koniklik eklemenizi sağlar. Bu değeri artırmak, her telin üst ucunun daha ince, tabanının ise daha geniş olmasını sağlayacaktır.

  • mtlID  – Mesh’in yüzeylerinin malzeme kimliği. Bu yalnızca yerleştirme malzeme kimliğine göre yapılıyorsa geçerlidir. Bu, kürke Çoklu/Alt nesne malzemesi uygulamak için kullanışlıdır.

Geometrik Detay #

  • hair_sides  – Tek bir saç telinin çevresi boyunca bulunan segment sayısı.

  • saç_düğümleri  – Tek bir saç telinin uzunluğu boyunca bulunan segment sayısı.

  • flat_normals – Bu seçenek açık olduğunda, kürk tellerinin normali tel genişliği boyunca değişmez. Çok hassas olmasa da, bu diğer kürk/saç çözümlerinin çalışma şekline benzer. Ayrıca kürk kenar yumuşatma işlemine yardımcı olarak görüntü örnekleyicisinin işini biraz daha kolaylaştırabilir. Bu seçenek kapalı olduğunda, yüzey normali tellerin genişliği boyunca değişir ve tellerin silindirik bir şekle sahip olduğu yanılsamasını yaratır.

  • lod_enabled  – Ayrıntı düzeyi açma/kapama düğmesi. Bu seçenek etkinleştirildiğinde, V-Ray kameradan uzakta olan sahne bölümleri için daha az kürk geometrisi oluşturacaktır. Bu, kürk tellerinin yoğunluğunu azaltarak ve ayrıntı düzeyini artırarak yapılır.

  • lod_startDistance – Detay seviyesi başlangıç ​​mesafesi. V-Ray’in detay seviyesi ayarlamasını uygulamaya başlayacağı kameradan olan mesafe. Bu mesafeye kadar kürk, kullanıcı tarafından belirtildiği gibi oluşturulacak, sonrasında V-Ray, Rate parametresiyle belirtilen her n birimlik alan için yoğunluğu azaltacak ve telin kalınlığını iki katına çıkaracaktır.

  • lod_rate – Detay seviyesi oranı. Detay ayarlamasının uygulanma hızı. Başlangıç ​​mesafesi parametresinde belirtilen mesafeden başlayarak, V-Ray, Hız parametresinde belirtilen her n birimlik boşluk için tellerin yoğunluğunu azaltacak ve kalınlığını iki katına çıkaracaktır.

Varyasyon #

Aşağıdaki değerlerin tümü 0,0 (hiçbir değişiklik yok) ile 1,0 arasındadır.

  • dir_var  – Yön varyasyonu. Bu parametre, kürk tellerinin kaynak nesneden büyüme yönüne hafif bir varyasyon ekler. Herhangi bir pozitif değer geçerlidir. Bu parametre ayrıca sahne ölçeğine de bağlı olmalıdır.

  • length_var  – Saç uzunluğu varyasyonu.

  • thickness_var  – Saç kalınlığındaki değişim.

  • gravity_var  – Yerçekimi varyasyonu.

  • curl_radius_var  – Kıvrım yarıçapı varyasyonu.

Dağıtım #

  • Dağıtım  – kaynak nesne üzerindeki tel yoğunluğunu belirler:

    • 0 – yüz başına  – kaynak nesnenin her yüzündeki tüy teli sayısını belirtir. Her yüz, belirtilen sayıda tüy teli üretecektir.

    • 1 – alan başına  – kare sahne birimi başına tel sayısı. Örneğin, sistem birimleri metre ise, bu parametre metrekare başına istenen tel sayısını belirtir; sistem birimleri santimetre ise, santimetre kare başına tel sayısını belirtir ve benzer şekilde devam eder. Üçgen yüzlerin alanı (her yüz için tel sayısını hesaplamak için kullanılır), Referans çerçeve parametresiyle belirtilen çerçevede alınır. Her üçgen yüzün en az bir teli vardır.

  • perFace – Dağılım=0  ise yüz başına düşen kıl sayısı 

  • perArea – Dağılım=1  ise birim alan başına düşen kıl sayısı 

Atama #

  • Yerleşim  – Kürkün ağ üzerindeki yerleşim şekli. Olası değerler şunlardır:

    • 0 – Tüm Nesne  – tüm yüzeylerde kürk oluşacak.

    • 1 – Seçili Yüzeyler  – yalnızca seçili yüzeyler (örneğin MeshSelect değiştiricisi ile) kürk oluşturacaktır.

    • 2 – Malzeme Kimliği  – yalnızca belirtilen malzeme kimliğine sahip yüzeylerde kürk oluşturulacaktır.

  • faceList  – Üzerlerinde saç oluşturulacak yüzlerin indekslerinin listesi. Eğer NULL ise tüm yüzlerde saç oluşturulacaktır.

  • fixed_areas  – Dağıtım ‘alan başına’ olduğunda saç sayısını belirlemek için areaList’in kullanılacağını belirtirse True değeri.

  • areaList  – Üçgen yüzey alanlarının listesi. faceList boş değilse, buradaki bir öğe faceList’teki bir öğeye karşılık gelir.

Haritalama #

  • generate_w_coord  – Doğruysa, V-Ray, saç telleri boyunca gölgeli noktanın konumunu temsil eden bir W eşleme koordinatı oluşturacaktır. Genel olarak, tüm eşleme koordinatları temel nesneden alınır. Bununla birlikte, W eşleme koordinatı, saç telleri boyunca ofseti temsil edecek şekilde değiştirilebilir. Bu seçenek açık olduğunda, W koordinatı saç telleri boyunca ofsettir (0.0 telin tabanı, 1.0 ise ucudur). U ve V koordinatları hala temel nesneden alınır.

  • map_channel  – W koordinatının değiştirileceği kanal,  “W koordinatını oluştur”  seçeneği açık olduğunda kullanılır.

Diğerleri #

  • curl_enabled  – Saça bukle uygulanıp uygulanmayacağını belirtir.

  • curl_angle – Her düğümde uygulanan kıvrımın açısı.

  • curl_radius  – Kıvrımların yarıçapı.

  • override_mtlID_on – Malzeme kimliği geçersiz kılınacaktır.

  • override_mtlID  – Geçersiz kılınacak malzeme kimliği.

  • ignore_base_mesh_displacement – Yanlışsa, kürk, üst mesh’in yer değiştirme haritası kullanılarak yer değiştirecektir.

  • Ölçek  – Kürk ölçeklendirme faktörü.

Haritalar #

GeomHair’in bazı yönlerini doku haritalarıyla kontrol edebilirsiniz. Bunlar, bitmap’ler veya doğrudan kaynak nesne üzerine boyanmış köşe renk haritaları olabilir.

  • bend_direction_tex – Bu, doku uzayında (belirtilen Temel harita kanalına göre) kürk tellerinin bükülme yönünü belirten bir RGB haritasıdır. Bu, kürk tellerinin kıvrıldığı yöndür (kıvrılma miktarı da Bend parametresiyle kontrol edilir). Kırmızı bileşen u doku yönü boyunca, yeşil bileşen v doku yönü boyunca ve mavi bileşen yüzey normali boyunca ofsetlenmiştir.

  • initial_direction_tex – Bu, doku uzayında (belirtilen Temel harita kanalına göre) kürk tellerinin başlangıç ​​yönünü belirten bir RGB haritasıdır. Kırmızı bileşen u doku yönü boyunca, yeşil bileşen v doku yönü boyunca ve mavi bileşen yüzey normali boyunca ofsetlenmiştir.

Aşağıdaki haritalar, ilgili parametreler için çarpanlardır; siyah 0,0 çarpanını, beyaz ise 1,0 çarpanını temsil eder.

  • length_tex  – Uzunluk için bir doku.

  • thickness_tex  – Kalınlık için bir doku.

  • gravity_tex  – Yerçekimi için bir doku.

  • bend_tex  – Bükülme için bir doku.

  • density_tex  – bu harita, tel yoğunluğu için bir çarpan görevi görür. Haritanın siyah kısımları sıfır yoğunluğa karşılık gelir (bu alanlarda etkili bir şekilde tüy oluşmaz) ve beyaz kısımlar ise dağıtım parametreleri tarafından belirtilen normal tel yoğunluğunu temsil eder.

  • curl_tex  – Bukleler için bir doku.

Kod örneği #

# The directory containing the vray shared object should be present in the PYTHONPATH environment variable.
# Try to import the vray module from VRAY_SDK/python, if it is not in PYTHONPATH
import sys, os
VRAY_SDK = os.environ.get('VRAY_SDK')
if VRAY_SDK:
    sys.path.append(os.path.join(VRAY_SDK, 'python'))
import vray
 
SCENE_PATH = os.path.join(os.environ.get('VRAY_SDK'), 'scenes')
# Change process working directory to SCENE_PATH in order to be able to load relative scene resources.
os.chdir(SCENE_PATH)
 
# Create an instance of VRayRenderer with default options.
# The renderer is automatically closed after the `with` block.
with vray.VRayRenderer() as renderer:
    # Register a simple log callback. Always useful for debugging.
    def dumpMsg(renderer, message, level, instant):
        if level == vray.LOGLEVEL_ERROR:
            print("[ERROR]", message)
        elif level == vray.LOGLEVEL_WARNING:
            print("[Warning]", message)
        elif level == vray.LOGLEVEL_INFO:
            print("[info]", message)
        # Uncomment for testing, but you might want to ignore these in real code
        #else: print("[debug]", message)
    renderer.setOnLogMessage(dumpMsg)
    # Load scene from a file.
    renderer.load(os.path.join(SCENE_PATH, 'cornell_new.vrscene'))
    # A reference to the Node plugin of one of the spheres in the scene
    sphereNode = renderer.plugins['Sphere0Shape2@node']
    # Create a GeomHair plugin
    # It References another mesh plugin (usually GeomStaticMesh) and generates hair (can be tweaked for fur, grass, shaggy rug etc.) on it.
    # Has many parameters for the size, shape and distribution of strands.
    hairMesh = renderer.classes.GeomHair()
    hairMesh.mesh = sphereNode.geometry                    # Attach a geometry to the hair
    hairMesh.length_base = 20                              # The base hair length.
    hairMesh.length_var = 5                                # The hair length variation.
    hairMesh.thickness_base = 0.2                          # The base hair thickness.
    hairMesh.thickness_var = 0.1                           # The hair thickness variation.
    hairMesh.curl_enabled = True                           # Apply curl to the hair
    hairMesh.curl_radius_var = 20                          # The curl radius variation.
    hairMesh.curl_angle = 20                               # The angle of the curl applied at each knot. (degrees)
    hairMesh.hair_knots = 20                               # Number of segments along the length of a single hair.
    hairMesh.bend = 0.25                                   # The amount of hair bending. (relative)
    hairMesh.perFace = 20                                  # Number of hairs per face with the default distribution value
    hairMesh.gravity_vector = vray.Vector(0.0, 0.0, -1.0)  # The gravity force direction vector.
    # Create a new hair BRDF plugin instance and set several parameters.
    hairBrdf = renderer.classes.BRDFHair3()
    hairBrdf.diffuse_color = vray.AColor(0.1, 0.05, 0.025, 1)
    hairBrdf.primary_specular = vray.AColor(0.7, 0.6, 0.5, 1)
    hairBrdf.secondary_specular = vray.AColor(0.3, 0.2, 0.1, 1)
    hairBrdf.transmission = vray.AColor(0.3, 0.2, 0.1, 1)
    hairBrdf.transmission_glossiness_length = 0.5
    hairBrdf.transmission_glossiness_width = 0.5
    # Create a new material plugin instance using the hair BRDF.
    hairMaterial = renderer.classes.MtlSingleBRDF()
    hairMaterial.brdf = hairBrdf
    # Create a node for the GeomHair
    hairNode = renderer.classes.Node()
    # The GeomHair should be attached just as a usual geometry to the node
    hairNode.geometry = hairMesh
    hairNode.material = hairMaterial
    hairNode.transform = sphereNode.transform
    # Start rendering.
    renderer.startSync()
    # Wait for rendering to end.
    renderer.waitForRenderEnd()
#define VRAY_RUNTIME_LOAD_PRIMARY
#include "vraysdk.hpp"
#include "vrayplugins.hpp"
#include "utils.h"
 
using namespace VRay;
using namespace VRay::Plugins;
using namespace std;
 
const char* BASE_PATH = getenv("VRAY_SDK");
string SCENE_PATH = (BASE_PATH ? string(BASE_PATH) : string(".")) + PATH_DELIMITER + "scenes";
 
int main() {
// Change process working directory to SCENE_PATH in order to be able to load relative scene resources.
changeCurrentDir(SCENE_PATH.c_str());
// Load V-Ray SDK library.
VRayInit init(NULL, true);
// Create an instance of VRayRenderer with default options.
// The renderer is automatically closed at the end of the current scope.
VRayRenderer renderer;
// It's recommended to always have a console log
renderer.setOnLogMessage(logMessage);
// Load scene from a file.
renderer.load("cornell_new.vrscene");
// A reference to the Node plugin of one of the spheres in the scene
Node sphereNode = renderer.getPlugin<Node>("Sphere0Shape2@node");
// Create a GeomHair plugin
// It References another mesh plugin (usually GeomStaticMesh) and generates hair (can be tweaked for fur, grass, shaggy rug etc.) on it.
// Has many parameters for the size, shape and distribution of strands.
GeomHair hairMesh = renderer.newPlugin<GeomHair>();
hairMesh.set_mesh(sphereNode.get_geometry());         // Attach a geometry to the hair
hairMesh.set_length_base(20);                         // The base hair length.
hairMesh.set_length_var(5);                           // The hair length variation.
hairMesh.set_thickness_base(0.2f);                    // The base hair thickness.
hairMesh.set_thickness_var(0.1f);                     // The hair thickness variation.
hairMesh.set_curl_enabled(true);                      // Apply curl to the hair
hairMesh.set_curl_radius_var(20);                     // The curl radius variation.
hairMesh.set_curl_angle(20);                          // The angle of the curl applied at each knot. (degrees)
hairMesh.set_hair_knots(20);                          // Number of segments along the length of a single hair.
hairMesh.set_bend(0.25f);                             // The amount of hair bending. (relative)
hairMesh.set_perFace(20);                             // Number of hairs per face with the default distribution value
hairMesh.set_gravity_vector(Vector(0.0, 0.0, -1.0));  // The gravity force direction vector.
// Create a new hair BRDF plugin instance and set several parameters.
BRDFHair3 hairBrdf = renderer.newPlugin<BRDFHair3>();
hairBrdf.set_diffuse_color(AColor(0.1, 0.05, 0.025, 1));
hairBrdf.set_primary_specular(AColor(0.7, 0.6, 0.5, 1));
hairBrdf.set_secondary_specular(AColor(0.3, 0.2, 0.1, 1));
hairBrdf.set_transmission(AColor(0.3, 0.2, 0.1, 1));
hairBrdf.set_transmission_glossiness_length(0.5);
hairBrdf.set_transmission_glossiness_width(0.5);
// Create a new material plugin instance using the hair BRDF.
MtlSingleBRDF hairMaterial = renderer.newPlugin<MtlSingleBRDF>();
hairMaterial.set_brdf(hairBrdf);
// Create a node for the GeomHair
Node hairNode = renderer.newPlugin<Node>();
// The GeomHair should be attached just as a usual geometry to the node
hairNode.set_geometry(hairMesh);
hairNode.set_material(hairMaterial);
hairNode.set_transform(sphereNode.get_transform());
// Start rendering.
renderer.startSync();
// Wait for rendering to end.
renderer.waitForRenderEnd();
return 0;
}
using System;
using System.IO;
using VRay;
using VRay.Plugins;
 
namespace _geom_hair
{
class Program
{
static void Main(string[] args)
{
string SCENE_PATH = Path.Combine(Environment.GetEnvironmentVariable("VRAY_SDK"), "scenes");
// Change process working directory to SCENE_PATH in order to be able to load relative scene resources.
Directory.SetCurrentDirectory(SCENE_PATH);
// Create an instance of VRayRenderer with default options. The renderer is automatically closed after the `using` block.
using (VRayRenderer renderer = new VRayRenderer())
{
// Add a listener for any type of log message.
renderer.LogMessage += new EventHandler<MessageEventArgs>((source, e) =>
{
// You can remove the if for testing, but you might want to ignore Debug in real code
if (e.LogLevel != LogLevelType.Debug)
{
Console.WriteLine(String.Format("[{0}] {1}", e.LogLevel.ToString(), e.Message));
}
});
// Load scene from a file.
renderer.Load("cornell_new.vrscene");
// A reference to the Node plugin of one of the spheres in the scene
Node sphereNode = renderer.GetPlugin<Node>("Sphere0Shape2@node");
// Create a GeomHair plugin
// It References another mesh plugin (usually GeomStaticMesh) and generates hair (can be tweaked for fur, grass, shaggy rug etc.) on it.
// Has many parameters for the size, shape and distribution of strands.
GeomHair hairMesh = renderer.NewPlugin<GeomHair>();
hairMesh.Mesh = sphereNode.Geometry;                  // Attach a geometry to the hair
hairMesh.LengthBase = 20;                             // The base hair length.
hairMesh.LengthVar = 5;                               // The hair length variation.
hairMesh.ThicknessBase = 0.2f;                        // The base hair thickness.
hairMesh.ThicknessVar = 0.1f;                         // The hair thickness variation.
hairMesh.CurlEnabled = true;                          // Apply curl to the hair
hairMesh.CurlRadiusVar = 20;                          // The curl radius variation.
hairMesh.CurlAngle = 20;                              // The angle of the curl applied at each knot. (degrees)
hairMesh.HairKnots = 20;                              // Number of segments along the length of a single hair.
hairMesh.Bend = 0.25f;                                // The amount of hair bending. (relative)
hairMesh.PerFace = 20;                                // Number of hairs per face with the default distribution value
hairMesh.GravityVector = new Vector(0.0, 0.0, -1.0);  // The gravity force direction vector.
// Create a new hair BRDF plugin instance and set several parameters.
BRDFHair3 hairBrdf = renderer.NewPlugin<BRDFHair3>();
hairBrdf.DiffuseColor = new AColor(0.1, 0.05, 0.025, 1);
hairBrdf.PrimarySpecular = new AColor(0.7, 0.6, 0.5, 1);
hairBrdf.SecondarySpecular = new AColor(0.3, 0.2, 0.1, 1);
hairBrdf.Transmission = new AColor(0.3, 0.2, 0.1, 1);
hairBrdf.TransmissionGlossinessLength = 0.5;
hairBrdf.TransmissionGlossinessWidth = 0.5;
// Create a new material plugin instance using the hair BRDF.
MtlSingleBRDF hairMaterial = renderer.NewPlugin<MtlSingleBRDF>();
hairMaterial.Brdf = hairBrdf;
// Create a node for the GeomHair
Node hairNode = renderer.NewPlugin<Node>();
// The GeomHair should be attached just as a usual geometry to the node
hairNode.Geometry = hairMesh;
hairNode.Material = hairMaterial;
hairNode.Transform = sphereNode.Transform;
// Start rendering.
renderer.StartSync();
// Wait for rendering to end.
renderer.WaitForRenderEnd();
}
}
}
}
var path = require('path');
var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray'));
 
var SCENE_PATH = path.join(process.env.VRAY_SDK, 'scenes');
// Change process working directory to SCENE_PATH in order to be able to load relative scene resources.
process.chdir(SCENE_PATH);
 
// Create an instance of VRayRenderer with default options.
var renderer = vray.VRayRenderer();
// It's recommended to always have a console log callback
renderer.on("logMessage", function(message, level, instant) {
if (level == vray.LOGLEVEL_ERROR)
console.log("[ERROR] ", message);
else if (level == vray.LOGLEVEL_WARNING)
console.log("[Warning] ", message);
else if (level == vray.LOGLEVEL_INFO)
console.log("[info] ", message);
// Uncomment for testing, but you might want to ignore these in real code
//else console.log("[debug] ", message);
});
// Load scene from a file asynchronously.
renderer.load("cornell_new.vrscene", function(err) {
if (err) throw err;
// A reference to the Node plugin of one of the spheres in the scene
var sphereNode = renderer.plugins["Sphere0Shape2@node"];
// Create a GeomHair plugin
// It References another mesh plugin (usually GeomStaticMesh) and generates hair (can be tweaked for fur, grass, shaggy rug etc.) on it.
// Has many parameters for the size, shape and distribution of strands.
var hairMesh = renderer.classes.GeomHair();
hairMesh.mesh = sphereNode.geometry;                    // Attach a geometry to the hair
hairMesh.length_base = 20;                              // The base hair length.
hairMesh.length_var = 5;                                // The hair length variation.
hairMesh.thickness_base = 0.2;                          // The base hair thickness.
hairMesh.thickness_var = 0.1;                           // The hair thickness variation.
hairMesh.curl_enabled = true;                           // Apply curl to the hair
hairMesh.curl_radius_var = 20;                          // The curl radius variation.
hairMesh.curl_angle = 20;                               // The angle of the curl applied at each knot. (degrees)
hairMesh.hair_knots = 20;                               // Number of segments along the length of a single hair.
hairMesh.bend = 0.25;                                   // The amount of hair bending. (relative)
hairMesh.perFace = 20;                                  // Number of hairs per face with the default distribution value
hairMesh.gravity_vector = vray.Vector(0.0, 0.0, -1.0);  // The gravity force direction vector.
// Create a new hair BRDF plugin instance and set several parameters.
var hairBrdf = renderer.classes.BRDFHair3();
hairBrdf.diffuse_color = vray.AColor(0.1, 0.05, 0.025, 1);
hairBrdf.primary_specular = vray.AColor(0.7, 0.6, 0.5, 1);
hairBrdf.secondary_specular = vray.AColor(0.3, 0.2, 0.1, 1);
hairBrdf.transmission = vray.AColor(0.3, 0.2, 0.1, 1);
hairBrdf.transmission_glossiness_length = 0.5;
hairBrdf.transmission_glossiness_width = 0.5;
// Create a new material plugin instance using the hair BRDF.
var hairMaterial = renderer.classes.MtlSingleBRDF();
hairMaterial.brdf = hairBrdf;
// Create a node for the GeomHair
var hairNode = renderer.classes.Node();
// The GeomHair should be attached just as a usual geometry to the node
hairNode.geometry = hairMesh;
hairNode.material = hairMaterial;
hairNode.transform = sphereNode.transform;
// Start rendering.
renderer.start(function(err) {
if (err) throw err;
// Wait for rendering to end.
renderer.waitForRenderEnd(function() {
// Closes the renderer.
renderer.close();
});
});
});

Örnek #


Aşağıdaki çim benzeri efekt, bu sahne kullanılarak V-Ray prosedürel kürk efekti ile oluşturulmuştur .

Notlar #


  • Kürk üzerine Object XYZ eşlemesi içeren dokular uygulamaktan kaçının. 3 boyutlu prosedürel bir doku kullanmanız gerekiyorsa, kaynak nesneye XYZ’yi UVW koordinatlarına dönüştürme seçeneğiyle bir UVW Map değiştiricisi uygulayın ve doku için açık eşleme kullanın.

  • Kürk, orijinal ağdaki üçgenlere karşılık gelen gruplar halinde oluşturulduğu için, çok büyük üçgenlerin kürk ile kaplı olmasından kaçının.

  • Gölge haritaları GeomHair hakkında bilgi içermeyecektir. Ancak, gölge haritaları olsa bile diğer nesneler kürke gölge düşürecektir.

  • Keskin gölgeler, GeomHair ile animasyonlarda titremeye neden olabilir, çünkü tek tek saç tellerinin aydınlatma durumu çok hızlı değişecektir. Alan gölgeleri veya VRayLights daha yumuşak sonuçlar verebilir.

  • GeomHair, Infinite Plane | GeomInfinitePlane temel nesnesiyle birlikte çalışmaz.

Tarafından desteklenmektedir BetterDocs

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir