GeometryService
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Layanan yang berisi operasi geometris tidak terkait langsung dengan objek tertentu.
Rangkuman
Metode
Kembalikan tabel dari Constraints dan Attachments yang dapat Anda pilih untuk disimpan, bersama dengan orang tua masing-masing.
Membuat satu atau lebih PartOperations dari geometri berpotongan dari satu bagian dan bagian lainnya.
Membuat satu atau lebih PartOperations dari satu bagian minus geometri yang ditempati oleh bagian lain.
Membuat satu atau lebih PartOperations dari satu bagian plus geometri yang ditempati oleh bagian lain.
Properti
Metode
CalculateConstraintsToPreserve
Kembalikan tabel dari Constraints dan Attachments yang dapat Anda pilih untuk disimpan, bersama dengan orang tua masing-masing.Mengulangi di atas tabel ini memungkinkan Anda memutuskan apakah akan memperbaiki batasan dan lampiran yang direkomendasikan kepada orang tua masing-masing.
Perhatikan bahwa kamus options dapat berisi hal mengikuti:
- tolerance — Toleransi jarak, dalam hal penyimpanan Attachment , antara lampiran dan titik terdekat di permukaan bagian asli versus titik terdekat di permukaan bagian hasil.Jika jarak yang dihasilkan setelah operasi pemodelan padat lebih besar dari nilai ini, Parent lampir dan kendala terkaitnya akan menjadi nil di tabel rekomendasi yang dikembalikan.
- weldConstraintPreserve — Sebuah nilai enum Enum.WeldConstraintPreserve yang menggambarkan bagaimana WeldConstraints dipertahankan dalam tabel rekomendasi yang dihasilkan.
- dropAttachmentsWithoutConstraints — Boolean dengan default dari true . Jika ditetapkan ke false , Attachments yang tidak memiliki Constraints akan dipertahankan.
Parameter
Objek asli yang operasi pemodelan padat dilakukan, misalnya part di UnionAsync() .
Diksi opsi untuk metode:
- tolerance — Toleransi jarak, dalam hal penyimpanan Attachment , antara lampiran dan titik terdekat di permukaan bagian asli versus titik terdekat di permukaan bagian hasil.Jika jarak yang dihasilkan setelah operasi pemodelan padat lebih besar dari nilai ini, Parent lampir dan kendala terkaitnya akan menjadi nil di tabel rekomendasi yang dikembalikan.
- weldConstraintPreserve — Sebuah nilai enum Enum.WeldConstraintPreserve yang menggambarkan bagaimana WeldConstraints dipertahankan dalam tabel rekomendasi yang dihasilkan.
- dropAttachmentsWithoutConstraints — Boolean dengan default dari true . Jika ditetapkan ke false , Attachments yang tidak memiliki Constraints akan dipertahankan.
Memberikan nilai
Tabel yang berisi informasi untuk kasus umum Constraints , NoCollisionConstraints , dan WeldConstraints .Dalam kasus di mana Attachment atau Constraint harus dihapus, orang tuanya masing-masing akan menjadi nil .
Untuk kasus umum Constraints seperti HingeConstraint :
<th>Jenis</th></tr></thead><tbody><tr><td><code>Lampir</code></td><td><code>Kelas.Attachment</code></td></tr><tr><td><code>Kontraksi</code></td><td><code>Klasifikasi.Kontraksi</code> atau <code>nol</code></td></tr><tr><td><code>Orangtua lampir</code></td><td><code>Kelas.BasePart</code> atau <code>nol</code></td></tr><tr><td><code>Orangtua Batasan</code></td><td><code>Kelas.BasePart</code> atau <code>nol</code></td></tr></tbody>
Kunci |
---|
Untuk WeldConstraints :
<th>Jenis</th></tr></thead><tbody><tr><td><code>Kontraksi Las</code></td><td><code>Kelas.WeldConstraint</code></td></tr><tr><td><code>Konstruksi Pembatasan Ayah</code></td><td><code>Kelas.BasePart</code> atau <code>nol</code></td></tr><tr><td><code>Bagian Konstruksi Las Pengekangan0</code></td><td><code>Kelas.BasePart</code></td></tr><tr><td><code>Bagian Kekuatan Las1</code></td><td><code>Kelas.BasePart</code></td></tr></tbody>
Kunci |
---|
Untuk NoCollisionConstraints :
<th>Jenis</th></tr></thead><tbody><tr><td><code>Kontraksi Tidak Tabrakan</code></td><td><code>Klasifikasi.NoCollisionConstraint</code></td></tr><tr><td><code>Tak ada Batasan Tabrakan Orangtua</code></td><td><code>Kelas.BasePart</code> atau <code>nol</code></td></tr><tr><td><code>Tidak ada Bagian Batasan Tabrakan0</code></td><td><code>Kelas.BasePart</code></td></tr><tr><td><code>Tidak ada Bagian Batasan Tabrakan1</code></td><td><code>Kelas.BasePart</code></td></tr></tbody>
Kunci |
---|
Contoh Kode
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
Membuat satu atau lebih PartOperations dari geometri berpotongan dari bagian utama dan bagian lain dalam array yang diberikan.Hanya primitif Parts dan PartOperations yang didukung, bukan Terrain atau MeshParts.Mirip dengan Clone() , bagian yang dikembalikan tidak memiliki set Parent .
Properti berikut dari bagian utama ( part ) diterapkan ke PartOperations yang dihasilkan:
Dalam perbandingan gambar berikut, IntersectAsync() dipanggil menggunakan blok ungu dan array yang berisi blok biru.Hasilnya PartOperation memecahkan menjadi bentuk geometri interseks dari kedua bagian.

