当前位置:  开发笔记 > 编程语言 > 正文

只能更改3D模型颜色的某些部分

如何解决《只能更改3D模型颜色的某些部分》经验,为你挑选了1个好方法。

我真的是unity3D的新手,我想问一个问题,我有一个3D人体模型(默认的unity模型),它具有分层的骨骼结构。

我想在这里实现的是,当我按下某个触发器时,我想用不同的颜色为它的一个分支上的颜色(只是它的一个分支)上色。这是我要实现的目标的例证

我对此一无所知,因为我大约三个月前才开始学习Unity,所以我真的需要您的帮助,这是我的渲染器的属性,如果有帮助的话



1> Yuri Nudelma..:

我只是想补充一点,使用投影仪可能会有更简单的方法来实现您想要的功能。这是统一使用的通用工具,用于实时在网格表面上绘制各种效果,例如弹孔。使用相同的原理,您可以突出显示网格的某些区域。您可以将投影仪视为手电筒,它的光线所撞击的一切都会改变其纹理。标准资产/效果下有一些投影仪示例。您可能要从那里开始。

要创建投影仪,请创建一个空的游戏对象=>添加组件=>投影仪。

编辑

您可能要尝试的另一个想法是使用顶点颜色。网格的每个顶点除包含坐标外,还包含颜色参数,可通过着色器对其进行访问。因此,您可以更改特定顶点集的颜色以突出显示它们。这里有两点要注意:

1)除了精灵着色器,大多数着色器选择忽略顶点颜色。您将需要一个自定义着色器,例如this。

2)您需要以某种方式知道您想突出显示哪些顶点。您可以做的是遍历Mesh.boneWeights。例如,如果要选择一条手臂,则需要的是所有权重大于1的手臂骨骼索引顶点。您如何找到手臂的骨骼指数?该索引对应于SkinnedMeshRenderer.bones中的索引。或者只是选择一些您确定确实属于手臂的顶点,然后查看其骨骼权重以找到索引。

这里是一个示例脚本,可根据所选的骨骼索引更改顶点颜色。将其附加到您的SkinnedMeshRenderer(通常是第二层次结构对象):

using UnityEngine;
using System.Collections;

public class BoneHiglighter : MonoBehaviour {

    public Color32 highlightColor = Color.red;
    public Color32 regularColor = Color.white;

    public SkinnedMeshRenderer smr;

    // Just for sake of demonstration
    public Transform bone;
    private Transform prevBone;


    // Find bone index given bone transform
    int GetBoneIndex(Transform bone) {
        Debug.Assert(smr != null);
        var bones = smr.bones;

        for (int i = 0; i < bones.Length; ++i) {
            if (bones[i] == bone) return i;
        }

        return -1;
    }

    // Change vertex colors highlighting given bone
    void Highlight(Transform bone) {
        Debug.Assert(smr != null);
        var idx = GetBoneIndex(bone);
        var mesh = smr.sharedMesh;
        var weights = mesh.boneWeights;
        var colors = new Color32[weights.Length];

        for (int i = 0; i < colors.Length; ++i) {
            float sum = 0;
            if (weights[i].boneIndex0 == idx && weights[i].weight0 > 0)
                sum += weights[i].weight0;
            if (weights[i].boneIndex1 == idx && weights[i].weight1 > 0)
                sum += weights[i].weight1;
            if (weights[i].boneIndex2 == idx && weights[i].weight2 > 0)
                sum += weights[i].weight2;
            if (weights[i].boneIndex3 == idx && weights[i].weight3 > 0)
                sum += weights[i].weight3;

            colors[i] = Color32.Lerp(regularColor, highlightColor, sum);
        }

        mesh.colors32 = colors;

    }

    void Start() {
        // If not explicitly specified SkinnedMeshRenderer try to find one
        if (smr == null) smr = GetComponent();
        // SkinnedMeshRenderer has only shared mesh. We should not modify it.
        // So we make a copy on startup, and work with it.
        smr.sharedMesh = (Mesh)Instantiate(smr.sharedMesh);

        Highlight(bone);
    }

    void Update() {
        if (prevBone != bone) {
            // User selected different bone
            prevBone = bone;
            Highlight(bone);
        }
    }
}

查看示例项目:https : //www.dropbox.com/s/yfoqo44bubcr48s/HighlightBone.zip?dl=0

演示:https : //dl.dropboxusercontent.com/u/16950335/bones/index.html-单击身体部位以突出显示它们。

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有