mcpField
V
vrm-mtoon-outline

vrm-mtoon-outline

github.com/project-n-e-k-o开发3.1k42 次安装1 天前更新
代码仓库

关于 vrm-mtoon-outline

vrm-mtoon-outline 是一项技能,介绍如何调整 @pixiv/three-vrm 中使用 MToon 材质的 VRM 模型描边粗细。内容涵盖宽度模式、运行时调整和描边材质诊断。

主要功能

  1. 01世界与屏幕坐标宽度模式
  2. 02运行时调整描边宽度
  3. 03检测 MToon 材质
  4. 04描边宽度因子参考
  5. 05材质调试方法

适用场景

  1. 01让描边在不同缩放级别保持一致
  2. 02减轻模型放大后的描边粗度
  3. 03在运行时调整描边宽度
  4. 04检查带描边设置的材质

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/project-n-e-k-o/n.e.k.o --skill vrm-mtoon-outline

安装后在 Claude Code 中输入/vrm-mtoon-outline确认已加载。

详细介绍

VRM MToon 轮廓粗细调整

本技能介绍如何调整 @pixiv/three-vrm 中使用 MToon 材质的 VRM 模型的轮廓粗细。

常见症状

  1. 模型放大或摄像机靠近时,轮廓过粗
  2. 在不同缩放级别下,轮廓粗细不一致
  3. 需要在运行时以编程方式调整轮廓粗细

关键概念

轮廓宽度模式

MToon 材质有两种主要的轮廓宽度模式:

模式描述行为
'worldCoordinates'轮廓宽度是世界空间中的物理尺寸模型放大或摄像机靠近时,轮廓会变粗
'screenCoordinates'轮廓宽度相对于屏幕像素无论缩放或模型大小如何,轮廓大小都保持一致
关键属性
material.outlineWidthMode    // 'none' | 'worldCoordinates' | 'screenCoordinates'
material.outlineWidthFactor  // Number - the actual width value
material.isMToonMaterial     // Boolean - true for MToon materials
material.needsUpdate         // Set to true after modifying properties

解决方案:切换到屏幕坐标

要让轮廓在不同缩放级别下保持一致:

function adjustOutlineThickness(vrm, screenFactor = 0.005) {
    vrm.scene.traverse((object) => {
        if (object.isMesh || object.isSkinnedMesh) {
            const materials = Array.isArray(object.material) ? object.material : [object.material];
            
            materials.forEach(material => {
                if (!material || !material.isMToonMaterial) return;
                
                // Check if this material has outlines enabled
                const hasOutline = material.outlineWidthFactor > 0 && 
                                   material.outlineWidthMode !== 'none';
                
                if (hasOutline) {
                    // Switch to screen coordinates mode
                    material.outlineWidthMode = 'screenCoordinates';
                    material.outlineWidthFactor = screenFactor;
                    material.needsUpdate = true;
                }
            });
        }
    });
}
因子值参考

对于 screenCoordinates 模式:

因子值大致效果
0.002 - 0.003非常细的轮廓(1 像素)
0.005细轮廓(1-2 像素)
0.01中等粗细的轮廓(2-3 像素)
0.02+粗轮廓

检测模式

要诊断轮廓问题,请记录所有材质:

function debugOutlineMaterials(vrm) {
    let count = 0;
    vrm.scene.traverse((object) => {
        if (!object.isMesh && !object.isSkinnedMesh) return;
        
        const materials = Array.isArray(object.material) ? object.material : [object.material];
        materials.forEach(material => {
            if (material?.isMToonMaterial || 'outlineWidthFactor' in material) {
                count++;
                console.log({
                    name: material.name || '未命名',
                    type: material.type,
                    isMToonMaterial: material.isMToonMaterial,
                    outlineWidthMode: material.outlineWidthMode,
                    outlineWidthFactor: material.outlineWidthFactor
                });
            }
        });
    });
    console.log(`Found ${count} MToon/Outline materials`);
}

重要说明

重要

调用时机很重要! 必须在设置 currentModel 之后调用该函数。在 vrm-core.js 中,loadModel() 函数会在第 923 行附近设置 manager.currentModel。任何访问 currentModel 的函数都必须在此之后调用。

说明

名为 "XXX (Outline)" 的材质是由 three-vrm 自动创建的轮廓通道材质。它们与主材质共享属性,但会渲染轮廓效果。


API 参考(three-vrm MToon)

outlineWidthMode 的枚举值:

// From three-vrm.module.min.js
{
    None: "none",
    WorldCoordinates: "worldCoordinates", 
    ScreenCoordinates: "screenCoordinates"
}
属性类型描述
outlineWidthModestring宽度计算模式
outlineWidthFactornumber宽度值(含义取决于模式)
outlineColorFactorColor轮廓颜色
outlineLightingMixFactornumber光照对轮廓的影响程度
outlineWidthMultiplyTextureTexture用于调节轮廓宽度的纹理

评论

支持 Markdown