<figcaption>Bagian terpisah</figcaption>

<figcaption>Hasilnya <code>Class.PartOperation</code></figcaption>
Catatan
Dibandingkan dengan BasePart:IntersectAsync(), metode ini berbeda sebagai berikut:
- Bagian input tidak perlu diserahkan ke adegan, memungkinkan operasi latar belakang.
- Ketika opsi SplitApart diatur ke true ( default ), setiap tubuh berbeda akan dikembalikan dalam PartOperation sendiri.
- Masing-masing bagian yang dikembalikan berada di ruang koordinat bagian utama.Ini berarti bahwa (0, 0, 0) dari bagian yang dikembalikan tidak harus berada di pusat tubuhnya.
- Dimungkinkan untuk memanggil metode ini pada klien, tetapi dengan beberapa batasan.Pertama, saat ini harus dilakukan dengan objek dibuat di klien.Kedua, tidak ada replikasi yang tersedia dari klien ke server.
Bagian asli tetap utuh setelah operasi berhasil.Dalam kebanyakan kasus, Anda harus membesarkan kembali PartOperations ke tempat yang sama dengan bagian utama, lalu Destroy() semua bagian asli.
Secara default, warna wajah dari hasilnya PartOperations diambil dari properti Color dari bagian asli, meskipun Anda dapat mengaktifkan properti UsePartColor mereka untuk mengubahnya menjadi warna tertentu.
Jika operasi intersepsi akan menghasilkan salah satu PartOperations dengan lebih dari 20.000 segi, mereka akan disederhanakan menjadi 20.000.Ini akan menyebabkan kesalahan dengan kode -14 .
Jika bagian utama bergerak selama perhitungan operasi, Anda dapat mengatur bagian hasil ke bagian utama yang diperbarui CFrame, karena bagian yang dikembalikan berada di ruang koordinat yang sama dengan bagian utama.
Jika menggunakan metode ini dengan PartOperation sebagai bagian utama, Anda dapat menggantikan geometri dari lain PartOperation melalui SubstituteGeometry() , memudahkan untuk menggunakan geometri operasi tetapi mempertahankan properti, atribut, tag, dan anak-anak bagian utama seperti Attachments , Constraints , ParticleEmitters , objek ringan, dan decal.Pendekatan ini juga mengelilingi "flicker" potensial penggantian sepenuhnya asli PartOperation dengan yang lain.
Parameter
Utama Part atau PartOperation untuk beroperasi.
배열 dari bagian untuk bertemu dengan bagian utama. Array of parts to intersect with the main part.
Tabel opsi yang berisi semua kontrol untuk metode:
- CollisionFidelity — Nilai dari CollisionFidelity di bagian yang dihasilkan.
- RenderFidelity — Nilai dari RenderFidelity di bagian yang dihasilkan.
- FluidFidelity — Nilai dari FluidFidelity di bagian yang dihasilkan.
- SplitApart — Boolean mengontrol apakah objek harus semua disimpan bersama atau dibagi dengan benar. Default adalah true (dibagi).
Memberikan nilai
Satu atau lebih PartOperations dari geometri berpotongan dari bagian utama ( part ) dan bagian lainnya.
Contoh Kode
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
Membuat satu atau lebih PartOperations dari bagian utama minus geometri yang ditempati oleh bagian lain dalam array yang diberikan.Hanya primitif Parts dan PartOperations yang didukung, bukan Terrain atau MeshParts.Mirip dengan Clone() , bagian yang dikembalikan tidak memiliki set Parent .
Properti berikut dari bagian utama ( part ) diterapkan ke PartOperations yang dihasilkan:
Dalam perbandingan gambar berikut, SubtractAsync() dipanggil menggunakan silinder biru dan array yang berisi blok ungu.Hasilnya PartOperation memecahkan menjadi bentuk yang menghilangkan geometri blok dari silinder.

