EditableMesh
*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。
EditableMesh は、MeshPart にリンクすると、スタジオとエクスペリエンスの両方でメッシュのクエリと変更を可能にする、適用された視覚メッシュを変更します。
公開エクスペリエンスの有効化
セキュリティ目的で、EditableMesh を使用すると、公開エクスペリエンスにデフォルトで失敗します。使用を有効にするには、13歳以上で認証され、IDが認証されている必要があります。認証後、Studio の ゲーム設定 を開き、 セキュリティ を選択し、 メッシュ/画像 API を許可 トグルを有効にします。
許可
悪用を防ぐために、AssetService:CreateEditableMeshAsync() はメッシュアセットのロードと編集のみを許可します:
- エクスペリエンスの作成者が所有しているもの (エクスペリエンスが個人によって所有されている場合)。
- グループが所有しているもの (エクスペリエンスがグループに所有されている場合)。
- ログイン済みのスタジオユーザーが所有するもの (場所ファイルが Roblox に保存されたり公開されたりしていない場合)
メモリ制限
編集可能なアセットは、現在メモリ使用のために高価です。クライアントのパフォーマンスに与える影響を最小限に抑えるために、EditableMesh は、サーバー、Studio、およびプラグインが無制限のメモリで動作しているにもかかわらず、厳格なクライアント側のメモリ予算を持っています。FixedSize を使用すると、メモリ予算内に留まり、EditableMesh を複数の MeshParts (マルチ参照)にリンクすることで、メモリ最適化に役立つ可能性があります。
作成と表示
An EditableMesh は、既存の Content の MeshPart またはメッシュ IDを使用して AssetService:CreateEditableMeshAsync() から、または空白の EditableMesh を AssetService:CreateEditableMesh() で作成できます。それから表示、修正、そして衝突モデルが更新されることができます。すべてのステップが必要ではありません;たとえば、表示しないでレイキャストするだけで十分な場合、EditableMesh を作成したいかもしれません。
local AssetService = game:GetService("AssetService")
-- 空の編集可能なメッシュを作成する
local editableMesh = AssetService:CreateEditableMesh()
-- アセットIDから編集可能なメッシュを作成
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- 別の編集可能なメッシュから編集可能なメッシュを作成
local editableMeshFromAnother = nil
local success, errorMessage = pcall(function()
editableMeshFromAnother = AssetService:CreateEditableMeshAsync(Content.fromObject(OTHER_EDITABLE_MESH))
end)
-- メッシュパーツから編集可能なメッシュを作成
local editableMeshFromMeshPart = nil
local success, errorMessage = pcall(function()
editableMeshFromMeshPart = AssetService:CreateEditableMeshAsync(MESH_PART.MeshContent)
end)
EditableMesh は、MeshPart を介して新しい AssetService:CreateMeshPartAsync() にリンクされたときに表示されます。同じ を参照するより多くのインスタンスを作成したり、既存の を通じてリンクを作成したりできます。
local AssetService = game:GetService("AssetService")
local Workspace = game:GetService("Workspace")
-- アセットIDから編集可能なメッシュを作成
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID))
end)
-- 編集可能なメッシュにリンクされた新しいメッシュパーツを作成
local newMeshPart = nil
local success, errorMessage = pcall(function()
newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMeshFromAsset))
end)
-- 代わりに、上記で作成した新しいメッシュパーツを既存のメッシュパーツにリンクする
local existingMeshPart = Workspace:FindFirstChild("EXISTING_MESH_PART")
existingMeshPart:ApplyMesh(newMeshPart)
編集後に衝突と液体の幾何を再計算するには、AssetService:CreateMeshPartAsync() と MeshPart:ApplyMesh() を再び呼び出して、既存の MeshPart を更新できます。概念編集の終わりにこれを行うことが一般的に推奨され、幾何学を操作するメソッドへの個々の呼び出しの後で行うことはありません。メッシュに対するビジュアル変更は、AssetService:CreateMeshPartAsync() を呼び出す必要なく、エンジンにすぐに反映されます。
固定サイズのメッシュ
既存のメッシュアセットから EditableMesh を作成するとき (via AssetService:CreateEditableMeshAsync() )、結果の編集可能なメッシュはデフォルトで固定サイズになります。固定サイズのメッシュはメモリに関しては効率的ですが、ベクトル、顔、または属性の数を変更することはできません。ベクトル属性と位置の値のみが編集できます。
local AssetService = game:GetService("AssetService")
-- 固定サイズのデフォルトなしで編集可能なメッシュを作成
local editableMeshFromAsset = nil
local success, errorMessage = pcall(function()
editableMeshFromAsset = AssetService:CreateEditableMeshAsync(Content.fromAssetId(ASSET_ID), {FixedSize = false})
end)
安定なベクトル/顔ID
多くの EditableMesh メソッドは ベクトル 、 ノーマル 、 UV 、 色 、および 顔 IDを取ります。これらは Luau で整数として表現されますが、特別な処理が必要です。主な違いは、ID が安定していることで、メッシュの他の部分が変更されても同じままです。たとえば、 に 5つの頂点があり、 を削除すると、新しい頂点は になります。
ID が順序通りに保証されるわけではなく、番号付けに穴がある可能性があるため、バージョンまたは顔を繰り返しているときは、GetVertices() または GetFaces() によって返されたテーブルを繰り返す必要があります。
分割ベクトル属性
A ベクトル は顔の角であり、トポロジカルに顔を結合します。ベリティは複数の属性を持つことができます:位置、ノーマル、UV 座標、色、透明度。
時々、ベクトルに触れるすべての顔が同じ属性値を使用するのは便利ですが、時々、異なる顔が同じベクトルで異なる属性値を使用したい場合があります。たとえば、滑らかな球体では、各ベクトルには単一のノーマルしかありません。反対に、キューブの角では、ベクトルに 3 種類のノーマル (それぞれ隣接する面に 1) があります。UV 座標に縫い目を持たせたり、ベクスルの色が鋭く変わることもできます。
顔を作成するときは、すべてのベクトルにデフォルトで各属性の 1 つがあります:1つのノーマル、1つのUVコーディネート、1つの色/透明度です。シームを作成したい場合は、新しい属性を作成して顔に設定する必要があります。たとえば、このコードは鋭いキューブを作成します:
local AssetService = game:GetService("AssetService")
-- 4つのベクトルIDを与えると、新しいノーマルと 2つの三角形を追加し、鋭いクワッドを作成する
local function addSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
local nid = editableMesh:AddNormal() -- これにより、自動的に計算される通常のIDが生成されます
local fid1 = editableMesh:AddTriangle(vid0, vid1, vid2)
editableMesh:SetFaceNormals(fid1, {nid, nid, nid})
local fid2 = editableMesh:AddTriangle(vid0, vid2, vid3)
editableMesh:SetFaceNormals(fid2, {nid, nid, nid})
end
-- 6面間の縁が剥がれたキューブを作成
local function makeSharpCube()
local editableMesh = AssetService:CreateEditableMesh()
local v1 = editableMesh:AddVertex(Vector3.new(0, 0, 0))
local v2 = editableMesh:AddVertex(Vector3.new(1, 0, 0))
local v3 = editableMesh:AddVertex(Vector3.new(0, 1, 0))
local v4 = editableMesh:AddVertex(Vector3.new(1, 1, 0))
local v5 = editableMesh:AddVertex(Vector3.new(0, 0, 1))
local v6 = editableMesh:AddVertex(Vector3.new(1, 0, 1))
local v7 = editableMesh:AddVertex(Vector3.new(0, 1, 1))
local v8 = editableMesh:AddVertex(Vector3.new(1, 1, 1))
addSharpQuad(editableMesh, v5, v6, v8, v7) -- 前方
addSharpQuad(editableMesh, v1, v3, v4, v2) -- 戻る
addSharpQuad(editableMesh, v1, v5, v7, v3) -- 残り
addSharpQuad(editableMesh, v2, v4, v8, v6) -- 右
addSharpQuad(editableMesh, v1, v2, v6, v5) -- 下
addSharpQuad(editableMesh, v3, v7, v8, v4) -- 上
editableMesh:RemoveUnused()
return editableMesh
end
巻き上げ
メッシュの顔には、前面と後面があります。メッシュを描画するときは、デフォルトで顔の前側だけが描画されますが、 メッシュプロパティを に設定して変更できます。
顔の周りのベリティの順序は、あなたが前面か後面を見ているかどうかを決定します。頂点がそのまわりに反時計回りに移動すると、顔の前面が見えます。

