GeometryService

Hiển Thị Bản Đã Lỗi Thời

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Không Thể Tạo
Dịch Vụ

Dịch vụ chứa các hoạt động hình học không liên quan trực tiếp đến các đối tượng cụ thể.

Tóm Tắt

Phương Pháp

Thuộc Tính

Phương Pháp

CalculateConstraintsToPreserve

Trả về một bảng của ConstraintsAttachments mà bạn có thể chọn lưu giữ, cùng với các cha mẹ tương ứng của chúng.Lặp lại trên bảng này cho phép bạn quyết định có nên sửa lại các hạn chế được đề xuất và phụ kiện cho cha mẹ tương ứng của chúng hay không.

Lưu ý rằng bảng từ điển options có thể chứa các thành phần theo dõi:

  • tolerance — Độ dung sai khoảng cách, về việc bảo tồn Attachment giữa phần đính kèm và điểm gần nhất trên bề mặt phần gốc so với điểm gần nhất trên bề mặt phần kết quả.Nếu khoảng cách kết quả theo sau quá trình mô hình hóa rắn chắc lớn hơn giá trị này, Parent của các phụ kiện và các hạn chế liên quan của chúng sẽ là nil trong bảng khuyến nghị trả về.
  • weldConstraintPreserve — Một giá trị enum Enum.WeldConstraintPreserve mô tả cách WeldConstraints được bảo tồn trong bảng khuyến nghị kết quả.
  • dropAttachmentsWithoutConstraints — Boolean với giá trị mặc định là true . Nếu được đặt thành false , Attachments những có không có Constraints sẽ được giữ lại.

Tham Số

source: Instance

Một đối tượng ban đầu mà hoạt động mô hình hóa rắn chắc được thực hiện, ví dụ part trong UnionAsync() .

Giá Trị Mặc Định: ""
destination: Array
Giá Trị Mặc Định: ""
options: Dictionary

Từ điển các tùy chọn cho phương thức:

  • tolerance — Độ dung sai khoảng cách, về việc bảo tồn Attachment giữa phần đính kèm và điểm gần nhất trên bề mặt phần gốc so với điểm gần nhất trên bề mặt phần kết quả.Nếu khoảng cách kết quả theo sau quá trình mô hình hóa rắn chắc lớn hơn giá trị này, Parent của các phụ kiện và các hạn chế liên quan của chúng sẽ là nil trong bảng khuyến nghị trả về.
  • weldConstraintPreserve — Một giá trị enum Enum.WeldConstraintPreserve mô tả cách WeldConstraints được bảo tồn trong bảng khuyến nghị kết quả.
  • dropAttachmentsWithoutConstraints — Boolean với giá trị mặc định là true . Nếu được đặt thành false , Attachments những có không có Constraints sẽ được giữ lại.
Giá Trị Mặc Định: "nil"

Lợi Nhuận

Bảng chứa thông tin cho trường hợp chung Constraints , NoCollisionConstraints , và WeldConstraints .Trong trường hợp một Attachment hoặc Constraint nên bị loại bỏ, cha mẹ tương ứng sẽ là nil .

Đối với trường hợp chung Constraints như HingeConstraint :


<th>Loại</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Tệp kèm theo</code></td>
<td><code>Lớp.附件</code></td>
</tr>
<tr>
<td><code>Hạn chế</code></td>
<td><code>Lớp.Hạn chế</code> hoặc <code>nil</code></td>
</tr>
<tr>
<td><code>Phụ huynh kèm theo</code></td>
<td><code>Lớp.BasePart</code> hoặc <code>nil</code></td>
</tr>
<tr>
<td><code>ConstraintParent</code></td>
<td><code>Lớp.BasePart</code> hoặc <code>nil</code></td>
</tr>
</tbody>
Nhân vật chính

Đối với WeldConstraints :


<th>Loại</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Hàn Giới Hạn</code></td>
<td><code>Class.WeldConstraint
Ngôn ngữ
Tiếng Anh</code></td>
</tr>
<tr>
<td><code>WeldConstraintParent của</code></td>
<td><code>Lớp.BasePart</code> hoặc <code>nil</code></td>
</tr>
<tr>
<td><code>Phần WeldConstraintPart0</code></td>
<td><code>Lới.BasePart</code></td>
</tr>
<tr>
<td><code>Phần Hàn Giới Hạn1</code></td>
<td><code>Lới.BasePart</code></td>
</tr>
</tbody>
Nhân vật chính

Đối với NoCollisionConstraints :


