GeometryService

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Tidak Dapat Dibuat
Layanan

Layanan yang berisi operasi geometris tidak terkait langsung dengan objek tertentu.

Rangkuman

Metode

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

source: Instance

Objek asli yang operasi pemodelan padat dilakukan, misalnya part di UnionAsync() .

Nilai Default: ""
destination: Array
Nilai Default: ""
options: Dictionary

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.
Nilai Default: "nil"

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().

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,
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

Hasil

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.

Two block parts overlapping

<figcaption>Bagian terpisah</figcaption>
Parts intersected into a new solid model

<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

part: Instance

Utama Part atau PartOperation untuk beroperasi.

Nilai Default: ""
parts: Array

배열 dari bagian untuk bertemu dengan bagian utama. Array of parts to intersect with the main part.

Nilai Default: ""
options: Dictionary

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).
Nilai Default: "nil"

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.

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

Hasil

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.

Longer block overlapping a cylinder

<figcaption>Bagian terpisah</figcaption>
Block part subtracted from cylinder

<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

part: Instance

Utama Part atau PartOperation untuk beroperasi.

Nilai Default: ""
parts: Array

Array bagian untuk dikurangkan dari bagian utama.

Nilai Default: ""
options: Dictionary

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).
Nilai Default: "nil"

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.

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

Hasil

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.

Block and cylinder parts overlapping

<figcaption>Bagian terpisah</figcaption>
Parts joined together into a single solid union

<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

part: Instance

Utama Part atau PartOperation untuk beroperasi.

Nilai Default: ""
parts: Array

배열 dari bagian untuk bergabung dengan bagian utama. Array of parts to union with the main part.

Nilai Default: ""
options: Dictionary

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).
Nilai Default: "nil"

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.

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

Acara