GeometryService

Artık kullanılmayanları göster

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Oluşturulamaz
Hizmet

Belirli nesnelerle ilgisi olmayan geometrik işlemleri içeren hizmet.

Özet

Yöntemler

Özellikler

Yöntemler

CalculateConstraintsToPreserve

Onu korumak için Constraints ve Attachments tablosunu içerir. Bu tabloyu itecek etkisiyle gezinmek, onların ebeveynleriyle birlikte korumak için tavsiye edilen kısıtlamaları ve eklentileri etkiler. Bu tabloyu gezinmek, onların ebeveynleriyle birlikte korumak için tavsiye edilen kısıtlam

Not et ki options tabelası bir tolerance değeri (sayı) ve/veya bir WeldConstraintPreserve değeri ( 1>Enumerate.WeldConstraintsPreserve1> ) içerebilir.

  • tolerance – mesafe toleransı, bağlantı ve en yakın nokta arasındaki mesafe korumasına ilişkin olarak, Attachment koruması arasındaki mesafe korumasına ilişkin olarak, Parent ba
  • weldConstraintPreserve – Bir Enum.WeldConstraintPreserve öneri tablosunda korunan şekli ifade eden bir WeldConstraints kaydı.

Parametreler

source: Instance

Solids olarak adlandırılan özgün bir nesne, örneğin part içinde UnionAsync() içinde yapıldı.

destination: Array
options: Dictionary

Yöntem için seçenek tablosu:

  • tolerance – mesafe toleransı, bağlantı ve en yakın nokta arasındaki mesafe korumasına ilişkin olarak, Attachment koruması arasındaki mesafe korumasına ilişkin olarak, Parent ba
  • weldConstraintPreserve – Bir Enum.WeldConstraintPreserve öneri tablosunda korunan şekli ifade eden bir WeldConstraints kaydı.
Varsayılan değer: "nil"

Dönüşler

Genel kasa için bilgi içeren masa Constraints , NoCollisionConstraints ve WeldConstraints . İstek düşürüldüğünde, onun ebeveyni 1> nil1> olacaktır.

Genel durumda Constraints türüne sahip olmak gibi şeyler için genel kullanım.


<tbody>
<tr>
<td>Eklentiler</td>
<td><code>Class.Attachment</code></td>
</tr>
<tr>
<td>Kısıtlayıcı</td>
<td><code>Sınıf Sınırı</code></td>
</tr>
<tr>
<td>Eklentilerin Ailesi</td>
<td><code>Class.BasePart</code> veya <code>nil</code></td>
</tr>
<tr>
<td>SınırAbi</td>
<td><code>Class.BasePart</code> veya <code>nil</code></td>
</tr>
</tbody>
AnahtarTür

For WeldConstraints :


<tbody>
<tr>
<td>Kaynak约束</td>
<td><code>Class.WeldConstraint</code></td>
</tr>
<tr>
<td>Kaynak Şekillendirici Ebeveyn</td>
<td><code>Class.BasePart</code> veya <code>nil</code></td>
</tr>
<tr>
<td>Kaynaklama Kısıtlayıcı Parçası0</td>
<td><code>Class.BasePart</code></td>
</tr>
<tr>
<td>Kaynaklama Kısıtlayıcı Parçası1</td>
<td><code>Class.BasePart</code></td>
</tr>
</tbody>
AnahtarTür

For NoCollisionConstraints :


<tbody>
<tr>
<td>Çarpışma Olmaz</td>
<td><code>Class.NoCollisionConstraint</code></td>
</tr>
<tr>
<td>Çarpışma Olmaz</td>
<td><code>Class.BasePart</code> veya <code>nil</code></td>
</tr>
<tr>
<td>Çarpışma Olmazının Parçası0</td>
<td><code>Class.BasePart</code></td>
</tr>
<tr>
<td>Çarpışma Kısıtlayıcısı 1</td>
<td><code>Class.BasePart</code></td>
</tr>
</tbody>
AnahtarTür

Kod Örnekleri

Preserve Constraints

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
}
-- 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.Constraint.Parent = item.ConstraintParent
item.Attachment.Parent = item.AttachmentParent
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

Bekletir

Ana bölümün ve diğer bölümlerin geometrisinin kesiştiği noktadan PartOperations oluşturur. Sadece ilkel Class.Part|

Aşağıdaki özelliklerden ana kısımdan ( part ) uygulanan sonuç PartOperations :

Aşağıdaki görsel karşılaştırmasında, IntersectAsync() purple blok ve bir blue blok içeren bir matris kullanarak adlandırılır. Sonuçta PartOperation şekillenir, her iki parçanın da kesişen geometrisinin şeklini alır.

Two block parts overlapping

<figcaption>Ayrı parçalar</figcaption>
Parts intersected into a new solid model

<figcaption>Sonuç <code>Class.PartOperation</code> ></figcaption>