<th>Loại</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Không có hạn chế va chạm</code></td>
<td><code>Class.NoCollisionConstraint không va chạm</code></td>
</tr>
<tr>
<td><code>Không có hạn chế va chạm chaParent</code></td>
<td><code>Lớp.BasePart</code> hoặc <code>nil</code></td>
</tr>
<tr>
<td><code>Không có phần hạn chế va chạm NoCollisionConstraintPart0</code></td>
<td><code>Lới.BasePart</code></td>
</tr>
<tr>
<td><code>Không có phần hạn chế va chạm NoCollisionConstraintPart1</code></td>
<td><code>Lới.BasePart</code></td>
</tr>
</tbody>
Nhân vật chính

Mẫu mã

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

Sinh Lợi

Tạo một hoặc nhiều PartOperations từ định dạng định hình chồng lấp của phần chính và các phần khác trong danh sách được cho.Chỉ hỗ trợ các primitive PartsPartOperations đơn giản, không phải Terrain hoặc MeshParts .Giống như Clone() , các bộ phận được trả về không có set Parent .

Các thuộc tính sau đây từ phần chính ( part) được áp dụng cho kết quả PartOperations :

Trong so sánh hình ảnh tiếp theo, IntersectAsync() được gọi bằng cách sử dụng khối màu tím và một mảng chứa khối xanh.Kết quả PartOperation cuối cùng được giải quyết thành một hình dạng của hình học giao nhau của cả hai phần.

Two block parts overlapping

<figcaption>Phân tách các bộ phận</figcaption>
Parts intersected into a new solid model

<figcaption>Kết quả <code>Lớp.PartOperation</code> ></figcaption>

Ghi chú

  • So với BasePart:IntersectAsync(), phương pháp này khác nhau như sau:

    • Các bộ phận nhập không cần phải được gán cho cảnh, cho phép thực hiện các hoạt động nền.
    • Khi tùy chọn SplitApart được đặt thành true (mặc định), mỗi cơ thể riêng biệt sẽ được trả về trong chính PartOperation của nó.
    • Mỗi một phần trả về nằm trong không gian phối trí của phần chính.Điều này có nghĩa là (0, 0, 0) của bất kỳ phần nào được trả về không nhất thiết phải ở trung tâm của cơ thân.
    • Bạn có thể gọi phương thức này trên khách hàng, nhưng với một số hạn chế.Trước tiên, hiện tại phải được thực hiện với các đối tượng được tạo ra trên máy khách.Thứ hai, không có sự sao lưu nào từ khách hàng lên máy chủ.
  • Các bộ phận ban đầu vẫn nguyên vẹn sau khi hoạt động thành công.Trong hầu hết các trường hợp, bạn nên cha con trả về PartOperations vào cùng một nơi với phần chính, sau đó Destroy() tất cả các phần gốc.

  • Mặc định, màu sắc khuôn mặt của kết quả PartOperations được lấy từ thuộc tính Color của các bộ phận gốc, mặc dù bạn có thể bật chức năng UsePartColor của chúng để thay đổi chúng thành một màu cụ thể.

  • Nếu một hoạt động chồng lấp sẽ dẫn đến bất kỳ PartOperations với hơn 20,000 tam giác, chúng sẽ được đơn giản hóa thành 20,000Điều này sẽ dẫn đến một lỗi với mã -14 .

  • Nếu phần chính di chuyển trong quá trình tính toán hoạt động, bạn có thể đặt các phần kết quả lên phần chính được cập nhật CFrame , vì các phần trả về nằm trong cùng một không gian phối trí với phần chính.

  • Nếu sử dụng phương pháp này với một PartOperation như phần chính, bạn có thể thay thế định dạng hình học của một phần khác PartOperation thông qua SubstituteGeometry() , làm cho việc sử dụng định dạng hình học của hoạt động trở nên dễ dàng hơn nhưng giữ lại các tính chất, thuộc tính, thẻ và con của phần chính chính như Attachments , Constraints , ParticleEmitters , các đối tượng nhẹ và dấu hiệu.Cách tiếp cận này cũng tránh được "chớp mắt" tiềm năng hoàn toàn thay thế ban đầu PartOperation bằng cách khác.

Tham Số

part: Instance

Chính Part hoặc PartOperation để hoạt động.

Giá Trị Mặc Định: ""
parts: Array

Mảng các bộ phận để giao nhau với phần chính.

Giá Trị Mặc Định: ""
options: Dictionary

Bảng tùy chọn chứa tất cả các điều khiển cho phương thức:

  • CollisionFidelity — Giá trị của CollisionFidelity trong các phần kết quả.
  • RenderFidelity — Giá trị của RenderFidelity trong các phần kết quả.
  • FluidFidelity — Giá trị của FluidFidelity trong các phần kết quả.
  • SplitApart — Boolean kiểm soát xem các đối tượng có nên được giữ cùng nhau hay tách rời đúng cách. Mặc định là true (phân tách).
