mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-10-25 04:54:07 +00:00
update rules
This commit is contained in:
parent
4c390fdd37
commit
d5522b2fef
8549 changed files with 11783 additions and 1888 deletions
67
.cursor/rules/roblox/en-us/avatar/avatar-generation.md
Normal file
67
.cursor/rules/roblox/en-us/avatar/avatar-generation.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
---
|
||||
title: Photo-to-Avatar generation
|
||||
description: Explains how to use AvatarCreationService AvatarGeneration APIs to prompt users to generate Avatars from photos in experience.
|
||||
---
|
||||
|
||||
<Alert severity = 'success'>
|
||||
The Photo-to-Avatar feature is currently in alpha. Please refer to the [DevForum announcement](https://devforum.roblox.com/t/early-preview-alpha-release-of-photo-to-avatar-apis/3931624) for latest information.
|
||||
</Alert>
|
||||
|
||||
<Alert severity = 'warning'>
|
||||
The following guide applies to creators who are familiar with scripting and Roblox Studio and intend to develop experiences that allow user-generated avatar items.
|
||||
</Alert>
|
||||
|
||||
You can create an experience that allows players to generate a fully functional avatar character using a photo and a text prompt.
|
||||
|
||||
This process involves the following steps:
|
||||
|
||||
1. Request an AvatarGeneration session
|
||||
2. Prompt the user to take a selfie and generate a 2D preview image of the avatar
|
||||
3. Generate the full Avatar character using `Class.HumanoidDescription`
|
||||
|
||||
### Request an AvatarGeneration session
|
||||
|
||||
To start a photo-to-avatar generation, call `Class.AvatarCreationService:RequestAvatarGenerationSessionAsync()` from the server to request a session for the player. A session provides a `Class.Player` with a certain number of Avatar previews and Avatar generations.
|
||||
|
||||
As it may take some time for a session to become available, `Class.AvatarCreationService:RequestAvatarGenerationSessionAsync()` returns a `Datatype.RBXScriptConnection` and a waitTime in seconds. The waitTime can be used to provide the `Class.Player` with information on how long it will take them to be able to start their generations.
|
||||
|
||||
Once a session is ready, the callback is invoked with a `Dictionary` of information about the session. The `Dictionary` includes:
|
||||
|
||||
- `SessionId` — passed as an argument when calling `Class.AvatarCreationService:GenerateAvatar2DPreviewAsync` and `Class.AvatarCreationService:GenerateAvatarAsync`
|
||||
- `Allowed2DGenerations` — the number of 2D preview generations allowed in a session
|
||||
- `Allowed3DGenerations` — the number of 3D avatar generations allowed in a session
|
||||
- `SessionTime` — the maximum time for a session in seconds
|
||||
|
||||
### Prompt selfie and generate 2D preview
|
||||
|
||||
After a session is started, prompt the user to take a selfie and get the fileId `string` by calling the `Class.AvatarCreationService:PromptSelectAvatarGenerationImageAsync` method on the Server. This fileId will be passed to the `Class.AvatarCreationService:GenerateAvatar2DPreviewAsync` method.
|
||||
|
||||
To create a 2D preview image of the Avatar call the following methods:
|
||||
|
||||
1. `Class.AvatarCreationService:GenerateAvatar2DPreviewAsync` on the Server
|
||||
2. `Class.AvatarCreationService:LoadAvatar2DPreviewAsync` on the Client
|
||||
|
||||
The `Class.AvatarCreationService:GenerateAvatar2DPreviewAsync` takes the SessionId, fileId and an optional text prompt as input to generate a 2D Avatar preview. This method returns a previewId.
|
||||
|
||||
This previewId should be sent to the client and can then be used to retrieve the preview as an `Class.EditableImage`.
|
||||
|
||||
If the user is not satisfied with the generated preview this workflow can be repeated.
|
||||
|
||||
### Generate the 3D avatar
|
||||
|
||||
Once the user is satisfied with the preview, you can generate the complete 3D avatar character.
|
||||
|
||||
To generate an avatar character:
|
||||
|
||||
1. Call `Class.AvatarCreationService:GenerateAvatarAsync` on the Server with a `Dictionary` containing the SessionId and PreviewId.
|
||||
1. This method call returns a `string` generationId.
|
||||
2. Retrieve the generated avatar data as a `Class.HumanoidDescription` using the `Class.AvatarCreationService:LoadGeneratedAvatarAsync` method on both the experience server and the client.
|
||||
3. You can use the `Players.CreateHumanoidModelFromDescription` method to create an avatar model from the `Class.HumanoidDescription` to display to the `Class.Player`.
|
||||
|
||||
Mesh and texture assets will be provided as `Class.EditableMesh` and `Class.EditableImage` objects, respectively, to allow continued editing of the generated avatar. Edits should be made on both the experience server and the client copy to keep them in sync for publish.
|
||||
|
||||
### Publish
|
||||
|
||||
If the user is satisfied with the resulting avatar it can be published using the `Class.AvatarCreationService:PromptCreateAvatarAsync` method.
|
||||
|
||||
For more details on see [in-experience creation](./in-experience-creation.md).
|
||||
324
.cursor/rules/roblox/en-us/avatar/in-experience-creation.md
Normal file
324
.cursor/rules/roblox/en-us/avatar/in-experience-creation.md
Normal file
|
|
@ -0,0 +1,324 @@
|
|||
---
|
||||
title: Avatar in-experience creation
|
||||
description: Explains how to use AvatarCreationService to prompt users to create and purchase avatars from within your experience.
|
||||
---
|
||||
|
||||
<Alert severity = 'warning'>
|
||||
The following guide applies to creators who are familiar with scripting and Roblox Studio and intend to develop experiences that allow user-generated avatar items.
|
||||
</Alert>
|
||||
|
||||
You can publish an experience that allows players to create, customize, and purchase avatar bodies in real time. When purchased, these custom bodies save directly to the player's Roblox inventory, allowing players to equip and wear the custom avatars in other experiences.
|
||||
|
||||
Experience owners that implement in-experience avatar creation benefit from [Marketplace commissions](../marketplace/marketplace-fees-and-commissions.md#commissions) as both **creator** of the avatar item and **experience owner**. If an asset created in-experience is inspected, the item provides a link to the original experience it was created.
|
||||
|
||||
You can test in-experience creation in Roblox's [Avatar Creator](https://www.roblox.com/games/124012682058672/Roblox-Avatar-Creator) demo.
|
||||
|
||||
<Alert severity = 'warning'>
|
||||
Avatar assets created in-experience are not listed on the Marketplace, and cannot be resold or traded. At this time, in-experience creation only allows the creation of custom avatar bodies.
|
||||
</Alert>
|
||||
|
||||
## How to implement in-experience creation
|
||||
|
||||
Use the following instructions and code references to create your first in-experience avatar creation project. The following instructions uses a base body `Class.Model` that players can modify and customize before publishing.
|
||||
|
||||
Before getting started, familiarize yourself with the following:
|
||||
|
||||
- Avatar models — The following implementation requires importing a base body that meets Roblox's 15 part specifications. This `Class.Model` serves as a base for additional user customization and modification.
|
||||
- The base body must meet Roblox's [Avatar body guidelines](../marketplace/marketplace-policy.md#avatar-body-guidelines), including the minimum number of FACS control for facial rigging.
|
||||
- [Avatar creation tokens](#generate-an-avatar-creation-token) — Experiences implementing avatar creation require at least one creation token. These tokens require Robux to purchase and allow you to set prices and other sale settings for purchases made in-experience.
|
||||
- API classes
|
||||
- `Class.AvatarCreationService` — Handles avatar creation prompting and validation.
|
||||
- `Class.EditableImage` — Handles runtime creation and manipulation of textures.
|
||||
- `Class.EditableMesh` — Handles runtime manipulation of mesh geometry.
|
||||
- `Class.WrapDeformer` — Handles runtime manipulation of invisible outer cage geometry that allow avatar characters to equip [3D clothing](../art/accessories/layered-clothing.md).
|
||||
|
||||
### Import a base body
|
||||
|
||||
The base body acts as the initial foundation which users can customize and edit. You can use your own `Class.Model`, or import a custom asset with the [3D Importer](../art/modeling/3d-importer.md) and setup through [Avatar Setup](../avatar-setup/index.md).
|
||||
|
||||
Base bodies must adhere to Roblox's avatar specifications, and must include components such as the 15 `Class.MeshPart` instances that make up 6 body parts: head, torso, left arm, left leg, right arm, and right leg, as well as other [avatar components](../art/characters/index.md#components-of-an-avatar).
|
||||
|
||||
<Alert severity = 'info'>
|
||||
If you have a single-mesh body, you can try using the [Avatar Auto Setup](../avatar-setup/index.md#avatar-auto-setup) to automatically add all the necessary avatar components.
|
||||
</Alert>
|
||||
|
||||
For references and samples of properly configured avatar bodies, see [Avatar references](../avatar/resources.md#references).
|
||||
|
||||
### Implement editing APIs
|
||||
|
||||
To develop a system where users can edit the `Class.MeshPart` instances on an avatar in your experience for creation, use `Class.EditableImage` for texture editing, `Class.EditableMesh` for mesh editing, and `Class.WrapDeformer` for maintaining skinning and FACS data during mesh edits.
|
||||
|
||||
1. After importing your base body, use the following script to set up your `Class.EditableImage|EditableImages`, `Class.EditableMesh|EditableMeshes`, and `Class.WrapDeformer|WrapDeformers`.
|
||||
|
||||
```lua
|
||||
local AssetService = game:GetService("AssetService")
|
||||
|
||||
local function setupBodyPart(meshPart, wrapTarget)
|
||||
-- Create and attach a WrapDeformer to the MeshPart
|
||||
local wrapDeformer = Instance.new("WrapDeformer")
|
||||
wrapDeformer.Parent = meshPart
|
||||
|
||||
-- Create an editable mesh for the wrap target's cage mesh
|
||||
local cageEditableMesh: EditableMesh =
|
||||
AssetService:CreateEditableMeshAsync(Content.fromUri(wrapTarget.CageMeshId), {
|
||||
FixedSize = true,
|
||||
})
|
||||
|
||||
-- Assign the cage mesh to the WrapDeformer
|
||||
wrapDeformer:SetCageMeshContent(Content.fromObject(cageEditableMesh))
|
||||
end
|
||||
|
||||
local function setupRigidMesh(meshPart)
|
||||
-- Create an editable mesh from the original MeshPart
|
||||
local editableMesh = AssetService:CreateEditableMeshAsync(Content.fromUri(meshPart.MeshId), {
|
||||
FixedSize = true,
|
||||
})
|
||||
|
||||
-- Generate a new MeshPart from the editable mesh
|
||||
local newMeshPart = AssetService:CreateMeshPartAsync(Content.fromObject(editableMesh))
|
||||
|
||||
-- Copy size, position, and texture from the original MeshPart
|
||||
newMeshPart.Size = meshPart.Size
|
||||
newMeshPart.CFrame = meshPart.CFrame
|
||||
newMeshPart.TextureContent = meshPart.TextureContent
|
||||
|
||||
-- Apply the new MeshPart back to the original
|
||||
meshPart:ApplyMesh(newMeshPart)
|
||||
end
|
||||
|
||||
local function setupMeshTexture(meshPart, textureIdToEditableImageMap)
|
||||
-- If EditableImage already exists for this TextureID, resuse it rather than making a new one
|
||||
if textureIdToEditableImageMap[meshPart.TextureID] then
|
||||
meshPart.TextureContent =
|
||||
Content.fromObject(textureIdToEditableImageMap[meshPart.TextureID])
|
||||
return
|
||||
end
|
||||
|
||||
-- Create a new EditableImage and apply it as the texture content
|
||||
local editableImage = AssetService:CreateEditableImageAsync(Content.fromUri(meshPart.TextureID))
|
||||
textureIdToEditableImageMap[meshPart.TextureID] = editableImage
|
||||
meshPart.TextureContent = Content.fromObject(editableImage)
|
||||
end
|
||||
|
||||
local function setupModel(model)
|
||||
-- Map for reusing EditableImage instances by texture ID
|
||||
local textureIdToEditableImageMap = {}
|
||||
for _, descendant in model:GetDescendants() do
|
||||
if not descendant:IsA("MeshPart") then
|
||||
continue
|
||||
end
|
||||
|
||||
-- Configure MeshPart based on WrapTarget presence
|
||||
-- If WrapTarget is present, add a WrapDeformer child with an EditableMesh
|
||||
-- Otherwise, apply EditableMesh to the MeshPart directly
|
||||
local wrapTarget = descendant:FindFirstChildOfClass("WrapTarget")
|
||||
if wrapTarget then
|
||||
setupBodyPart(descendant, wrapTarget)
|
||||
else
|
||||
setupRigidMesh(descendant)
|
||||
end
|
||||
|
||||
-- Configure the EditableImage for the MeshPart
|
||||
setupMeshTexture(descendant, textureIdToEditableImageMap)
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
2. Create `Class.EditableImage` tools that allow players to recolor, draw, or add stickers to your base body. You can leverage APIs in like `Class.EditableImage:DrawImage()|DrawImage()`, `Class.EditableImage:DrawRectangle()|DrawRectangle()`, `Class.EditableImage:WritePixelsBuffer()|WritePixelsBuffer()`.
|
||||
|
||||
- For advanced transformations, `Class.EditableImage:DrawImageTransformed()|DrawImageTransformed()` allows you to specify position, rotation, and scale when drawing one EditableImage onto another. Similarly, `Class.EditableImage:DrawImageProjected()|DrawImageProjected()` works much like `Class.EditableImage:DrawImage()|DrawImage()` but projects the drawn image properly if the `Class.EditableImage` instance is used with a `Class.MeshPart`.
|
||||
|
||||
```lua
|
||||
local function recolorTexture(
|
||||
meshPart: MeshPart,
|
||||
color: Color3
|
||||
)
|
||||
local bodyPartTexture = AssetService:CreateEditableImageAsync(meshPart.TextureID)
|
||||
meshPart.TextureContent = Content.fromObject(bodyPartTexture)
|
||||
|
||||
bodyPartTexture:DrawRectangle(
|
||||
Vector2.new(0, 0),
|
||||
bodyPartTexture.Size,
|
||||
color,
|
||||
0,
|
||||
Enum.ImageCombineType.Overwrite
|
||||
)
|
||||
end
|
||||
|
||||
local function applySticker(
|
||||
meshPart: MeshPart,
|
||||
textureCoordinate: Vector2,
|
||||
stickerId: TextureId
|
||||
)
|
||||
local bodyPartTexture = AssetService:CreateEditableImageAsync(meshPart.TextureID)
|
||||
meshPart.TextureContent = Content.fromObject(bodyPartTexture)
|
||||
|
||||
local stickerTexture = AssetService:CreateEditableImageAsync(stickerId)
|
||||
bodyPartTexture:DrawImage(textureCoordinate, stickerTexture, Enum.ImageCombineType.BlendSourceOver)
|
||||
end
|
||||
|
||||
local function applyStickerProjected(
|
||||
meshPart: MeshPart,
|
||||
targetMesh: EditableMesh,
|
||||
stickerId: TextureId,
|
||||
raycastHitPos: Vector3
|
||||
)
|
||||
local bodyPartTexture = AssetService:CreateEditableImageAsync(meshPart.TextureID)
|
||||
|
||||
local relativePos = meshPart.CFrame:PointToWorldSpace(raycastHitPos)
|
||||
local direction = (workspace.CurrentCamera.CFrame.Position - relativePos).Unit
|
||||
|
||||
local projectionParams: ProjectionParams = {
|
||||
Direction = meshPart.CFrame:VectorToObjectSpace(direction),
|
||||
Position = meshPart.CFrame:PointToObjectSpace(relativePos),
|
||||
Size = Vector3.new(1, 1, 1),
|
||||
Up = meshPart.CFrame:VectorToObjectSpace(Vector3.new(0, 1, 0)),
|
||||
}
|
||||
|
||||
local stickerTexture = AssetService:CreateEditableImageAsync(stickerId)
|
||||
local localBrushConfig: BrushConfig = {
|
||||
Decal = stickerTexture,
|
||||
ColorBlendType = Enum.ImageCombineType.BlendSourceOver,
|
||||
AlphaBlendType = Enum.ImageAlphaType.Default,
|
||||
BlendIntensity = 1,
|
||||
FadeAngle = 90.0
|
||||
}
|
||||
|
||||
bodyPartTexture:DrawImageProjected(targetMesh, projectionParams, localBrushConfig)
|
||||
end
|
||||
```
|
||||
|
||||
3. Using `Class.WrapDeformer` and `Class.EditableMesh`, create tools for editing mesh deformations on your body.
|
||||
|
||||
1. `Class.WrapDeformer` handles the live deformations of the rendered `Class.MeshPart` geometry while maintaining the underlying skinning and FACS data.
|
||||
2. `Class.EditableMesh` allows you to modify the cage mesh that the `Class.WrapDeformer` responds to.
|
||||
|
||||
1. Use `Class.WrapDeformer:SetCageMeshContent()` to apply the `Class.EditableMesh` instance that represents the relevant cage mesh to the `Class.WrapDeformer`.
|
||||
2. Use `Class.EditableMesh`, such as `Class.EditableMesh:SetPosition()|SetPosition()`, to deform vertices and edit the shape of the `Class.MeshPart`.
|
||||
|
||||
```lua
|
||||
local function deformBodyPart(
|
||||
meshPart: MeshPart,
|
||||
controlPointCenter: Vector3,
|
||||
controlPointRadius: number,
|
||||
controlPointDeformation: Vector3
|
||||
)
|
||||
local wrapTarget = meshPart:FindFirstChildWhichIsA("WrapTarget")
|
||||
local cageMeshId = wrapTarget.CageMeshId
|
||||
local wrapDeformer = Instance.new("WrapDeformer")
|
||||
wrapDeformer.Parent = meshPart
|
||||
|
||||
local cageEditableMesh = AssetService:CreateEditableMeshAsync(cageMeshId)
|
||||
local verticesWithinSphere =
|
||||
cageEditableMesh:FindVerticesWithinSphere(controlPointCenter, controlPointRadius)
|
||||
for _, vertexId in verticesWithinSphere do
|
||||
local vertexPosition = cageEditableMesh:GetPosition(vertexId)
|
||||
cageEditableMesh:SetPosition(vertexId, vertexPosition + controlPointDeformation)
|
||||
end
|
||||
|
||||
wrapDeformer:SetCageMeshContent(Content.fromObject(cageEditableMesh))
|
||||
end
|
||||
```
|
||||
|
||||
### Create creation prompt
|
||||
|
||||
After setting up your base body and editing APIs, create a prompt for users to create and purchase from the experience using `Class.AvatarCreationService:PromptCreateAvatarAsync()`.
|
||||
|
||||
```lua
|
||||
export type BodyPartInfo = {
|
||||
bodyPart: Enum.BodyPart,
|
||||
instance: Instance --Folder with Created MeshParts
|
||||
}
|
||||
export type BodyPartList = {BodyPartInfo}
|
||||
|
||||
local function publishAvatar(bodyPartInstances: BodyPartList, player: Player, tokenId: string)
|
||||
local humanoidDescription = Instance.new("HumanoidDescription")
|
||||
for _, bodyPartInfo in bodyPartInstances do
|
||||
local bodyPartDescription = Instance.new("BodyPartDescription")
|
||||
bodyPartDescription.Instance = bodyPartInfo.instance
|
||||
bodyPartDescription.BodyPart = bodyPartInfo.bodyPart
|
||||
bodyPartDescription.Parent = humanoidDescription
|
||||
end
|
||||
|
||||
local success, result, bundleIdOrErrorMessage, outfitId = pcall(function()
|
||||
return AvatarCreationService:PromptCreateAvatarAsync(tokenId, player, humanoidDescription)
|
||||
end)
|
||||
if success then
|
||||
if result == Enum.PromptCreateAvatarResult.Success then
|
||||
print("Successfully uploaded with BundleId: ", bundleIdOrErrorMessage)
|
||||
print("Successfully uploaded with OutfitId: ", outfitId)
|
||||
else
|
||||
print("Unsuccessfully uploaded with error message:", bundleIdOrErrorMessage)
|
||||
end
|
||||
else
|
||||
print("Avatar creation unsuccessful")
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
`Class.AvatarCreationService:PromptCreateAvatarAsync()` takes a `Class.HumanoidDescription` parameter to represent the avatar intended for purchase or creation. For avatar creation, the character's `Class.HumanoidDescription` must
|
||||
include new assets to be created for each of the 6 body parts
|
||||
(`Enum.BodyPart.Head|Head`,
|
||||
`Enum.BodyPart.Torso|Torso`,
|
||||
`Enum.BodyPart.RightLeg|RightLeg`,
|
||||
`Enum.BodyPart.LeftLeg|LeftLeg`,
|
||||
`Enum.BodyPart.RightArm|RightArm`,
|
||||
`Enum.BodyPart.LeftArm|LeftArm`). Optionally, it can also
|
||||
include a new `Enum.AccessoryType.Hair|Hair` accessory.
|
||||
|
||||
To support this, the `Class.HumanoidDescription` should include 6
|
||||
`Class.BodyPartDescription` children. Each `Class.BodyPartDescription.Instance` property references a `Class.Folder` which includes all of the `Class.MeshPart` instances that make up the body part. For example, the `LeftArm` folder contains
|
||||
`LeftHand`, `LeftUpperArm`, and `LeftLowerArm` `Class.MeshPart|MeshParts`.
|
||||
The `Class.BodyPartDescription.BodyPart` property should also be set to
|
||||
the relevant `Enum.BodyPart`.
|
||||
|
||||
Each of the 15 `Class.MeshPart` body parts must include:
|
||||
|
||||
- An `Class.EditableImage`.
|
||||
- A `Class.WrapDeformer` with an `Class.EditableMesh`.
|
||||
|
||||
The provided `Class.HumanoidDescription` should not include any pre-existing asset IDs to represent body parts or accessories on the intended creation. On the other hand, the `Class.HumanoidDescription` may include the humanoid scales of `Class.HumanoidDescription.BodyTypeScale|BodyTypeScale`,
|
||||
`Class.HumanoidDescription.HeadScale|HeadScale`,
|
||||
`Class.HumanoidDescription.HeightScale|HeightScale`,
|
||||
`Class.HumanoidDescription.WidthScale|WidthScale`, and
|
||||
`Class.HumanoidDescription.ProportionScale|ProportionScale`. Be mindful of
|
||||
the scales that a base body is imported with so that they match the scales
|
||||
provided to the `Class.HumanoidDescription`.
|
||||
|
||||
<img src="../assets/avatar/avatar-iec/Avatar-Creation-Format.png" width="320" />
|
||||
|
||||
#### Include accessories
|
||||
|
||||
If including an accessory, such as hair, the `Class.HumanoidDescription`
|
||||
should include a child `Class.AccessoryDescription` where:
|
||||
|
||||
- The `Class.AccessoryDescription.Instance` property references
|
||||
the `Class.Accessory` instance.
|
||||
- The `Class.AccessoryDescription.AccessoryType` property is
|
||||
set to the relevant `Enum.AccessoryType`.
|
||||
- In the case of including `Enum.AccessoryType.Hair` in your creations, the `Class.MeshPart` should include an `Class.EditableImage`. However, it should not include a `Class.WrapDeformer` child but should include an `Class.EditableMesh` set on the `Class.MeshPart` directly.
|
||||
|
||||
### Generate an avatar creation token
|
||||
|
||||
`Class.AvatarCreationService:PromptCreateAvatarAsync()` takes an **Avatar Creation Token ID** parameter. This token is the key for creations from your universe, and it is what you can use to set the price of avatar creation from your experience. For instructions and additional details on generating tokens, see [Avatar Creation Tokens](../production/monetization/avatar-creation-token.md).
|
||||
|
||||
After purchasing and generating your token, you can inspect the token in the Creator Hub to find the ID which you can then use for the `Class.AvatarCreationService:PromptCreateAvatarAsync()` API.
|
||||
|
||||
<img src="../assets/avatar/avatar-iec/Avatar-Token-Id.png" width="320" />
|
||||
|
||||
## Respond to players joining by attribution
|
||||
|
||||
Avatar bundles created in-experience include an attribution link to the original experience the avatar was created. If the avatar is inspected by another player, a prompt displays providing an option to visit the experience where the avatar was created.
|
||||
|
||||
<img src="../assets/avatar/avatar-iec/Avatar-Creation-Attribution.png" width="400" />
|
||||
|
||||
To handle players joining your experience using this attribution link, use `Class.Player:GetJoinData()` and parse the returned table for `GameJoinContext`.
|
||||
|
||||
`GameJoinContext` includes the following table values:
|
||||
|
||||
- `JoinSource` — `Enum.JoinSource`
|
||||
- A `Class.Player` joining your experience from this attribution link will have `Enum.JoinSource.CreatedItemAttribution` to indicate entry from a created item.
|
||||
- `ItemType` — optional `Enum.AvatarItemType`
|
||||
- `AssetId` — optional `string`
|
||||
- `OutfitId` — optional `string`
|
||||
- `AssetType` — optional `Enum.AssetType`
|
||||
281
.cursor/rules/roblox/en-us/avatar/index.md
Normal file
281
.cursor/rules/roblox/en-us/avatar/index.md
Normal file
|
|
@ -0,0 +1,281 @@
|
|||
---
|
||||
title: Create avatar items
|
||||
description: Create and upload avatar characters, clothing, and accessories to the Roblox Marketplace.
|
||||
|
||||
hideInPageNavigation: true
|
||||
---
|
||||
|
||||
export const sections = [
|
||||
|
||||
{
|
||||
title: "Turn your creativity into virtual assets",
|
||||
description: "Roblox streamlines the creation process, letting you focus more on building and bringing your ideas to life with powerful, state-of-the-art tools.",
|
||||
content: [
|
||||
{
|
||||
title: "Design a 2D classic shirt",
|
||||
description: "Use an image editor of your choice and create your first basic 2D cosmetic.",
|
||||
video: "https://www.youtube-nocookie.com/embed/r_unfGZT5Ps",
|
||||
links: [
|
||||
{ text: "Learn more", href: "../art/classic-clothing.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Create a 3D accessory",
|
||||
description: "Use a 3D modeling tool and Roblox Studio to make a 3D cosmetic.",
|
||||
video: "https://www.youtube-nocookie.com/embed/Eed29gV0hLA",
|
||||
links: [
|
||||
{ text: "Guides and tutorials", href: "../art/accessories.md" },
|
||||
{ text: "Get Blender", href: "https://www.blender.org" },
|
||||
{ text: "Get Studio", href: "./studio/setup/" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Make 3D layered clothing",
|
||||
description: "Use your 3D modeling skills and Roblox Studio to create clothing that stretches, fits, and layers.",
|
||||
video:"https://www.youtube-nocookie.com/embed/C-DwGRBHvmE",
|
||||
links: [
|
||||
{ text: "Guides and tutorials", href: "../art/accessories/layered-clothing.md" },
|
||||
{ text: "Get Blender", href: "https://www.blender.org" },
|
||||
{ text: "Get Studio", href: "./studio/setup/" }
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
title: "What's new?",
|
||||
description: "Check out our latest videos and guides designed to help you create faster — whether you're a complete newbie or a seasoned industry pro!",
|
||||
buttons: [
|
||||
{ text: "See all videos", href: "https://www.youtube.com/playlist?list=PLMneGxZNs3ZYZ5cJ1IPeaO1Eyd4ejY1Lz" },
|
||||
],
|
||||
content: [
|
||||
{
|
||||
title: "Make your own shoes",
|
||||
description: "Create your first shoes — an advanced type of layered clothing.",
|
||||
video: "https://www.youtube-nocookie.com/embed/NHgYM78afqc",
|
||||
},
|
||||
{
|
||||
title: "Convert body cages and clothing cages",
|
||||
description: "Convert a body cage to a clothing cage and back again! Useful for advanced clothing or body creators.",
|
||||
video: "https://www.youtube-nocookie.com/embed/vATGE-2xhcw",
|
||||
},
|
||||
{
|
||||
title: "Intro to UGC",
|
||||
description: "Join @ducksareyellow as he asks seasoned professionals how to start creating UGC in a 3-part series",
|
||||
video: "https://www.youtube-nocookie.com/embed/Zb1BJow0NV4",
|
||||
links: [
|
||||
{ text: "Part 2 - Modeling", href: "https://www.youtube-nocookie.com/embed/Zb1BJow0NV4"},
|
||||
{ text: "Part 3 - Texturing", href: "https://www.youtube-nocookie.com/embed/MlyJD_ix9CE"}]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
title: "All the tools you need, for free",
|
||||
description: "Roblox offers the tools and infrastructure to upload your creations to a global marketplace, handling everything from moderation and localization to payment processing.",
|
||||
content: [
|
||||
{
|
||||
title: "Blender",
|
||||
description: "Check out in-depth guides and tutorials for creating 3D items in Blender, a free and open-sourced modeling program.",
|
||||
links: [
|
||||
{ text: "Get Blender", href: "https://www.blender.org" },
|
||||
{ text: "Learn more", href: "../art/blender.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Roblox Studio",
|
||||
description: "Use native tools in Roblox Studio to quickly convert your custom models into Roblox-ready accessories. Studio is your portal to getting your 3D assets into the Roblox ecosystem.",
|
||||
links: [
|
||||
{ text: "Get Studio", href: "./studio/setup/" },
|
||||
{ text: "Accessory Fitting Tool", href: "../art/accessories/accessory-fitting-tool.md" },
|
||||
{ text: "Avatar Setup", href: "./avatar-setup/" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Creator Hub",
|
||||
description: "Manage all your uploaded avatar items, set them on sale, review policy, and view analytics in the Creator Hub.",
|
||||
links: [
|
||||
{ text: "Go to Creator Hub", href: "https://create.roblox.com/" },
|
||||
{ text: "Upload and publishing guides", href: "../marketplace/publish-to-marketplace.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Marketplace and beyond",
|
||||
description: "Create your own home store and a higher share of your commission! Or build experiences that allow others to customize and create avatar items in-game.",
|
||||
links: [
|
||||
{ text: "Marketplace policy", href: "../marketplace/marketplace-policy.md" },
|
||||
{ text: "Create your own home store", href: "../marketplace/homestore.md" },
|
||||
{ text: "In-experience creation", href: "./in-experience-creation.md" }
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
title: "Dive deeper into avatars",
|
||||
description: "Learn how to create advanced avatar items, explore how the Marketplace operates, and see how Roblox's community policies protect both creators and players.",
|
||||
buttons: [
|
||||
],
|
||||
content: [
|
||||
{
|
||||
title: "Fees, commissions, and more",
|
||||
description: "Understand the fees and commission structure and how to optimize your avatar item revenue.",
|
||||
image: "../assets/accessories/Layered-Clothing-Banner.jpg",
|
||||
links: [
|
||||
{ text: "Fees and Commissions", href: "../marketplace/marketplace-fees-and-commissions.md" },
|
||||
{ text: "Upload and publish guides", href: "../marketplace/publish-to-marketplace.md" },
|
||||
{ text: "Marketplace FAQs", href: "../marketplace/frequently-asked-questions.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Marketplace and community policies",
|
||||
description: "Learn about the policies that help protect you, your creations, and the community.",
|
||||
image: "../assets/landing/device-family.png",
|
||||
links: [
|
||||
{ text: "Marketplace Policy", href: "../marketplace/marketplace-policy.md" },
|
||||
{ text: "Intellectual Property", href: "../marketplace/intellectual-property.md" },
|
||||
{ text: "Moderation", href: "../marketplace/moderation.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Create more complex items",
|
||||
description: "Create even more advanced avatar items, like advanced clothing, bodies, heads, and more.",
|
||||
video: "https://www.youtube-nocookie.com/embed/NHgYM78afqc",
|
||||
links: [
|
||||
{ text: "Clothing guides", href: "../art/accessories/layered-clothing.md" },
|
||||
{ text: "Character bodies", href: "./art/characters/"},
|
||||
{ text: "Animateable heads", href: "../art/characters/facial-animation.md" }
|
||||
]
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
content: [
|
||||
{
|
||||
title: "Build your own homestore",
|
||||
description: "Create and design your own store and benefit from a higher commission split from sales.",
|
||||
video: "https://www.youtube-nocookie.com/embed/6MPWLQmIKLk",
|
||||
links: [{ text: "Learn more", href: "../marketplace/homestore.md" }]
|
||||
},
|
||||
{
|
||||
title: "In-experience creation",
|
||||
description: "Create an experience where players can build their own avatar items. Recommended for advanced developers.",
|
||||
image: "../assets/landing/scripting.png",
|
||||
links: [
|
||||
{ text: "Learn more", href: "./in-experience-creation.md" }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
<Grid container direction="row" spacing={4} style={{ marginBottom: 48 }}>
|
||||
<Grid item xs={12} md={5}>
|
||||
|
||||
<p>Every Roblox user is represented by an **avatar** — a fully customizable character with cosmetics and accessories that persist across experiences.</p>
|
||||
<p>Create avatar bodies, items, and clothing using our robust tools and upload them to the [Marketplace](https://www.roblox.com/catalog) where millions of users browse and shop every day.</p>
|
||||
<Button
|
||||
style={{ marginTop: 8, marginRight: 24 }}
|
||||
variant="contained"
|
||||
color="secondary"
|
||||
size="large"
|
||||
href="https://www.youtube.com/watch?v=vIiVbFiDbBE" >
|
||||
Watch overview
|
||||
</Button>
|
||||
<Button
|
||||
style={{ marginTop: 8, marginRight: 24 }}
|
||||
variant="contained"
|
||||
color="secondary"
|
||||
size="large"
|
||||
href="https://www.roblox.com/catalog" >
|
||||
Visit Marketplace
|
||||
</Button>
|
||||
</Grid>
|
||||
<Grid item xs={12} md={7}>
|
||||
<img
|
||||
style={{ width: '100%', aspectRatio: 16/9, height: 'auto', objectFit: 'cover' }}
|
||||
src="../assets/avatar/AvatarSample.png"
|
||||
alt=""
|
||||
/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
{sections.map((section, index) => (
|
||||
<Grid style={{ marginBottom: 48 }} item xs={12} key={index}>
|
||||
{section.title && (
|
||||
<Typography variant='h1'>{section.title}</Typography>
|
||||
)}
|
||||
|
||||
<div style={{ marginTop: 16, marginBottom: 48 }}>
|
||||
{section.description && (
|
||||
<p>{section.description}</p>
|
||||
)}
|
||||
{section.buttons && section.buttons.map((button, btnIndex) => (
|
||||
<Button
|
||||
key={btnIndex}
|
||||
style={{ marginTop: 8, marginRight: 24 }}
|
||||
variant="contained"
|
||||
color="secondary"
|
||||
size="large"
|
||||
href={button.href} >
|
||||
{button.text}
|
||||
</Button>
|
||||
))}
|
||||
</div>
|
||||
{section.content && (
|
||||
<Grid container spacing={4}>
|
||||
{section.content.map((content, contentIndex) => {
|
||||
const mdValue = 12 / section.content.length;
|
||||
return (
|
||||
<Grid item xs={12} sm={6} md={mdValue} key={contentIndex}>
|
||||
<div style={{ marginBottom: 48 }}>
|
||||
|
||||
{content.image && (
|
||||
<img
|
||||
style={{ width: '100%', aspectRatio: 16/9, height: 'auto', objectFit: 'cover' }}
|
||||
src={content.image}
|
||||
alt=""
|
||||
/>
|
||||
)}
|
||||
|
||||
{content.video && (
|
||||
|
||||
<iframe
|
||||
style={{ width: '100%', aspectRatio: 16/9, height: 'auto', marginBottom: '16px' }}
|
||||
src={content.video}
|
||||
title="YouTube video player"
|
||||
frameborder="0"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
|
||||
referrerpolicy="strict-origin-when-cross-origin"
|
||||
allowfullscreen ></iframe>
|
||||
)}
|
||||
|
||||
<h3>{content.title}</h3>
|
||||
<p>{content.description}</p>
|
||||
{content.links && content.links.map((link, linkIndex) => (
|
||||
<a href={link.href} key={linkIndex}>
|
||||
<Typography variant='buttonLarge'>{link.text}</Typography><br />
|
||||
</a>
|
||||
))}
|
||||
{content.buttons && content.buttons.map((button, btnIndex) => (
|
||||
<Button
|
||||
key={btnIndex}
|
||||
style={{ marginTop: 16, marginRight: 24 }}
|
||||
variant="contained"
|
||||
color="secondary"
|
||||
size="large"
|
||||
href={button.href} >
|
||||
{button.text}
|
||||
</Button>
|
||||
))}
|
||||
</div>
|
||||
</Grid>
|
||||
);
|
||||
})}
|
||||
</Grid>
|
||||
)}
|
||||
</Grid>
|
||||
))}
|
||||
645
.cursor/rules/roblox/en-us/avatar/resources.md
Normal file
645
.cursor/rules/roblox/en-us/avatar/resources.md
Normal file
|
|
@ -0,0 +1,645 @@
|
|||
---
|
||||
title: Resources
|
||||
description: Get all the resources you need to build characters and accessories.
|
||||
hideInPageNavigation: true
|
||||
---
|
||||
|
||||
The following downloadable files are available for your use:
|
||||
|
||||
- [References](#references) — Finished assets you can use as reference.
|
||||
- [Auto-Setup References](#auto-setup-references) — Assets that meet specific avatar auto-setup requirements.
|
||||
- [Project Files](#project-files) — Fundamental resources like rigs and cages for building your own assets.
|
||||
- [Mannequins](#mannequin-models) — Models you can use as sizing reference.
|
||||
- [Templates](#templates) — Prebuilt characters that require small additional customization.
|
||||
- [Add-ons and Tools](#add-ons-and-tools) — Third-party tools and add-ons.
|
||||
|
||||
## References
|
||||
|
||||
The following are source files used for actual Roblox assets. Finished assets like Nature Girl and Stylish Male include clothing and accessory items and may cause validation errors unless removed.
|
||||
|
||||
<Grid container alignItems='stretch' style={{margin: -6}}>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Nature Girl</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Archer-Girl-Preview.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A comprehensive `.zip` folder of an avatar-ready character body, including clothing and rigid accessory assets. Each asset includes its own Blender and Maya project file, as well as their respective PBR textures. <br /> <br />
|
||||
|
||||
If you are opening these files in Blender, the armature bones may display in an unexpected orientation because the source model was originally exported from Maya. This different orientation doesn't affect the performance of the armature rig.
|
||||
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/NatureArcherGirl.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Stylish Male</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/StylizedMale-Preview.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A comprehensive `.zip` folder of an avatar-ready character body, including clothing and rigid accessory assets. Each asset includes its own Blender and Maya project file, as well as their respective PBR textures. <br /> <br />
|
||||
|
||||
If you are opening these files in Blender, the armature bones may display in an unexpected orientation because the source model was originally exported from Maya. This different orientation doesn't affect the performance of the armature rig.
|
||||
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/StylizedMaleWithClothing.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Fish Person</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Fish-Person-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A rigged and skinned humanoid character model with a full body cage, facial animation rig, and associated PBR texture maps. <br /><br /> If this asset were to be uploaded to the Marketplace, the bulb antenna must be a separate head accessory and not part of the character's head geometry.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/avatar/dynamic-heads/reference-files/Fish-Person.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Goblin</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Goblin-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A rigged and skinned humanoid character model with a full body cage, facial animation rig.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Blocky</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Blocky-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A Blocky character model with an animatable head and a full body cage.
|
||||
</figure>
|
||||
<br />
|
||||
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Lola</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Lola-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A skinned R15 character created from the <a href="../art/modeling/skin-a-humanoid-model.md">Skinning a Humanoid Model</a> guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
|
||||
</figure>
|
||||
<br />
|
||||
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/modeling/skinned-meshes/Lola.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Tshirt - Uncaged</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Tshirt-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Uncaged example clothing ready for caging in a 3D modeling software.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/accessories/reference-files/Tshirt-model.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Clothing Examples</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Generic-Icon.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Caged 3D accessory models and associated PBR textures. Ready for import into Studio or in a modeling tool.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/accessories/reference-files/Additional-FBX-assets.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Caging Examples</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Additional-Caging-Examples.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Additional caged clothing items from How to cage Roblox's 3D [clothing video guide](https://www.youtube.com/watch?v=QwZaA9Gc-WQ).
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/accessories/reference-files/Caging-examples.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
## Auto-setup references
|
||||
|
||||
The following assets are designed for the specific [auto-setup requirements](../avatar-setup/index.md#model-requirements). If uploaded as-is, these assets will fail normal validation.
|
||||
|
||||
<Grid container alignItems='stretch' style={{margin: -6}}>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Nature Girl - Auto-Setup</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Archer-Girl-Preview.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A comprehensive `.zip` folder of an [Avatar Auto-Setup](../avatar-setup/index.md#avatar-auto-setup) ready character model, including clothing and rigid accessory assets and PBR texture assets. <br /> <br />
|
||||
This Auto-Setup template is not compatible with the traditional avatar creation workflow.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/NatureArcherGirl-AutoSetup.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Stylish Male - Auto-Setup</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/StylizedMale-Preview.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A comprehensive `.zip` folder of an [Avatar Auto-Setup](../avatar-setup/index.md#avatar-auto-setup) ready character model, including the base body and associated PBR textures. <br /> <br />
|
||||
This Auto-Setup template is not compatible with the traditional avatar creation workflow.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/StylizedMale-AutoSetup.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
## Project files
|
||||
|
||||
The following are base rig, attachment, and cage files for avatar item creation in third-party applications. Choose the appropriate type of project file for your use-case. These assets are not suitable for direct import into Studio.
|
||||
|
||||
<Grid container alignItems='stretch' style={{margin: -6}}>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>R15 Rig and Attachments</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Rig-And-Attachments-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Standard armature rig template for various software. Use this template for rigging **bodies** and **clothing** items.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download (.blend, .ma, .fbx)</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Cages for Clothing</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Clothing-Cage-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Project files for creation, includes a full-body inner and outer cage mesh for creation of **clothing** items.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download (.blend, .ma, .fbx)</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Cages for Bodies</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Body-Cages-Resource.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Project files for creation, includes the 15 individual body part cages required for caging your avatar **bodies**.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/modeling/meshes/reference-files/Body_Cage_Templates.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download (.blend, .ma, .fbx)</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Combined Project Files</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Generic-Icon.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Template file containing all content from previous templates, includes rig skeleton, body cages, attachment points. <br /> <br /> Use this template to rig and cage bodies and clothing.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/modeling/meshes/reference-files/Combined_Templates.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download (.blend, .ma, .fbx)</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
## Mannequin models
|
||||
|
||||
Use the following models when designing your avatar accessory and clothing items. You can use these assets as scale, body shape, and caging reference.
|
||||
|
||||
These assets are not meant for direct upload into Studio and may fail import or validation.
|
||||
|
||||
<Grid container alignItems='stretch' style={{margin: -6}}>
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Classic Mannequin</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Body-Scale-Classic.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A blank mannequin using Roblox's [Classic](../art/characters/specifications.md#classic) avatar proportions. <br /> <br />Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.<br /> <br /> The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/ClassicMannequin.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Model</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/ClassicMannequin_With-Cages.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>With Cage</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Rthro Mannequin</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Body-Scale-Rthro-Normal.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A blank mannequin using Roblox's [Rthro Normal](../art/characters/specifications.md#normal) avatar proportions. <br /> <br />Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.<br /> <br /> The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/RthroMannequin.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Model</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/RthroMannequin_With-Cages.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>With Cage</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Rthro Slender Mannequin</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/resources/Body-Scale-Rthro-Slender.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
A blank mannequin using Roblox's [Rthro Slender](../art/characters/specifications.md#slender) proportions. <br /> <br />Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.<br /> <br /> The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/RthroSlenderMannequin.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Model</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/RthroSlenderMannequin_With-Cages.fbx" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>With Cage</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
## Templates
|
||||
|
||||
Use these templates if following along the [Create characters with templates](../art/characters/creating/index.md) tutorial content.
|
||||
|
||||
These assets require additional steps in third-party tools to pass validation in Studio.
|
||||
|
||||
<Alert severity = 'warning'>
|
||||
If you are using Roblox's avatar template files, you must perform the [cleanup steps](../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace.
|
||||
</Alert>
|
||||
|
||||
<Grid container style={{margin: -6}}>
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Round-Head-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/RoundMale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Male</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/RoundFemale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Female</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Square-Head-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/SquareMale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Male</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/SquareFemale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Female</Button>
|
||||
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Muzzle-Head-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/MuzzleMale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Male</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/MuzzleFemale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Female</Button>
|
||||
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/SemiRealistic-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/SemiRealisticMale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Male</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/SemiRealisticFemale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Female</Button>
|
||||
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Anime-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/AnimeMale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Male</Button>
|
||||
|
||||
<Button href="../assets/art/reference-files/AnimeFemale.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Female</Button>
|
||||
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Caricature-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/Caricature.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<figure>
|
||||
<img src="../assets/art/avatar/templates/Stylized-Templates.png" width = "100%"/>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender and .fbx template files with pre-baked avatar components. <br /> <br /> See [Create with templates](../art/characters/creating/index.md) for instructions.
|
||||
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../assets/art/reference-files/StylizedHuman.zip" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"4px;"}}>Download</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
## Add-ons and tools
|
||||
|
||||
Use the following add-ons and tools to help aid your creation process. Some of these tools are not actively supported and may be incompatible with your hardware version.
|
||||
|
||||
<Grid container alignItems='stretch'>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Blender Studio Plugin</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Generic-Icon.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Open-source Blender Studio add-on that allows you to upload assets directly from Blender to Studio.
|
||||
</figure>
|
||||
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../art/modeling/roblox-blender-plugin.md" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"0px;"}}>Link to Instructions</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Blender Validation Tool</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Generic-Icon.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender add-on for verifying avatar technical compatibility before importing into Studio.
|
||||
</figure>
|
||||
</CardContent>
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../art/accessories/validation-tool.md" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"0px;"}}>Link to Instructions</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item XSmall={12} Medium={6} Large={4} style={{padding: 6}}>
|
||||
<Card style={{height: '100%'}}>
|
||||
<CardContent style={{marginBottom:'66px'}}>
|
||||
|
||||
<center>Blender Calisthenics Tool</center>
|
||||
<figure>
|
||||
<center> <img src="../assets/art/Generic-Icon.png" width="100%" /> </center>
|
||||
</figure>
|
||||
<figure>
|
||||
Blender add-on for checking skinning data on characters and clothing.
|
||||
</figure>
|
||||
</CardContent>
|
||||
|
||||
<CardActions style={{position: 'absolute', bottom: 0, width: '100%'}}>
|
||||
<Button href="../art/modeling/calisthenics-tool.md" fullWidth size='large' color='primary' variant='contained' style={{marginBottom:"0"}}>Link to Instructions</Button>
|
||||
</CardActions>
|
||||
|
||||
</Card>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
320
.cursor/rules/roblox/en-us/avatar/tutorials.md
Normal file
320
.cursor/rules/roblox/en-us/avatar/tutorials.md
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
---
|
||||
title: Tutorials
|
||||
description: Get all the tutorials you need to build characters and accessories.
|
||||
hideInPageNavigation: true
|
||||
---
|
||||
|
||||
Learn how to create assets with structured tutorials that walks through each creation step from modeling in a third-party tool to importing in Studio.
|
||||
|
||||
<br /> <br />
|
||||
|
||||
<BaseAccordion>
|
||||
<AccordionSummary>
|
||||
<Typography variant="h4">Prerequisites</Typography>
|
||||
|
||||
</AccordionSummary>
|
||||
<AccordionDetails>
|
||||
|
||||
<Typography variant="body2" color="textSecondary" component="p">
|
||||
These tutorials use Blender, a free and open-source software. If you never used Blender or Roblox Studio before, start with the following resources before continuing.
|
||||
</Typography>
|
||||
|
||||
- [Download Blender](https://www.blender.org/) - Install and setup Blender. Roblox's tutorial content uses Blender 3.0+.
|
||||
- [Familiarize yourself with Blender](https://docs.blender.org/manual/en/latest/) - Use Blender's official docs or community-created content of your choice to get up to speed with Blender's UI and functions.
|
||||
- [Setting up Roblox Studio](../studio/setup.md) - Install
|
||||
and configure Roblox Studio.
|
||||
|
||||
</AccordionDetails>
|
||||
</BaseAccordion>
|
||||
|
||||
<Card>
|
||||
<CardContent>
|
||||
|
||||
<h2 style={{marginBottom: 12}}>Rigid accessories</h2>
|
||||
|
||||
<Typography variant="body2" color="textSecondary" component="p">
|
||||
This tutorial covers the basic steps to successfully create and sell an accessory. Model and texture an object in Blender, upload the publishable accessory item to Studio, and sell the item on the Marketplace.
|
||||
</Typography>
|
||||
|
||||
<>
|
||||
<Grid
|
||||
alignItems="stretch"
|
||||
container
|
||||
direction="row">
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column" style={{"maxWidth": "800px"}}>
|
||||
|
||||
<div class="container"
|
||||
style={{position: "relative"}}>
|
||||
<img src="../assets/art/accessories/creating-rigid/Chest-Studio.png" width = "90%" />
|
||||
</div>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column">
|
||||
|
||||
<>
|
||||
<Stepper activeStep={6} orientation="vertical">
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating-rigid/index.md"><StepLabel optional="Create your custom asset in Blender.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Model</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating-rigid/texturing.md">
|
||||
<StepLabel
|
||||
optional="Add a surface appearance to your 3D object.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Texture</h5>
|
||||
</StepLabel></a>
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating-rigid/importing.md">
|
||||
<StepLabel optional="Use the 3D Importer to bring in your custom asset.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Import into Studio</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating-rigid/converting.md">
|
||||
<StepLabel optional="Use the Accessory Fitting Tool to create the accessory.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Fit and convert</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating-rigid/publishing.md">
|
||||
<StepLabel optional="Upload and publish your accessory to the Marketplace.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Publish</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
</Stepper>
|
||||
</>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</>
|
||||
|
||||
<a href="../art/accessories/creating-rigid/index.md">
|
||||
<Button
|
||||
variant="contained"
|
||||
size="large">
|
||||
Start Creating
|
||||
</Button>
|
||||
</a>
|
||||
</CardContent>
|
||||
|
||||
</Card>
|
||||
|
||||
<br /><br />
|
||||
<Card>
|
||||
<CardContent>
|
||||
|
||||
<h2 style={{marginBottom: 12}}>Clothing</h2>
|
||||
|
||||
<Typography variant="body2" color="textSecondary" component="p">
|
||||
Create your own clothing item from scratch using Roblox's project templates as a mannequin. Learn the processes required to convert a typical mesh object to an equipable and layerable clothing item ready for the Marketplace.
|
||||
</Typography>
|
||||
|
||||
<>
|
||||
<Grid
|
||||
alignItems="stretch"
|
||||
container
|
||||
direction="row">
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column" style={{"maxWidth": "800px"}}>
|
||||
|
||||
<div class="container"
|
||||
style={{position: "relative"}}>
|
||||
<img src="../assets/art/avatar/Clothing-Tutorial-Blender.png" width = "90%"/>
|
||||
</div>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column">
|
||||
|
||||
<>
|
||||
<Stepper activeStep={6} orientation="vertical">
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/modeling-setup.md">
|
||||
<StepLabel optional="Create and sculpt the shape of your clothing item.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Model</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/unwrapping.md">
|
||||
<StepLabel
|
||||
optional="Add your own surface texture and patterns to your asset.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Texture</h5>
|
||||
</StepLabel></a>
|
||||
</Step>
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/armature-setup.md">
|
||||
<StepLabel optional="Attach your clothing model to an R15 rig." >
|
||||
<h5 style={{marginTop: 36}}>Rig</h5>
|
||||
</StepLabel></a>
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/caging-setup.md">
|
||||
<StepLabel optional="Set the inner and outer surfaces of your clothing.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Cage</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/exporting.md">
|
||||
<StepLabel optional="Export your model from Blender.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Export</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/accessories/creating/importing.md">
|
||||
<StepLabel optional="Import your model into Studio and convert it to an Accessory.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Import</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
</Stepper>
|
||||
</>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</>
|
||||
|
||||
<a href="../art/accessories/creating/index.md">
|
||||
<Button
|
||||
variant="contained"
|
||||
size="large">
|
||||
Start Creating
|
||||
</Button>
|
||||
</a>
|
||||
</CardContent>
|
||||
|
||||
</Card>
|
||||
|
||||
<br /><br />
|
||||
|
||||
<Card>
|
||||
<CardContent>
|
||||
<h2 style={{marginBottom: 12}}>Bodies</h2>
|
||||
|
||||
<Typography variant="body2" color="textSecondary" component="p">
|
||||
Start here for a comprehensive introduction to each step of body creation using Roblox's provided avatar templates. Each template includes pre-baked avatar components and these instructions provide everything you need to know to create a custom character ready for the Marketplace.
|
||||
</Typography>
|
||||
|
||||
<>
|
||||
<Grid
|
||||
alignItems="stretch"
|
||||
container
|
||||
direction="row">
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column" style={{"maxWidth": "800px"}}>
|
||||
|
||||
<div class="container"
|
||||
style={{position: "relative"}}>
|
||||
<img src="../assets/art/avatar/Bodies-Tutorial.png" width = "90%"/>
|
||||
</div>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid item Medium={6} XSmall={12} direction="column">
|
||||
|
||||
<>
|
||||
<Stepper activeStep={6} orientation="vertical">
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/template-files.md">
|
||||
<StepLabel optional="Pick a starting body shape from a collection of templates.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Pick a template</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/modeling-best-practices.md">
|
||||
<StepLabel optional="Create your unique character shape out of a template.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Model</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/texturing-setup.md">
|
||||
<StepLabel
|
||||
optional="Apply a custom texture to any and all parts of your character.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Texture</h5>
|
||||
</StepLabel></a>
|
||||
</Step>
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/caging.md">
|
||||
<StepLabel optional="Set the outer surface of your character." >
|
||||
<h5 style={{marginTop: 36}}>Caging</h5>
|
||||
</StepLabel></a>
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/combine-head-geometry.md">
|
||||
<StepLabel optional="Clean up your project and model to make it Studio-ready.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Cleanup</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step style={{marginTop: -36}}>
|
||||
<a href="../art/characters/creating/export-textures.md">
|
||||
<StepLabel optional="Export your project from Blender and bring it into Studio.">
|
||||
|
||||
<h5 style={{marginTop: 36}}>Export</h5>
|
||||
</StepLabel></a>
|
||||
|
||||
</Step>
|
||||
|
||||
</Stepper>
|
||||
</>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</>
|
||||
|
||||
<a href="../art/characters/creating/index.md">
|
||||
<Button
|
||||
variant="contained"
|
||||
size="large">
|
||||
Start Creating
|
||||
</Button>
|
||||
</a>
|
||||
</CardContent>
|
||||
|
||||
</Card>
|
||||
Loading…
Add table
Add a link
Reference in a new issue