FACS ポーズ
アニメーション可能な頭は、顔アクションコーディングシステム (FACS) を使用します。FACS ポーズ参照 で、GetFacsPoses() や同様の方法を使用するときの有用な情報を見る。
それぞれの FACS ポーズは、Enum.FacsActionUnit 値によって指定されます。FACS ポーズでは、バーチャル骨それぞれに があり、メッシュのバインドポーズの骨の最初の をその FACS アクションユニットのポーズに変換することができます。すべての骨 CFrames はメッシュのローカル空間にあります。
これらの FACS ポーズは、アニメーション中にブレンドされます。時々、ベースのポーズのブレンドは悪い結果を生み出します。その場合、特定のベースポーズの組み合わせのブレンドを、より気に入る 修正ポーズ でオーバーライドできます。修正ポーズは、2または3の Enum.FacsActionUnit 値で指定されます。ベースの FACS ポーズと同様、修正ポーズのために、バーチャル骨それぞれに CFrame があり、メッシュのバインドポーズの骨の最初の CFrame を変換し、その FACS 修正のための CFrame に変換します。
制限
EditableMesh 現在、60,000のベクトルと 20,000のトライアングルの制限があります。ベクトルやトライアングルを多く追加しようとすると、エラーが発生します。
概要
方法
幾何学に新しい色を追加し、安定した色 ID を返します。
幾何学に新しい正常を追加し、安定した正常 ID を返します。
メッシュに新しい三角形を追加し、安定した顔IDを返します。
ジオメトリに新しいUVを追加し、安定した UV ID を返します。
ジオメトリに新しいベクトルを追加し、安定なベクトル IDを返します。
メッシュを破壊します。
メッシュの表面で最も近いポイントを見つけます。
空間の特定のポイントに最も近いベクトルを見つけます。
特定の領域内のすべてのベクトルを見つけます。
指定された顔に近い顔のリストを返します。
指定されたベクトルに近いベクトルのリストを返します。
指定された色 IDの色を返します。
指定された色 ID で alpha (透明) 色を返します。
メッシュの全色を返します。
顔のベリーの色 ID を返し、顔のベリーにある垂直方向の顔の色を返します。
顔のノーマルIDを返し、顔の頂点に対するノーマルIDを返します。
顔のヴァーテックスのための顔の UV ID を返します。
顔のベクトルIDを返します。
メッシュのすべての面を返します。
指定されたノーマル ID の普通のベクトルを返します。
メッシュの全ノーマルを返します。
ヴェクスの位置を取得します。
指定されたUV IDでUV座標を返します。
メッシュのすべてのUVを返します。
すべてのベクトルを安定なベクトルID リストとして返します。
安定 ID を説明する文字列を返し、デバッグ目的に便利です。
同じ位置にあるベクトルをマージします。
安定した顔IDを使用して顔を削除します。
使用されていないベクトル、ノーマル、UV、および色をすべて削除し、削除されたIDを返します。
この通常の ID を自動的に計算するようにリセットします。
色を色 ID に設定します。
色アルファ (透明度) を色 ID に設定します。
顔の頂点の色を新しいカラーIDに設定します。
顔のベクトルノーマルを新しいノーマルIDに設定します。
顔のベクトルUVを新しいUVIDに設定します。
顔のベクトルを新しいベクトルIDに設定します。
普通の ID に対して普通を設定します。
メッシュのローカルオブジェクトスペースでベクトル位置を設定します。
UV ID の UV 座標を設定します。
メッシュ上のすべての顔を三角形に分けます。
プロパティ
方法
AddColor
幾何学に新しい色を追加し、安定した色 ID を返します。
パラメータ
戻り値
新しい色の安定したカラーID。
AddNormal
幾何学に新しいノーマルを追加し、安定なノーマル ID を返します。普通値が指定されていない場合、普通は自動的に計算されます。
パラメータ
通常のベクトル。通常の値が指定されていない場合、通常は自動的に計算されます。
戻り値
新しいノーマルの安定した通常 ID。
AddTriangle
メッシュに新しい三角形を追加し、安定した顔IDを返します。
パラメータ
トライアングルの最初の頂点の ID。
トライアングルの第二の頂点の ID。
三角形の第 3 頂点の ID。
戻り値
新しい顔の安定した顔ID。
AddUV
ジオメトリに新しいUVを追加し、安定した UV ID を返します。
パラメータ
新しいUV座標。
戻り値
新しいUVの安定したUV ID。
AddVertex
ジオメトリに新しいベクトルを追加し、安定なベクトル IDを返します。
パラメータ
メッシュのローカルオブジェクトスペースの位置。
戻り値
新しいベクトルの安定なベクトル ID。
Destroy
メッシュの内容を破壊し、使用済みメモリをすぐに回収します。
戻り値
FindClosestPointOnSurface
メッシュの表面で最も近いポイントを見つけます。面 ID を返し、ローカルオブジェクトスペースのメッシュにポイントを置き、顔内の位置のバリセントリック座標を取得します。バリセントリック座標に関する詳細は、RaycastLocal() を参照してください。
パラメータ
メッシュのローカルオブジェクトスペースのポイント位置。
戻り値
顔ID、ローカルオブジェクトスペースのメッシュにポイント、および顔内の位置のバリセントリック座標
FindClosestVertex
空間の特定のポイントに最も近いベクトルを見つけ、安定なベクトル IDを返します。
パラメータ
メッシュのローカルオブジェクトスペースのポイント位置。
戻り値
空間の指定されたポイントに最も近い安定なベクトル ID。
FindVerticesWithinSphere
特定の球体内のすべてのベクトルを見つけ、安定なベクトルID リストを返します。
パラメータ
戻り値
リクエストされた領域内の安定なベクトルID リスト。
GetAdjacentFaces
安定した顔IDを指定すると、隣接する顔のリストを返します。