Giá Trị Mặc Định: "nil"

Lợi Nhuận

Một hoặc nhiều PartOperations từ định hình giao nhau của phần chính ( part ) và các phần khác.

Mẫu mã

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

Sinh Lợi

Tạo một hoặc nhiều PartOperations từ phần chính trừ điểm hình học bị chiếm bởi các phần khác trong mảng được cho.Chỉ hỗ trợ các primitive PartsPartOperations đơn giản, không phải Terrain hoặc MeshParts .Giống như Clone() , các bộ phận được trả về không có set Parent .

Các thuộc tính sau đây từ phần chính ( part) được áp dụng cho kết quả PartOperations :

Trong so sánh hình ảnh tiếp theo, SubtractAsync() được gọi bằng cách sử dụng xi lanh xanh và một mảng chứa khối tím.Kết quả PartOperation cuối cùng được giải quyết thành một hình dạng loại bỏ địa hình của khối khỏi địa hình của xi lanh.

Longer block overlapping a cylinder

<figcaption>Phân tách các bộ phận</figcaption>
Block part subtracted from cylinder

<figcaption>Kết quả <code>Lớp.PartOperation</code> ></figcaption>

Ghi chú

  • So với BasePart:SubtractAsync(), phương pháp này khác nhau như sau:

    • Các bộ phận nhập không cần phải được gán cho cảnh, cho phép thực hiện các hoạt động nền.
    • Khi tùy chọn SplitApart được đặt thành true (mặc định), mỗi cơ thể riêng biệt sẽ được trả về trong chính PartOperation của nó.
    • Mỗi một phần trả về nằm trong không gian phối trí của phần chính.Điều này có nghĩa là (0, 0, 0) của bất kỳ phần nào được trả về không nhất thiết phải ở trung tâm của cơ thân.
    • Bạn có thể gọi phương thức này trên khách hàng, nhưng với một số hạn chế.Trước tiên, hiện tại phải được thực hiện với các đối tượng được tạo ra trên máy khách.Thứ hai, không có sự sao lưu nào từ khách hàng lên máy chủ.
  • Các bộ phận ban đầu vẫn nguyên vẹn sau khi hoạt động thành công.Trong hầu hết các trường hợp, bạn nên cha con trả về PartOperations vào cùng một nơi với phần chính, sau đó Destroy() tất cả các phần gốc.

  • Mặc định, màu sắc khuôn mặt của kết quả PartOperations được lấy từ thuộc tính Color của các bộ phận gốc, mặc dù bạn có thể bật chức năng UsePartColor của chúng để thay đổi chúng thành một màu cụ thể.

  • Nếu một hoạt động trừ có kết quả là bất kỳ PartOperations với hơn 20,000 tam giác, chúng sẽ được đơn giản hóa thành 20,000Điều này sẽ dẫn đến một lỗi với mã -14 .

  • Nếu phần chính di chuyển trong quá trình tính toán hoạt động, bạn có thể đặt các phần kết quả lên phần chính được cập nhật CFrame , vì các phần trả về nằm trong cùng một không gian phối trí với phần chính.

  • Nếu sử dụng phương pháp này với một PartOperation như phần chính, bạn có thể thay thế định dạng hình học của một phần khác PartOperation thông qua SubstituteGeometry() , làm cho việc sử dụng định dạng hình học của hoạt động trở nên dễ dàng hơn nhưng giữ lại các tính chất, thuộc tính, thẻ và con của phần chính chính như Attachments , Constraints , ParticleEmitters , các đối tượng nhẹ và dấu hiệu.Cách tiếp cận này cũng tránh được "chớp mắt" tiềm năng hoàn toàn thay thế ban đầu PartOperation bằng cách khác.

Tham Số

part: Instance

Chính Part hoặc PartOperation để hoạt động.

Giá Trị Mặc Định: ""
parts: Array

Mảng các bộ phận để trừ khỏi phần chính.

Giá Trị Mặc Định: ""
options: Dictionary

Bảng tùy chọn chứa tất cả các điều khiển cho phương thức:

  • CollisionFidelity — Giá trị của CollisionFidelity trong các phần kết quả.
  • RenderFidelity — Giá trị của RenderFidelity trong các phần kết quả.
  • FluidFidelity — Giá trị của FluidFidelity trong các phần kết quả.
  • SplitApart — Boolean kiểm soát xem các đối tượng có nên được giữ cùng nhau hay tách rời đúng cách. Mặc định là true (phân tách).
Giá Trị Mặc Định: "nil"

