我真的是unity3D的新手,我想问一个问题我有一个3D人体模型(一个默认的unity模型),它有一个分层的骨骼结构。
我想在这里实现的是,当我按下某些触发器时,我想给它的一个肢体涂上不同的颜色(只是它的一个肢体)。这就是我想实现的功能的说明。
我对这个真的是毫无头绪,因为我3个月前才开始学习Unity,所以我真的需要你的帮助,这是我渲染器的属性,如果对你有帮助的话。
我只是想补充一下,可能有一个更简单的方法来实现你想要的使用 投影机. 这是unity中常用的工具,用于在网格表面实时绘制各种效果,比如弹孔。使用同样的原理,你可以突出网格的某些区域。你可以把投影仪想象成手电筒,它的光线照射到的所有东西都会改变它的纹理。在标准资产效果下有一些投影仪的例子。你可能想从那里开始。
要创建一个投影仪,创建一个空的游戏对象 => Add Component => Projector。
编辑
您可能想尝试的另一个想法是使用 顶点颜色. 网格的每个顶点除了坐标外,还包含一个颜色参数,可以通过shader访问。因此,你可以改变特定顶点集的颜色来突出它们。这里有2点你要注意。
1)大多数着色器选择忽略顶点颜色,除了精灵着色器。你需要一个自定义的着色器,如 这个.
2) 你需要知道你到底要高亮哪些顶点。你可以做的是迭代到 Mesh.boneWeights. 例如,如果你想选择一个手臂,你需要的是所有具有重量> 1的顶点的臂骨指数。如何找到臂骨指数?这个指数对应于 SkinnedMeshRenderer.bones。. 或者只需选择一些你确定属于手臂的顶点,然后查看它的骨骼权重来找到索引。
这里有一个根据选定的骨骼指数来改变顶点颜色的示例脚本,将它附加到你的SkinedMeshRenderer(通常是第二层的层次结构对象)上。将它附加到你的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>();
// 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.comsyfoqo44bubcr48sHighlightBone.zip?dl=0
演示。http:/jolly-squirrel.droppages.combonesindex.html。 - 点击身体部位可以看到它们的亮点。
如果你是一个初学者,你必须做一些阅读。在改变一些东西之前,请确保你完全理解模型设置。
还有一种解决方法,不那么程式化,更符合逻辑,但方式粗糙,需要优化。