パラメータ
戻り値
指定された顔に隣接する顔IDのリスト。
GetAdjacentVertices
安定なベクトル ID を与えると、隣接するベクトルのリストを返します。

パラメータ
隣接するベクトルを取得するためのVertex ID。
戻り値
指定されたベクトルIDの周りの隣接するベクトルのIDのリスト。
GetColorAlpha
指定された安定色 ID でアルファ (透明度) 色を返します。
パラメータ
アルファを取得する色の ID。
戻り値
リクエスト安定色 ID のアルファカラー。
GetFaceColors
顔のベリーの色 ID を返し、顔のベリーにある垂直方向の顔の色を返します。
パラメータ
色IDを取得するための顔ID。
戻り値
指定された顔の頂点に使用される色IDのリスト。
GetFaceNormals
顔のノーマルIDを返し、顔の頂点に対するノーマルIDを返します。
パラメータ
通常のIDを取得するための顔ID。
戻り値
指定された顔の頂点に使用される通常のIDのリスト。
GetFaceUVs
顔のヴァーテックスのための顔の UV ID を返します。
パラメータ
UV ID を取得するための顔 ID。
戻り値
指定された顔の頂点に使用される UV ID のリスト。
GetNormal
指定されたノーマル ID の普通のベクトルを返します。
パラメータ
通常のベクトルを取得するための正常の ID。
戻り値
リクエストされた通常の ID でのノーマルベクトル。
GetPosition
メッシュのローカルオブジェクトスペースでのvertex の位置を取得します。
パラメータ
位置を取得するための安定なベクトル ID。
戻り値
メッシュのローカルオブジェクトスペースでのベクトルの位置。
GetUV
指定されたUV IDでUV座標を返します。
パラメータ
UV 座標を取得するための UV ID。
戻り値
リクエストされた UV ID の UV 座標。
IdDebugString
安定 ID を説明する文字列を返し、デバッグ目的のように f17 または v12 など、タイプ、ID 番号、バージョンを含みます。
パラメータ
デバッグ情報ストリングを返す ID
戻り値
人間が読みやすい形式で ID を記述する文字列。
MergeVertices
同じ位置にあるベクトルをマージし、単一のベクトル ID を使用しつつ、他のオリジナルのアトリビュート ID を維持します。
パラメータ
ヴェルテックスが互いに触れると考えられる距離。
戻り値
マージされたバージェットの古いベクトル ID と新しいベクトル IDのマッピング。
RaycastLocal
レイを投射し、交点、顔ID、バリセントリック座標を返すこのメソッドの入力と出力は、メッシュのローカルオブジェクト空間にあります。
A バリセントリック座標 は、顔内のポイントを重量の組み合わせの 3 つの頂点として指定する方法です。これは、ベクトル属性をブレンドする一般的な方法として有用です。このメソッドのコードサンプルをイラストとして見てください。
パラメータ
戻り値
交点、顔ID、バリセントリック座標のトライプル。
コードサンプル
This code finds the position and UV coordinates of the closest point on an EditableMesh to the input point.
local AssetService = game:GetService("AssetService")
-- Initialize EditableMesh in space
local editableMesh = nil
local success, errorMsg = pcall(function()
editableMesh = AssetService:CreateEditableMeshAsync(Content.fromUri("rbxassetid://ASSET_ID"))
end)
local meshPart = nil
if success and editableMesh then
meshPart = AssetService:CreateMeshPartAsync(
Content.fromObject(editableMesh),
{ CollisionFidelity = Enum.CollisionFidelity.Hull }
)
meshPart.Parent = workspace
else
print(errorMsg)
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
ResetNormal
このノーマル ID を、メッシュの形状に基づいて自動的に計算されるように設定し直し、手動で設定するのをやめます。
パラメータ
リセットする安定したノーマル ID。
戻り値
SetColor
色を色 ID に設定します。
パラメータ
戻り値
SetColorAlpha
色アルファ (透明度) を色 ID に設定します。
パラメータ
戻り値
SetFaceColors
顔の頂点の色を新しいカラーIDに設定します。
パラメータ
戻り値
SetFaceNormals
顔のベクトルノーマルを新しいノーマルIDに設定します。
パラメータ
戻り値
SetFaceUVs
顔のベクトルUVを新しいUVIDに設定します。
パラメータ
戻り値
SetFaceVertices
顔のベクトルを新しいベクトルIDに設定します。
パラメータ
戻り値
SetNormal
普通のID に普通を設定します。これにより、普通の ID を使用しているすべての顔ベクトルの普通の値が変更されます。
パラメータ
戻り値
SetPosition
メッシュのローカルオブジェクトスペースでベクトル位置を設定します。
パラメータ
戻り値
SetUV
UV ID の UV 座標を設定します。
パラメータ
戻り値
Triangulate
メッシュ上のすべての顔を三角形に分けます。現在、トライアングルのみが作成できるため、これは何もしませんが、コードがトライアングルに依存している場合は、AssetService:CreateEditableMeshAsync() を呼んだ後、このメソッドを呼ぶことをお勧めします。