<figcaption>Bagian terpisah</figcaption>

<figcaption>Hasilnya <code>Class.PartOperation</code></figcaption>
Catatan
Dibandingkan dengan BasePart:SubtractAsync(), metode ini berbeda sebagai berikut:
- Bagian input tidak perlu diserahkan ke adegan, memungkinkan operasi latar belakang.
- Ketika opsi SplitApart diatur ke true ( default ), setiap tubuh berbeda akan dikembalikan dalam PartOperation sendiri.
- Masing-masing bagian yang dikembalikan berada di ruang koordinat bagian utama.Ini berarti bahwa (0, 0, 0) dari bagian yang dikembalikan tidak harus berada di pusat tubuhnya.
- Dimungkinkan untuk memanggil metode ini pada klien, tetapi dengan beberapa batasan.Pertama, saat ini harus dilakukan dengan objek dibuat di klien.Kedua, tidak ada replikasi yang tersedia dari klien ke server.
Bagian asli tetap utuh setelah operasi berhasil.Dalam kebanyakan kasus, Anda harus membesarkan kembali PartOperations ke tempat yang sama dengan bagian utama, lalu Destroy() semua bagian asli.
Secara default, warna wajah dari hasilnya PartOperations diambil dari properti Color dari bagian asli, meskipun Anda dapat mengaktifkan properti UsePartColor mereka untuk mengubahnya menjadi warna tertentu.
Jika operasi pengurangan akan menghasilkan apa pun PartOperations dengan lebih dari 20.000 segi, mereka akan disederhanakan menjadi 20.000.Ini akan menyebabkan kesalahan dengan kode -14 .
Jika bagian utama bergerak selama perhitungan operasi, Anda dapat mengatur bagian hasil ke bagian utama yang diperbarui CFrame, karena bagian yang dikembalikan berada di ruang koordinat yang sama dengan bagian utama.
Jika menggunakan metode ini dengan PartOperation sebagai bagian utama, Anda dapat menggantikan geometri dari lain PartOperation melalui SubstituteGeometry() , memudahkan untuk menggunakan geometri operasi tetapi mempertahankan properti, atribut, tag, dan anak-anak bagian utama seperti Attachments , Constraints , ParticleEmitters , objek ringan, dan decal.Pendekatan ini juga mengelilingi "flicker" potensial penggantian sepenuhnya asli PartOperation dengan yang lain.
Parameter
Utama Part atau PartOperation untuk beroperasi.
Array bagian untuk dikurangkan dari bagian utama.
Tabel opsi yang berisi semua kontrol untuk metode:
- CollisionFidelity — Nilai dari CollisionFidelity di bagian yang dihasilkan.
- RenderFidelity — Nilai dari RenderFidelity di bagian yang dihasilkan.
- FluidFidelity — Nilai dari FluidFidelity di bagian yang dihasilkan.
- SplitApart — Boolean mengontrol apakah objek harus semua disimpan bersama atau dibagi dengan benar. Default adalah true (dibagi).
Memberikan nilai
Satu atau lebih PartOperations dari geometri bagian utama ( part ) dikurangi geometri yang ditempati oleh bagian lain.
Contoh Kode
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
Membuat satu atau lebih PartOperations dari bagian utama ditambah geometri yang ditempati oleh bagian lain dalam array yang diberikan.Hanya primitif Parts dan PartOperations yang didukung, bukan Terrain atau MeshParts.Mirip dengan Clone() , bagian yang dikembalikan tidak memiliki set Parent .
Properti berikut dari bagian utama ( part ) diterapkan ke PartOperations yang dihasilkan:
Dalam perbandingan gambar berikut, UnionAsync() dipanggil menggunakan blok biru dan array yang berisi silinder ungu.Hasilnya PartOperation memecahkan menjadi bentuk geometri gabungan dari kedua bagian.

