GeometryService
*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.
Belirli nesnelerle doğrudan ilgisi olmayan geometrik işlemler içeren hizmet.
Özet
Özellikler
Yöntemler
İlgili ebeveynlerle birlikte korumayı seçebileceğiniz bir tablo Constraints ve Attachments döndürür, ki bunlar da kendi ebeveynleridir.
Bir parçanın ve diğer parçaların kesişen geometrisinden bir veya daha fazla PartOperations oluşturur.
Bir veya daha fazla PartOperations bir parçadan, diğer parçalar tarafından işgal edilen geometriden çıkarır.
Bir veya daha fazla PartOperations bir parçadan bir veya daha fazla oluşturur plus diğer parçalar tarafından işgal edilen geometri.
Özellikler
Yöntemler
CalculateConstraintsToPreserve
İlgili ebeveynlerle birlikte korumayı seçebileceğiniz bir tablo Constraints ve Attachments döndürür, ki bunlar da kendi ebeveynleridir.Bu tablo üzerinde döndürmek, önerilen sınırları ve bağlantıları ilgili ebeveynlere geri göndermeyi seçmenizi sağlar.
options sözlüğünün takip edileniçerebileceğini unutmayın:
- — Bağlantı ve orijinal parçanın yüzeyindeki en yakın nokta arasındaki uzaklık toleransı, çıkan parçanın yüzeyindeki en yakın noktaya kıyasla orijinal parçanın yüzeyindeki en yakın nokta.Solid modelleme işleminden sonra elde edilen mesafe bu değerden daha büyükse, eklerin ve ilişkili kısıtlamaların 'si geri döndürülen öneri tablosunda olacaktır.
- weldConstraintPreserve — Sonuç öneri tablosunda nasıl korunacağını tanımlayan bir Enum.WeldConstraintPreserve enum değeri ile WeldConstraints korunur.
- dropAttachmentsWithoutConstraints — Varsayılanı true olan Booleen. Eğer false olarak ayarlanırsa, Attachments hiçbir Constraints olmayanlar korunur.
Parametreler
Solide modelleme işlemi yapılan orijinal bir nesne, örneğin part içinde UnionAsync().
Yöntem için seçenekler sözlüğü:
- — Bağlantı ve orijinal parçanın yüzeyindeki en yakın nokta arasındaki uzaklık toleransı, çıkan parçanın yüzeyindeki en yakın noktaya kıyasla orijinal parçanın yüzeyindeki en yakın nokta.Solid modelleme işleminden sonra elde edilen mesafe bu değerden daha büyükse, eklerin ve ilişkili kısıtlamaların 'si geri döndürülen öneri tablosunda olacaktır.
- weldConstraintPreserve — Sonuç öneri tablosunda nasıl korunacağını tanımlayan bir Enum.WeldConstraintPreserve enum değeri ile WeldConstraints korunur.
- dropAttachmentsWithoutConstraints — Varsayılanı true olan Booleen. Eğer false olarak ayarlanırsa, Attachments hiçbir Constraints olmayanlar korunur.
Dönüşler
Genel durum için bilgi içeren tablo Constraints , NoCollisionConstraints ve WeldConstraints .Bir Attachment veya Constraint atılması gereken durumlarda, bunun ilgili ebeveyni nil olacaktır.
Genel durum için Constraints örneğin HingeConstraint :
<th>Tür</th></tr></thead><tbody><tr><td><code>Eklenti</code></td><td><code>Class.AttachmentYorumlarYorumlarİşaretlerİşaretler</code></td></tr><tr><td><code>Kısıtlama</code></td><td><code>Sınıf.Sınırı</code> veya <code>sıfır</code></td></tr><tr><td><code>EklentiAnaç</code></td><td><code>Sınıf.BasePart</code> veya <code>sıfır</code></td></tr><tr><td><code>KısıtlayıcıEbeveyn</code></td><td><code>Sınıf.BasePart</code> veya <code>sıfır</code></td></tr></tbody>
Anahtar |
---|
İçin WeldConstraints :
<th>Tür</th></tr></thead><tbody><tr><td><code>Kaynak Kısıtlaması</code></td><td><code>Class.WeldConstraint sınıfı</code></td></tr><tr><td><code>Kaynak Sınırı Ebeveyni</code></td><td><code>Sınıf.BasePart</code> veya <code>sıfır</code></td></tr><tr><td><code>Kaynak KısıtlayıcıParçası0</code></td><td><code>Sınıf.BasePart</code></td></tr><tr><td><code>Kaynak KısıtlayıcıParçası1</code></td><td><code>Sınıf.BasePart</code></td></tr></tbody>
Anahtar |
---|
İçin NoCollisionConstraints :
<th>Tür</th></tr></thead><tbody><tr><td><code>Çarpışma Yok Sınırı</code></td><td><code>Sınıf.NoCollisionKısıtlaması</code></td></tr><tr><td><code>Çarpışma Yok Sınırı Ebeveyni</code></td><td><code>Sınıf.BasePart</code> veya <code>sıfır</code></td></tr><tr><td><code>Çarpışma Yok KısıtlayıcıParçası0</code></td><td><code>Sınıf.BasePart</code></td></tr><tr><td><code>Çarpışma Yok Sınırı Parçası1</code></td><td><code>Sınıf.BasePart</code></td></tr></tbody>
Anahtar |
---|
Kod Örnekleri
The following example shows how to preserve Attachments and Constraints based on a recommended table produced by CalculateConstraintsToPreserve().
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
local constraintOptions = {
tolerance = 0.1,
weldConstraintPreserve = Enum.WeldConstraintPreserve.All,
dropAttachmentsWithoutConstraints = false,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Calculate constraints/attachments to either preserve or drop
local recommendedTable = GeometryService:CalculateConstraintsToPreserve(mainPart, newParts, constraintOptions)
-- Preserve constraints/attachments based on recommended table
for _, item in pairs(recommendedTable) do
if item.Attachment then
item.Attachment.Parent = item.AttachmentParent
if item.Constraint then
item.Constraint.Parent = item.ConstraintParent
end
elseif item.NoCollisionConstraint then
local newNoCollision = Instance.new("NoCollisionConstraint")
newNoCollision.Part0 = item.NoCollisionPart0
newNoCollision.Part1 = item.NoCollisionPart1
newNoCollision.Parent = item.NoCollisionParent
elseif item.WeldConstraint then
local newWeldConstraint = Instance.new("WeldConstraint")
newWeldConstraint.Part0 = item.WeldConstraintPart0
newWeldConstraint.Part1 = item.WeldConstraintPart1
newWeldConstraint.Parent = item.WeldConstraintParent
end
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
IntersectAsync
Ana parçanın kesişen geometrisinden ve verilen dizedeki diğer parçalardan bir veya daha fazla PartOperations oluşturur.Sadece ilkeli Parts ve PartOperations desteklenir, örneğin Terrain veya MeshParts değil.Clone() ile benzer şekilde, döndürülen parçaların herhangi bir Parent ayarı yoktur.
Ana kısımdan aşağıdaki özellikler uygulanır ( part ) sonuç PartOperations 'a:
Aşağıdaki görüntü karşılaştırmasında, IntersectAsync() mor blok ve mavi blok içeren bir dizi kullanılarak çağrılır.Sonuçlanan PartOperation , her iki parçanın kesişen geometrisinin bir şekline dönüşür.

<figcaption>Ayrı parçalar</figcaption>

<figcaption>Sonuçlanan <code>Class.PartOperation</code></figcaption>
Notlar
BasePart:IntersectAsync() ile karşılaştırıldığında, bu yöntem aşağıdaki gibi farklılaşır:
- Giriş parçalarının sahneye ebeveyn olması gerekmez, arka plan operasyonlarına izin verir.
- SplitApart seçeneği true (Varsayılan) olarak ayarlanırsa, her farklı vücut kendi PartOperation içinde geri verilecektir.
- Geri döndürülen parçaların her biri ana parçanın koordinat uzayındadır.Bu, herhangi bir geri dönen parçanın (0, 0, 0) kesinlikle vücutmerkezinde olmadığını gösterir.
- Bu yöntemi istemciye çağırmak mümkündür, ancak bazı sınırlamalarla.Öncelikle, şu anda müşteride oluşturulan nesnelerle yapılmalı dır.İkincisi, istemciden sunucuya kullanılabilir bir yedekleme yoktur.
Orijinal parçalar başarılı bir işlemden sonra bozulmadan kalır.Çoğu durumda, döndürülen PartOperations 'yi ana parça ile aynı yere yönlendirmelisiniz, ardından tüm orijinal parçaları Destroy() edinmelisiniz.
Varsayılan olarak, sonuç PartOperations olan yüz renkleri orijinal parçaların Color özelliklerinden ödünç alınır, ancak onları belirli bir renge değiştirmek için onların UsePartColor özelliklerini etkinleştirebilirsiniz.
Kesişme işlemi 20,000'den fazla üçgen ile herhangi bir PartOperations sonuçlanırsa, 20,000'e basitleştirilecektir.Bu, kod ile bir hata oluşturur -14 .
Eğer işlem hesaplanırken ana parça hareket ediyorsa, sonuç parçaları ana parçanın güncellenmiş CFrame sürümüne ayarlayabilirsiniz, çünkü döndürülen parçalar ana parça ile aynı koordinat uzayındadır.
Bu yöntemi ana parça olarak PartOperation ile kullanıyorsanız, diğer bir PartOperation 'in geometrisini SubstituteGeometry() aracılığıyla değiştirebilir ve işlemin geometrisini kullanmayı kolaylaştırabilir, ancak özellikleri, öznitelikleri, etiketleri ve ana parçanın çocuklarını, örneğin Attachments , Constraints , ParticleEmitters , hafif nesneleri ve desenleri korur.Bu yaklaşım ayrıca orijinal PartOperation 'yi başka biriyle tamamen değiştirmenin potansiyel "flicker"ini de atlar.
Parametreler
Ana Part veya PartOperation üzerinde çalışmak için.
Ana parça ile kesişecek parça dizisi.
Yöntem için tüm kontrolleri içeren seçenek tablosu:
- CollisionFidelity — Sonuç parçalarındaki CollisionFidelity değeri.
- RenderFidelity — Sonuç parçalarındaki RenderFidelity değeri.
- FluidFidelity — Sonuç parçalarındaki FluidFidelity değeri.
- SplitApart — Nesnelerin hepsinin birlikte tutulması gerektiği veya doğru bir şekilde ayrılması gerektiği konusunda Boolean kontrolü. Varsayılan true (bölünme).
Dönüşler
Ana parçanın kesişen geometrisinden ve diğer parçalardan biri veya daha fazlası PartOperations bir veya daha fazla part .
Kod Örnekleri
This example intersects the geometry of mainPart and the parts in the otherParts array, splitting them into distinct PartOperations. Then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform intersect operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:IntersectAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
SubtractAsync
Verilen dizedeki diğer parçalar tarafından işgal edilen geometri dışından ana bölümden bir veya daha fazla PartOperations oluşturur.Sadece ilkeli Parts ve PartOperations desteklenir, örneğin Terrain veya MeshParts değil.Clone() ile benzer şekilde, döndürülen parçaların herhangi bir Parent ayarı yoktur.
Ana kısımdan aşağıdaki özellikler uygulanır ( part ) sonuç PartOperations 'a:
Aşağıdaki görüntü karşılaştırmasında, SubtractAsync() mavi silindir ve mor blok içeren bir dizi kullanılarak çağrılır.Sonuçlanan PartOperation blokun geometrisini silindirden çıkaran bir şekle dönüşür.

<figcaption>Ayrı parçalar</figcaption>

<figcaption>Sonuçlanan <code>Class.PartOperation</code></figcaption>
Notlar
BasePart:SubtractAsync() ile karşılaştırıldığında, bu yöntem aşağıdaki gibi farklılaşır:
- Giriş parçalarının sahneye ebeveyn olması gerekmez, arka plan operasyonlarına izin verir.
- SplitApart seçeneği true (Varsayılan) olarak ayarlanırsa, her farklı vücut kendi PartOperation içinde geri verilecektir.
- Geri döndürülen parçaların her biri ana parçanın koordinat uzayındadır.Bu, herhangi bir geri dönen parçanın (0, 0, 0) kesinlikle vücutmerkezinde olmadığını gösterir.
- Bu yöntemi istemciye çağırmak mümkündür, ancak bazı sınırlamalarla.Öncelikle, şu anda müşteride oluşturulan nesnelerle yapılmalı dır.İkincisi, istemciden sunucuya kullanılabilir bir yedekleme yoktur.
Orijinal parçalar başarılı bir işlemden sonra bozulmadan kalır.Çoğu durumda, döndürülen PartOperations 'yi ana parça ile aynı yere yönlendirmelisiniz, ardından tüm orijinal parçaları Destroy() edinmelisiniz.
Varsayılan olarak, sonuç PartOperations olan yüz renkleri orijinal parçaların Color özelliklerinden ödünç alınır, ancak onları belirli bir renge değiştirmek için onların UsePartColor özelliklerini etkinleştirebilirsiniz.
Eksiltme işlemi 20,000'den fazla 20,000 üçgenle sonuçlanırsa, basitleştirileceklerdir.Bu, kod ile bir hata oluşturur -14 .
Eğer işlem hesaplanırken ana parça hareket ediyorsa, sonuç parçaları ana parçanın güncellenmiş CFrame sürümüne ayarlayabilirsiniz, çünkü döndürülen parçalar ana parça ile aynı koordinat uzayındadır.
Bu yöntemi ana parça olarak PartOperation ile kullanıyorsanız, diğer bir PartOperation 'in geometrisini SubstituteGeometry() aracılığıyla değiştirebilir ve işlemin geometrisini kullanmayı kolaylaştırabilir, ancak özellikleri, öznitelikleri, etiketleri ve ana parçanın çocuklarını, örneğin Attachments , Constraints , ParticleEmitters , hafif nesneleri ve desenleri korur.Bu yaklaşım ayrıca orijinal PartOperation 'yi başka biriyle tamamen değiştirmenin potansiyel "flicker"ini de atlar.
Parametreler
Ana Part veya PartOperation üzerinde çalışmak için.
Ana parçadan düşürülecek parça grubu.
Yöntem için tüm kontrolleri içeren seçenek tablosu:
- CollisionFidelity — Sonuç parçalarındaki CollisionFidelity değeri.
- RenderFidelity — Sonuç parçalarındaki RenderFidelity değeri.
- FluidFidelity — Sonuç parçalarındaki FluidFidelity değeri.
- SplitApart — Nesnelerin hepsinin birlikte tutulması gerektiği veya doğru bir şekilde ayrılması gerektiği konusunda Boolean kontrolü. Varsayılan true (bölünme).
Dönüşler
Ana parçanın geometrisinden biri veya daha fazlasından çıkarılan geometri, diğer parçalar tarafından işgal edilen geometriden eksilir.
Kod Örnekleri
This example subtracts the geometry of the parts in the otherParts array from mainPart, splitting the results into distinct PartOperations. Then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueCylinder
local otherParts = { workspace.PurpleBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end
UnionAsync
Ana parçadan bir veya daha fazla PartOperations oluşturur ve verilen matristeki diğer parçalar tarafından işgal edilen geometri.Sadece ilkeli Parts ve PartOperations desteklenir, örneğin Terrain veya MeshParts değil.Clone() ile benzer şekilde, döndürülen parçaların herhangi bir Parent ayarı yoktur.
Ana kısımdan aşağıdaki özellikler uygulanır ( part ) sonuç PartOperations 'a:
Aşağıdaki görüntü karşılaştırmasında, UnionAsync() mavi blok ve mor silindir içeren bir dizi kullanılarak çağrılır.Sonuçlanan PartOperation , her iki parçanın birleşik geometrisinin bir şekline dönüşür.

<figcaption>Ayrı parçalar</figcaption>

<figcaption>Sonuçlanan <code>Class.PartOperation</code></figcaption>
Notlar
BasePart:UnionAsync() ile karşılaştırıldığında, bu yöntem aşağıdaki gibi farklılaşır:
- Giriş parçalarının sahneye ebeveyn olması gerekmez, arka plan operasyonlarına izin verir.
- SplitApart seçeneği true (Varsayılan) olarak ayarlanırsa, her farklı vücut kendi PartOperation içinde geri verilecektir.
- Geri döndürülen parçaların her biri ana parçanın koordinat uzayındadır.Bu, herhangi bir geri dönen parçanın (0, 0, 0) kesinlikle vücutmerkezinde olmadığını gösterir.
- Bu yöntemi istemciye çağırmak mümkündür, ancak bazı sınırlamalarla.Öncelikle, şu anda müşteride oluşturulan nesnelerle yapılmalı dır.İkincisi, istemciden sunucuya kullanılabilir bir yedekleme yoktur.
Orijinal parçalar başarılı bir işlemden sonra bozulmadan kalır.Çoğu durumda, döndürülen PartOperations 'yi ana parça ile aynı yere yönlendirmelisiniz, ardından tüm orijinal parçaları Destroy() edinmelisiniz.
Varsayılan olarak, sonuç PartOperations olan renkler orijinal parçaların Color özelliklerinden ödünç alınır, ancak onları belirli bir renge değiştirmek için onların UsePartColor özelliklerini etkinleştirebilirsiniz.
Bir birlik operasyonu 20,000'den fazla üçgen ile herhangi bir PartOperations sonuçlanırsa, 20,000'e basitleştirilecektir.Bu, kod ile bir hata oluşturur -14 .
Eğer işlem hesaplanırken ana parça hareket ediyorsa, sonuç parçaları ana parçanın güncellenmiş CFrame sürümüne ayarlayabilirsiniz, çünkü döndürülen parçalar ana parça ile aynı koordinat uzayındadır.
Bu yöntemi ana parça olarak PartOperation ile kullanıyorsanız, diğer bir PartOperation 'in geometrisini SubstituteGeometry() aracılığıyla değiştirebilir ve işlemin geometrisini kullanmayı kolaylaştırabilir, ancak özellikleri, öznitelikleri, etiketleri ve ana parçanın çocuklarını, örneğin Attachments , Constraints , ParticleEmitters , hafif nesneleri ve desenleri korur.Bu yaklaşım ayrıca orijinal PartOperation 'yi başka biriyle tamamen değiştirmenin potansiyel "flicker"ini de atlar.
Parametreler
Ana Part veya PartOperation üzerinde çalışmak için.
Ana parça ile birleşecek parça dizisi.
Yöntem için tüm kontrolleri içeren seçenek tablosu:
- CollisionFidelity — Sonuç parçalarındaki CollisionFidelity değeri.
- RenderFidelity — Sonuç parçalarındaki RenderFidelity değeri.
- FluidFidelity — Sonuç parçalarındaki FluidFidelity değeri.
- SplitApart — Nesnelerin hepsinin birlikte tutulması gerektiği veya doğru bir şekilde ayrılması gerektiği konusunda Boolean kontrolü. Varsayılan true (bölünme).
Dönüşler
Ana parçanın geometrisinden biri veya daha fazlası plus diğer parçalar tarafından işgal edilen geometri.
Kod Örnekleri
This example combines the geometry of mainPart and the parts in the otherParts array, then it destroys the original parts involved in the operation.
local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueBlock
local otherParts = { workspace.PurpleCylinder }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = false,
}
-- Perform union operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:UnionAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end