Notlar

  • Class.BasePart:IntersectAsync() ile karşılaştırıldığında, bu yöntem şu şekilde farklı:

    • Giriş parçalarının sahneye bağlanması gerekmez, böylece arka plan işlemleri için izin verilir.
    • SplitApart seçeneği true (Varsayılan) olarak ayarlandığında, her bir ayrı beden kendi PartOperation 'ında döndürülür.
    • Döndürülen her bir parçanın yerleştirme alanı ana bölümün koordinat alanındadır. Bu, her döndürülen herhangi bir parçanın (0, 0, 0) merkezinde olmadığı anlamına gelir.
    • Bu yöntemi kliyente çağırmanız mümkündür, ancak bazı sınırlamalarla. İlk olarak, kliyente oluşturulan nesneler ile şimdi yapılmalıdır. İkincisi, kliyente sunucuya kopyalama mevcut değildir.
  • Orijinal parçalar başarılı bir işlemden sonra hasar görmez. Çoğu durumda, önbelleğe döndürülen PartOperations ile aynı yere ebeveyn olmalısınız, ardından tüm orijinal parçaları yok etmek için Destroy() .

  • Varsayılan olarak, sonuçta oluşturulan PartOperations 'in yüz renkleri, orijinal parçaların Color özelliğinden ödünç alınmıştır, ancak onları belirli bir renge değiştirmek için UsePartColor özelliğini etkinleşt

  • Eğer bir kesişim işlemi 20.000'den fazla üçgenle sonuçlanırsa, kesişim işlemi 20.000 olarak basitlendiğinde hata oluşurur. Bu, kod ile PartOperations arasında bir hata oluşur.

  • Ana bölümün işlemini hesaplarken hareket ediyorsa, döndürülen bölümleri ana bölümün güncellenmiş CFrame ile ayarlayabilirsiniz, çünkü döndürülen bölümler ana bölümün aynı koordinat alanındadır.

  • Bu yöntemi kullanırken bir PartOperation kullanarak

Parametreler

part: Instance

Ana Part veya PartOperation üzerinde çalışmak için.

parts: Array

Ana bölümle etkileşim kuracak parçaların matrisi.

options: Dictionary

Yöntem için tüm kontrolleri içeren seçenek tablosu:

  • CollisionFidelity – Sonuçta bölümlerde CollisionFidelity ile olan çarpışma değerini.
  • RenderFidelity – Sonuçta oluşturulan parçalardaki RenderFidelity değerinin.
  • FluidFidelity – Sonuçta bir parçadaki FluidFidelity değerinin.
  • SplitApart – Booletoğlu objelerin bütünü bir arada tutulupya dağıtılmasını mı kontrol edecek yoksa ayrı ayrı dağıtılmasını mı kontrol edecek.Varsayılan true (ayrılma).
Varsayılan değer: "nil"

Dönüşler

Ana bölümün ( PartOperations ) ve diğer bölümlerin ortak geometrisinden bir veya daha fazla part .

Kod Örnekleri

GeometryService:IntersectAsync()

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

Bekletir

Ana parçadan önceki PartOperations den bir veya daha fazla Parts veya PartOperations oluşt

Aşağıdaki özelliklerden ana kısımdan ( part ) uygulanan sonuç PartOperations :

Aşağıdaki görsel karşılaştırmasında, SubtractAsync() küresi mavi silindir ve mor bloğu içeren bir matris kullanarak adlandırılır. Sonuçta PartOperation şekillenir, bu blokun küresi üzerindeki geometriden oluşan bir şekle şekillenir.

Longer block overlapping a cylinder

<figcaption>Ayrı parçalar</figcaption>
Block part subtracted from cylinder

<figcaption>Sonuç <code>Class.PartOperation</code> ></figcaption>

Notlar

  • Class.BasePart:SubtractAsync() ile karşılaştırıldığında, bu yöntem şu şekilde farklı:

    • Giriş parçalarının sahneye bağlanması gerekmez, böylece arka plan işlemleri için izin verilir.
    • SplitApart seçeneği true (Varsayılan) olarak ayarlandığında, her bir ayrı beden kendi PartOperation 'ında döndürülür.
    • Döndürülen her bir parçanın yerleştirme alanı ana bölümün koordinat alanındadır. Bu, her döndürülen herhangi bir parçanın (0, 0, 0) merkezinde olmadığı anlamına gelir.
    • Bu yöntemi kliyente çağırmanız mümkündür, ancak bazı sınırlamalarla. İlk olarak, kliyente oluşturulan nesneler ile şimdi yapılmalıdır. İkincisi, kliyente sunucuya kopyalama mevcut değildir.
  • Orijinal parçalar başarılı bir işlemden sonra hasar görmez. Çoğu durumda, önbelleğe döndürülen PartOperations ile aynı yere ebeveyn olmalısınız, ardından tüm orijinal parçaları yok etmek için Destroy() .

  • Varsayılan olarak, sonuçta oluşturulan PartOperations 'in yüz renkleri, orijinal parçaların Color özelliğinden ödünç alınmıştır, ancak onları belirli bir renge değiştirmek için UsePartColor özelliğini etkinleşt

  • Eğer bir çıkarma işlemi 20.000'den fazla üçgenle sonuçlanırsa, onlar 20.000 olarak basitlendi. Bu, kod ile PartOperations sonucunu verir.

  • Ana bölümün işlemini hesaplarken hareket ediyorsa, döndürülen bölümleri ana bölümün güncellenmiş CFrame ile ayarlayabilirsiniz, çünkü döndürülen bölümler ana bölümün aynı koordinat alanındadır.

  • Bu yöntemi kullanırken bir PartOperation kullanarak