<figcaption>Bagian terpisah</figcaption>

<figcaption>Hasilnya <code>Class.PartOperation</code></figcaption>
Catatan
Dibandingkan dengan BasePart:UnionAsync(), metode ini berbeda sebagai berikut:
- Bagian input tidak perlu diserahkan ke adegan, memungkinkan operasi latar belakang.
- Ketika opsi SplitApart diatur ke true ( default ), setiap tubuh berbeda akan dikembalikan dalam PartOperation sendiri.
- Masing-masing bagian yang dikembalikan berada di ruang koordinat bagian utama.Ini berarti bahwa (0, 0, 0) dari bagian yang dikembalikan tidak harus berada di pusat tubuhnya.
- Dimungkinkan untuk memanggil metode ini pada klien, tetapi dengan beberapa batasan.Pertama, saat ini harus dilakukan dengan objek dibuat di klien.Kedua, tidak ada replikasi yang tersedia dari klien ke server.
Bagian asli tetap utuh setelah operasi berhasil.Dalam kebanyakan kasus, Anda harus membesarkan kembali PartOperations ke tempat yang sama dengan bagian utama, lalu Destroy() semua bagian asli.
Secara default, warna dari hasilnya PartOperations diambil dari properti Color dari bagian asli, meskipun Anda dapat mengaktifkan properti UsePartColor mereka untuk mengubahnya menjadi warna tertentu.
Jika operasi serikat akan menghasilkan salah satu PartOperations dengan lebih dari 20.000 segi, mereka akan disederhanakan menjadi 20.000.Ini akan menyebabkan kesalahan dengan kode -14 .
Jika bagian utama bergerak selama perhitungan operasi, Anda dapat mengatur bagian hasil ke bagian utama yang diperbarui CFrame, karena bagian yang dikembalikan berada di ruang koordinat yang sama dengan bagian utama.
Jika menggunakan metode ini dengan PartOperation sebagai bagian utama, Anda dapat menggantikan geometri dari lain PartOperation melalui SubstituteGeometry() , memudahkan untuk menggunakan geometri operasi tetapi mempertahankan properti, atribut, tag, dan anak-anak bagian utama seperti Attachments , Constraints , ParticleEmitters , objek ringan, dan decal.Pendekatan ini juga mengelilingi "flicker" potensial penggantian sepenuhnya asli PartOperation dengan yang lain.
Parameter
Utama Part atau PartOperation untuk beroperasi.
배열 dari bagian untuk bergabung dengan bagian utama. Array of parts to union with the main part.
Tabel opsi yang berisi semua kontrol untuk metode:
- CollisionFidelity — Nilai dari CollisionFidelity di bagian yang dihasilkan.
- RenderFidelity — Nilai dari RenderFidelity di bagian yang dihasilkan.
- FluidFidelity — Nilai dari FluidFidelity di bagian yang dihasilkan.
- SplitApart — Boolean mengontrol apakah objek harus semua disimpan bersama atau dibagi dengan benar. Default adalah true (dibagi).
Memberikan nilai
Satu atau lebih PartOperations dari geometri bagian utama ( part ) ditambah geometri yang ditempati oleh bagian lain.
Contoh Kode
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