Lợi Nhuận

Một hoặc nhiều PartOperations từ định hình của phần chính ( part ) trừ định hình bị chiếm bởi các phần khác.

Mẫu mã

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

Sinh Lợi

Tạo một hoặc nhiều PartOperations từ phần chính cộng với định dạng được chiếm bởi các phần khác trong mảng được cho.Chỉ hỗ trợ các primitive PartsPartOperations đơn giản, không phải Terrain hoặc MeshParts .Giống như Clone() , các bộ phận được trả về không có set Parent .

Các thuộc tính sau đây từ phần chính ( part) được áp dụng cho kết quả PartOperations :

Trong so sánh hình ảnh tiếp theo, UnionAsync() được gọi bằng cách sử dụng khối xanh và một mảng chứa hình trụ màu tím.Kết quả PartOperation cuối cùng được giải quyết thành một hình dạng của địa hình kết hợp của cả hai phần.

Block and cylinder parts overlapping

<figcaption>Phân tách các bộ phận</figcaption>
Parts joined together into a single solid union

<figcaption>Kết quả <code>Lớp.PartOperation</code> ></figcaption>

Ghi chú

  • So với BasePart:UnionAsync(), phương pháp này khác nhau như sau:

    • Các bộ phận nhập không cần phải được gán cho cảnh, cho phép thực hiện các hoạt động nền.
    • Khi tùy chọn SplitApart được đặt thành true (mặc định), mỗi cơ thể riêng biệt sẽ được trả về trong chính PartOperation của nó.
    • Mỗi một phần trả về nằm trong không gian phối trí của phần chính.Điều này có nghĩa là (0, 0, 0) của bất kỳ phần nào được trả về không nhất thiết phải ở trung tâm của cơ thân.
    • Bạn có thể gọi phương thức này trên khách hàng, nhưng với một số hạn chế.Trước tiên, hiện tại phải được thực hiện với các đối tượng được tạo ra trên máy khách.Thứ hai, không có sự sao lưu nào từ khách hàng lên máy chủ.
  • Các bộ phận ban đầu vẫn nguyên vẹn sau khi hoạt động thành công.Trong hầu hết các trường hợp, bạn nên cha con trả về PartOperations vào cùng một nơi với phần chính, sau đó Destroy() tất cả các phần gốc.

  • Mặc định, màu sắc của kết quả PartOperations được lấy từ thuộc tính Color của các bộ phận gốc, mặc dù bạn có thể bật chức năng UsePartColor của chúng để thay đổi chúng thành một màu cụ thể.

  • Nếu một hoạt động liên minh sẽ dẫn đến bất kỳ PartOperations với hơn 20,000 tam giác, chúng sẽ được đơn giản hóa thành 20,000.Điều này sẽ dẫn đến một lỗi với mã -14 .

  • Nếu phần chính di chuyển trong quá trình tính toán hoạt động, bạn có thể đặt các phần kết quả lên phần chính được cập nhật CFrame , vì các phần trả về nằm trong cùng một không gian phối trí với phần chính.

  • Nếu sử dụng phương pháp này với một PartOperation như phần chính, bạn có thể thay thế định dạng hình học của một phần khác PartOperation thông qua SubstituteGeometry() , làm cho việc sử dụng định dạng hình học của hoạt động trở nên dễ dàng hơn nhưng giữ lại các tính chất, thuộc tính, thẻ và con của phần chính chính như Attachments , Constraints , ParticleEmitters , các đối tượng nhẹ và dấu hiệu.Cách tiếp cận này cũng tránh được "chớp mắt" tiềm năng hoàn toàn thay thế ban đầu PartOperation bằng cách khác.

Tham Số

part: Instance

Chính Part hoặc PartOperation để hoạt động.

Giá Trị Mặc Định: ""
parts: Array

Mảng các bộ phận để kết hợp với bộ phận chính.

Giá Trị Mặc Định: ""
options: Dictionary

Bảng tùy chọn chứa tất cả các điều khiển cho phương thức:

  • CollisionFidelity — Giá trị của CollisionFidelity trong các phần kết quả.
  • RenderFidelity — Giá trị của RenderFidelity trong các phần kết quả.
  • FluidFidelity — Giá trị của FluidFidelity trong các phần kết quả.
  • SplitApart — Boolean kiểm soát xem các đối tượng có nên được giữ cùng nhau hay tách rời đúng cách. Mặc định là true (phân tách).
Giá Trị Mặc Định: "nil"

Lợi Nhuận

Một hoặc nhiều PartOperations từ định hình của phần chính ( part ) cộng với định hình bị chiếm bởi các phần khác.

Mẫu mã

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

Sự Kiện