Parametreler

part: Instance

Ana Part veya PartOperation üzerinde çalışmak için.

parts: Array

Ana parçadan düşürülmesi gereken parçaların matrisi.

options: Dictionary

Yöntem için tüm kontrolleri içeren seçenek tablosu:

  • CollisionFidelity – Sonuçta bölümlerde CollisionFidelity ile olan çarpışma değerini.
  • RenderFidelity – Sonuçta oluşturulan parçalardaki RenderFidelity değerinin.
  • FluidFidelity – Sonuçta bir parçadaki FluidFidelity değerinin.
  • SplitApart – Booletoğlu objelerin bütünü bir arada tutulupya dağıtılmasını mı kontrol edecek yoksa ayrı ayrı dağıtılmasını mı kontrol edecek.Varsayılan true (ayrılma).
Varsayılan değer: "nil"

Dönüşler

Ana parçanın geometrisinden bir veya daha fazla PartOperations kaynaklanan bir parçadır ( part ) diğer parçaların geometrisinden düşük.

Kod Örnekleri

GeometryService:SubtractAsync()

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

Bekletir

Ana parçadan veya verilen arkadaşın başka bir parçasının işgali alanından bir veya daha fazla PartOperations oluşturur. Sadece il

Aşağıdaki özelliklerden ana kısımdan ( part ) uygulanan sonuç PartOperations :

Aşağıdaki görsel karşılaştırmasında, UnionAsync() ün mor silindir içeren bir matrisi kullanarak adlandırılır. Sonuçta PartOperation şekillenir, her iki parçanın birleşik geometrisinin bir şeklini oluşturur.

Block and cylinder parts overlapping

<figcaption>Ayrı parçalar</figcaption>
Parts joined together into a single solid union

<figcaption>Sonuç <code>Class.PartOperation</code> ></figcaption>

Notlar

  • Class.BasePart:UnionAsync() ile karşılaştırıldığında, bu yöntem şu şekilde farklı:

    • Giriş parçalarının sahneye bağlanması gerekmez, böylece arka plan işlemleri için izin verilir.
    • SplitApart seçeneği true (Varsayılan) olarak ayarlandığında, her bir ayrı beden kendi PartOperation 'ında döndürülür.
    • Döndürülen her bir parçanın yerleştirme alanı ana bölümün koordinat alanındadır. Bu, her döndürülen herhangi bir parçanın (0, 0, 0) merkezinde olmadığı anlamına gelir.
    • Bu yöntemi kliyente çağırmanız mümkündür, ancak bazı sınırlamalarla. İlk olarak, kliyente oluşturulan nesneler ile şimdi yapılmalıdır. İkincisi, kliyente sunucuya kopyalama mevcut değildir.
  • Orijinal parçalar başarılı bir işlemden sonra hasar görmez. Çoğu durumda, önbelleğe döndürülen PartOperations ile aynı yere ebeveyn olmalısınız, ardından tüm orijinal parçaları yok etmek için Destroy() .

  • Varsayılan olarak, sonuçta oluşturulan renkler, orijinal parçaların PartOperations özelliğinden ödünç alınır, ancak onları Color özelliğine değiştirmek için onları özel bir renge değiştirebilirsiniz.

  • Bir Birliğin işlemi 20.000'den fazla üçgenle sonuçlandıysa, işlem 20.000 olarak basitleştirilecek. Bu, kod ile PartOperations ile sonuçlanacaktır.

  • Ana bölümün işlemini hesaplarken hareket ediyorsa, döndürülen bölümleri ana bölümün güncellenmiş CFrame ile ayarlayabilirsiniz, çünkü döndürülen bölümler ana bölümün aynı koordinat alanındadır.

  • Bu yöntemi kullanırken bir PartOperation kullanarak

Parametreler

part: Instance

Ana Part veya PartOperation üzerinde çalışmak için.

parts: Array

Ana bölümle birleştirilecek parçaların matrisi.

options: Dictionary

Yöntem için tüm kontrolleri içeren seçenek tablosu:

  • CollisionFidelity – Sonuçta bölümlerde CollisionFidelity ile olan çarpışma değerini.
  • RenderFidelity – Sonuçta oluşturulan parçalardaki RenderFidelity değerinin.
  • FluidFidelity – Sonuçta bir parçadaki FluidFidelity değerinin.
  • SplitApart – Booletoğlu objelerin bütünü bir arada tutulupya dağıtılmasını mı kontrol edecek yoksa ayrı ayrı dağıtılmasını mı kontrol edecek.Varsayılan true (ayrılma).
Varsayılan değer: "nil"

Dönüşler

Ana parçanın geometrisinden bir veya daha fazla PartOperations plus diğer parçaların geometrisinden.

Kod Örnekleri

GeometryService:UnionAsync()

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

Etkinlikler