EditableMesh 改变链接到 MeshPart 的视觉网格,允许在 Studio 和体验中查询和修改网格。
一个 EditableMesh 可以从现有的 Content 上的 Class.MeshPart 或网格 ID 创建,或使用 Class.
当它链接到一个新的 EditableMesh 时,它会显示在 MeshPart 通过。你可以创建更多 AssetService:CreateMeshPartAsync() 实例,这些实例将参考同一个 2>EditableMesh2> 内容
调用 AssetService:CreateMeshPartAsync() 将重新计算碰撞和流体几何以及任何编辑和更新现有 MeshPart 。 一般来说,建议在概念编辑操作结束时执行此操作。 MeshPart:ApplyMesh() 将更新目标 1> Class.MeshPart
稳定的头/向量 ID
许多 EditableMesh 方法取 vertex , normal</
请注意,ID 不保证在顺序上,因此在垂直或面上循环时,您应该在 GetVertices() 或 GetFaces() 返回的表上循环。
分割垂直属性
一个 vertex 是面的一个角,并且上下文联接面。垂直可以有几个属性:位置、正常、UV坐标、颜色和透明度。
有时候它对所有触摸垂直的面都有用,但有时候您可能想要不同的面使用不同的属性值,但有时候您可能想要不同的面使用不同的属性值在同一垂直上。例如,在光滑的球上,每个垂直面都只有一个普通。 与此相反,在方块角的角落,垂直面将有 3 个不同的普通值(一个为每个邻近面)。
当创建面部时,每个面的每个属性都会默认有一个:普通,一个uv坐标,和一个颜色/透明度。 如果您想要创建一个缝,您应该创建新属性并将其设置在面部。 例如,此代码将创建一个锋利的立方体:
local AssetService = game:GetService("AssetService")
-- 给出 4 个垂直 ID,添加一个新的普通和 2 个三角形,使一个锋利的四角形
local function addSharpQuad(eMesh, vid0, vid1, vid2, vid3)
local nid = eMesh:AddNormal() -- 这将创建一个普通ID,它将自动计算
local fid1 = eMesh:AddTriangle(vid0, vid1, vid2)
eMesh:SetFaceNormals(fid1, {nid, nid, nid})
local fid2 = eMesh:AddTriangle(vid0, vid2, vid3)
eMesh:SetFaceNormals(fid2, {nid, nid, nid})
end
-- 使一个边缘在 6 边之间有间隙的方块
local function makeSharpCube()
local eMesh = AssetService:CreateEditableMesh()
local v1 = eMesh:AddVertex(Vector3.new(0, 0, 0))
local v2 = eMesh:AddVertex(Vector3.new(1, 0, 0))
local v3 = eMesh:AddVertex(Vector3.new(0, 1, 0))
local v4 = eMesh:AddVertex(Vector3.new(1, 1, 0))
local v5 = eMesh:AddVertex(Vector3.new(0, 0, 1))
local v6 = eMesh:AddVertex(Vector3.new(1, 0, 1))
local v7 = eMesh:AddVertex(Vector3.new(0, 1, 1))
local v8 = eMesh:AddVertex(Vector3.new(1, 1, 1))
addSharpQuad(eMesh, v5, v6, v8, v7) -- 前
addSharpQuad(eMesh, v1, v3, v4, v2) -- 返回
addSharpQuad(eMesh, v1, v5, v7, v3) -- 左
addSharpQuad(eMesh, v2, v4, v8, v6) -- 对
addSharpQuad(eMesh, v1, v2, v6, v5) -- 下半身
addSharpQuad(eMesh, v3, v7, v8, v4) -- 顶部
eMesh:RemoveUnused()
return eMesh
end
风景
网格面有前面和后面。 当绘制网格时,默认情况下,只有面的前部分被绘制,尽管您可以通过将网格 DoubleSided 属性设置为 true 。
面部周围的垂直排列是否表示您正在查看前方或返回方。当垂直排列从面部周围逆时针时,面部的前部就会显示。
限制
EditableMesh 目前有一个限制为 60,000 个边和 20,000 个三角形。尝试添加太多边或三角形会导致错误。
概要
方法
给 геомет里添加新颜色,并且返回一个稳定的颜色 ID。
添加一个新的正常值到几何图形,并且返回一个稳定的正常ID。
添加新的三角形到网格,并返回一个稳定的面部 ID。
添加一个新的 UV 到几何图形,并返回一个稳定的 UV ID。
添加一个新的垂直到几何图形,并且返回一个稳定的垂直 ID。
找到网格表面上最近的点。
将最近的边节点找到空间中的特定位置。
查找特定球体内的所有垂直。
返回一个给定面部的列表。
返回给定垂直的一个列表。
返回指定颜色 ID 的颜色。
返回指定颜色 ID 的颜色 alpha (透明度)。
返回网格的所有颜色。
返回面部的颜色 ID 为面部上的垂直。
返回面部的普通ID以面部上的垂直。
返回面部的 UV 身份证号码,用于面部上的垂直。
返回面部的垂直 ID。
返回网格的所有面。
返回使用指定属性 ID 的面的列表。
返回给定的普通 ID 的普通 vector。
返回网格的所有普通值。
获取垂直起降点的位置。
返回给定的 UV ID 上的 UV 坐标。
返回网格的所有 UV。
将所有边角返回为稳定的边角 ID 列表。
返回使用指定属性 ID 的垂直列表。
返回一个描述稳定ID的字符串,用于调试目的。
合并触摸的垂直。
使用其稳定的面部 ID 移除一个面。
移除所有未使用的垂直、普通、UV 和颜色,并且返回已移除的 ID。
重置此普通 ID 以自动计算。
为一个颜色ID 设置颜色。
为一个颜色ID设置颜色 alpha (透明度)。
将面部的垂直颜色设置为新的颜色 ID。
将面部的垂直普通化到新的普通ID。
将面部的垂直 UV 设置为新的 UV ID。
将面的垂直设置为新的垂直 ID。
设置一个正常的ID。
在网格的本地对象空间中设置一个垂直位置。
设置 UV 坐标以便于使用 UV ID。
将网格上的所有面都切分为三角形。
属性
方法
AddColor
给 геомет里添加新颜色,并且返回一个稳定的颜色 ID。
参数
返回
新颜色的稳定颜色 ID。
AddNormal
在几何图形上添加一个新的正常,并且返回一个稳定的正常ID。如果未指定正常值,将会自动计算。
参数
普通向矢量力。如果未指定普通值,将自动计算。
返回
新正常ID的稳定常规。
AddTriangle
添加新的三角形到网格,并返回一个稳定的面部 ID。
参数
返回
新面的稳定面部ID。
Destroy
返回
FindClosestPointOnSurface
在网格表面上找到最近的点。返回面部 ID、指向本地对象空间中的网格、和面部的 barycentric 坐标。请参阅 RaycastLocal() 获取更多关于 barycentric 坐标的信息。
参数
在网格的本地对象空间中的位置。
返回
面部ID的复数,指向本地对象空间中的网格,并且面部的位置的中心坐标。
FindClosestVertex
找到最接近特定空间点的最近垂直,并返回一个稳定的垂直 ID。
参数
在网格的本地对象空间中的位置。
返回
最近的稳定垂直 ID 到指定的空间。
FindVerticesWithinSphere
在特定球体内找到所有垂直,并返回一个列表稳定垂直 ID。
参数
返回
在要求的球体内列出所有稳定垂直 ID。
GetAdjacentVertices
给出一个稳定的垂直 ID,返回一个列表的邻近垂直。
参数
在哪里获得邻接垂直。
返回
给定垂直 ID 周围的 adjacency 垂直 ID 列表。
GetColorAlpha
返回指定的稳定颜色 ID 上的颜色 alpha (透明度)。
参数
为获取 alpha 的颜色 ID。
返回
在请求稳定颜色 ID 上,颜色 alpha。
GetFacesWithAttribute
返回使用指定垂直 ID、普通 ID、UV ID 或颜色 ID 的面列表。
参数
用于查找使用它的面部的属性ID。
返回
使用指定属性 ID 的面部 ID 列表。
GetVerticesWithAttribute
返回使用指定面 ID、普通 ID、UV ID 或颜色 ID 的垂直列表。
参数
用于查找使用它的垂直的属性ID。
返回
使用给定属性 ID 的零件列表。
IdDebugString
返回一个描述可用于调试的有效ID的字符串,例如 f17 或 v12 ,包含类输入、ID 号和版本。
参数
用于返回调试信息字符串的 ID。
返回
描述人类可以读取的 ID 的字符串。
MergeVertices
将触摸到一起的垂直合并,以使用单个垂直 ID ,但保留其他原始属性 ID。
参数
垂直在哪里考虑触摸到另一个。
返回
将 old vertex ID 映射到 new vertex ID 对于合并后的垂直。
RaycastLocal
投射一个射线,返回交叉点、面部 ID 和中心坐标。 此方法的输入和输出都在网格的本地对象空间中。
一个 中心点坐标 是一种用于指定面上的点作为面的重量组合的方法。 这是一种用于泛用方法混合垂直属性的方法。 请参阅此方法的代码示例作为示例。
参数
返回
交叉点、面 ID 和中心坐标的柱。
代码示例
local AssetService = game:GetService("AssetService")
-- Initialize EditableMesh in space
local success, editableMesh = pcall(function()
return AssetService:CreateEditableMeshAsync(Content.fromUri("rbxassetid://ASSET_ID"))
end)
local meshPart = nil
if success then
local initialSize = Vector3.new(1, 1, 1)
meshPart = editableMesh:CreateMeshPartAsync(initialSize)
meshPart.Parent = workspace
end
local function castRayFromCamera(position)
if not meshPart then return end
-- Create ray from camera along the direction of a clicked point
local camera = workspace.CurrentCamera
local ray = camera:ScreenPointToRay(position.X, position.Y)
-- Convert to object space to use with RaycastLocal()
local relativeOrigin = meshPart.CFrame:PointToObjectSpace(ray.Origin)
local relativeDirection = meshPart.CFrame:VectorToObjectSpace(ray.Direction)
local triangleId, point, barycentricCoordinate
triangleId, point, barycentricCoordinate = editableMesh:RaycastLocal(relativeOrigin, relativeDirection * 100)
if not triangleId then
-- Didn't hit any triangles
return
end
-- Interpolate UVs within the triangle
local vert1, vert2, vert3 = editableMesh:GetTriangleVertices(triangleId)
local uv0 = editableMesh:GetUV(vert1)
local uv1 = editableMesh:GetUV(vert2)
local uv2 = editableMesh:GetUV(vert3)
local u = (barycentricCoordinate.x * uv0.x) + (barycentricCoordinate.y * uv1.x) + (barycentricCoordinate.z * uv2.x)
local v = (barycentricCoordinate.x * uv0.y) + (barycentricCoordinate.y * uv1.y) + (barycentricCoordinate.z * uv2.y)
return Vector2.new(u, v)
end
SetColorAlpha
为一个颜色ID设置颜色 alpha (透明度)。
参数
返回
SetFaceColors
将面部的垂直颜色设置为新的颜色 ID。
参数
返回
SetFaceNormals
将面部的垂直普通化到新的普通ID。
参数
返回
SetFaceUVs
将面部的垂直 UV 设置为新的 UV ID。
参数
返回
SetNormal
为一个普通ID设置一个值。这将为所有使用普通ID的面部垂直值改变。
参数
返回
Triangulate
将所有面分为网格上的三角形。 目前,这并且不能创建三角形,但如果您的代码使用三角形,请在 AssetService:CreateEditableMeshAsync() 后调用此方法。