c# – UNITY-仅改变3D模型颜色的某些部分
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – UNITY-仅改变3D模型颜色的某些部分,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3122字,纯文字阅读大概需要5分钟。
内容图文
![c# – UNITY-仅改变3D模型颜色的某些部分](/upload/InfoBanner/zyjiaocheng/795/0b3fd7ac6e1e4e08b4689d4b18068ddf.jpg)
我对unity3D真的很新,我想问一个问题
我有一个3D人体模型(默认统一模型),它具有分层骨骼结构.
我想在这里实现的是,当我按下某个触发器时,我想要用不同的颜色(只是其中一个肢体)为其中一个肢体着色.这是我想要实现的目标的例证
我真的对此毫无头绪,因为我刚刚开始学习Unity大约3个月前,所以我真的需要你的帮助,这是我的渲染器的属性,如果它有帮助
解决方法:
我只是想补充说,使用projectors可能有一种更简单的方法来实现你想要的东西.这是统一的常用工具,用于实时绘制网格表面上的各种效果,例如弹孔.使用相同的原理,您可以突出显示网格的某些区域.您可以将投影仪视为手电筒,其光线照射的一切都会改变其质感.标准资产/效果下有一些示例投影仪.你可能想从那里开始.
要创建投影,请创建一个空的游戏对象=>添加组件=>投影机.
编辑
您可能想要尝试的另一个想法是使用vertex colors.网格的每个顶点除了坐标之外还包含颜色参数,可以通过着色器访问.因此,您可以更改特定顶点集的颜色以突出显示它们.这里有2点你必须注意:
1)大多数着色器选择忽略顶点颜色,但精灵着色器除外.您将需要一个自定义着色器,例如this one.
2)您需要知道哪些顶点要完全突出显示.您可以做的是迭代Mesh.boneWeights.例如,如果您想选择一个手臂,您需要的是所有具有权重>的顶点. 1为手臂骨指数.你怎么找到手臂骨指数?此索引对应于SkinnedMeshRenderer.bones中的索引.或者只是选择一些您知道肯定属于arm的顶点并查看其骨骼权重以查找索引.
这是一个示例脚本,它根据选定的骨骼索引更改顶点颜色.将它附加到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.com/s/yfoqo44bubcr48s/HighlightBone.zip?dl=0
演示:https://dl.dropboxusercontent.com/u/16950335/bones/index.html – 单击身体部位以突出显示它们.
内容总结
以上是互联网集市为您收集整理的c# – UNITY-仅改变3D模型颜色的某些部分全部内容,希望文章能够帮你解决c# – UNITY-仅改变3D模型颜色的某些部分所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。