wojiuyaofeizoula 2023-01-05 12:23 采纳率: 0%
浏览 130
已结题

unity 动态导入模型后动态创建Avatar

问题遇到的现象和发生背景

动态导入模型后 动态创建Avatar骨骼映射
根据某位博主提供的思路动态创建Avatar时出现报错 hips not find

遇到的现象和发生背景,请写出第一个错误信息

使用trilib预设的动态导入模型场景导入了一个有骨骼的模型
然后出现了报错
模型动态加载是没有错的

img

img


场景是trilib插件预设的,应该是没有问题的

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%



//using System.Collections;
//using System.Collections.Generic;
//using UnityEngine;

public   class Skeleton : MonoBehaviour
{
    
    public static SkeletonBone[] CreateSkeleton(GameObject avatarRoot)
    {
        List<SkeletonBone> skeleton = new List<SkeletonBone>();

        Transform[] avatarTransforms = avatarRoot.GetComponentsInChildren<Transform>();
        foreach (Transform avatarTransform in avatarTransforms)
        {
            SkeletonBone bone = new SkeletonBone()
            {
                name = avatarTransform.name,
                position = avatarTransform.localPosition,
                rotation = avatarTransform.localRotation,
                scale = avatarTransform.localScale

                
            };

            skeleton.Add(bone);
        }
        return skeleton.ToArray();
    }

}



//这是动态创建Avatar的skeleton脚本




using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dictionary : MonoBehaviour
{
    public static GameObject A;
    

    public static Dictionary<string, string> HumanSkeletonMap = new Dictionary<string, string>()
         {   {"00", "Hips" },
             {"03", "Spine" },
             {"06", "Chest"},
             {"09", "UpperChest" },
             {"13" ,"Shoulder"},
             {"16" ,"UpperArm"},
             {"18" ,"LowerArm"},
             {"20" ,"Hand"},
             {"14" ,"Shoulder"},
             {"17" ,"UpperArm"},
             {"19" ,"LowerArm"},
             {"21" ,"Hand"},
             {"01" ,"UpperLeg"},
             {"04" ,"LowerLeg"},
             {"07" ,"Foot"},
             {"10" ,"Toes"},
             {"02" ,"UpperLeg"},
             {"05" ,"LowerLeg"},
             {"08" ,"Foot"},
             {"11" ,"Toes"},
             {"12", "Neck" },
             {"15", "Head" },
             //{ "eye_EyeJoint_L", "LeftEye" },
             //{ "eye_EyeJoint_R", "RightEye" },
             //{ "mouth_JawJoint_M", "Jaw" },
           






            //这里的映射关系是根据手动导入模型后 rig -create from this model 后形成的骨骼映射关系填写补充的

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/078618198276150.png "#left")
如图所示







         };
    

public static HumanBone[] CreateHuman(GameObject avatarRoot)
    {
        List<HumanBone> human = new List<HumanBone>();

        Transform[] avatarTransforms = avatarRoot.GetComponentsInChildren<Transform>();
        foreach (Transform avatarTransform in avatarTransforms)
        {
            if (HumanSkeletonMap.TryGetValue(avatarTransform.name, out string humanName))
            {
                HumanBone bone = new HumanBone
                {
                    boneName = avatarTransform.name,
                    humanName = humanName,
                    limit = new HumanLimit()
                };
                bone.limit.useDefaultValues = true;
                //bone.Equals(human); 
               
                human.Add(bone);
            }
        }
        return human.ToArray();
    }

    HumanDescription humanDescription = new HumanDescription()
    {
        armStretch = 0.05f,
        feetSpacing = 0.0f,
        hasTranslationDoF = false,
        legStretch = 0.05f,
        lowerArmTwist = 0.5f,
        lowerLegTwist = 0.5f,
        upperArmTwist = 0.5f,
        upperLegTwist = 0.5f,
        skeleton = Skeleton.CreateSkeleton(A),
        human = CreateHuman(A),
    };

    public void createAvatarTest()
    {

        A = GameObject.Find("output");

//因为导入的模型名称为output,这里就简单用此获得模型

       A.AddComponent<Animator>();
        Avatar avatar = AvatarBuilder.BuildHumanAvatar(A, humanDescription);

        Animator animator =A.GetComponent<Animator>();
        animator.runtimeAnimatorController =
            Resources.Load<RuntimeAnimatorController>("jump");
        
        animator.avatar = avatar;
        

    }//此方法用于测设动态创建一个avatar并为他添加animator组件,并加载Resources文件夹下的jump controller使得能够动态导入一个有骨骼的模型,再点击button调用这个方法后,模型能够jump起来



}
运行结果及详细报错内容

然后出现报错

img


hips not find

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

//

```c#

```如果觉得便宜了,可以再商量

  • 写回答

9条回答 默认 最新

  • BLOOMOK 2023-01-10 16:32
    关注

    第一个错误信息应该是:

    "Avatar creation failed: hips bone was not found in the model. Make sure your model has a 'hips' bone, or adjust the bone mapping accordingly."

    这意味着在创建 Avatar 的过程中,系统没有找到模型中的"hips"骨骼。"hips"骨骼是用来定位角色根节点的骨骼,是非常重要的。

    造成这个问题的原因可能是模型导入后,在骨骼映射上出现问题。您可以尝试以下步骤来解决问题:

    确保模型中存在 "hips" 骨骼,如果没有请确保你的模型格式支持骨骼
    检查 Unity 项目中骨骼映射设置是否正确,尤其是检查 "hips" 骨骼是否正确映射。
    3.检查骨骼的轴向是否正确设置, 如果骨骼的轴向不是x轴方向,请确保将其设置为x轴方向。
    4.尝试在模型导入时使用其他工具重新处理骨骼信息。
    希望这些建议能帮助您解决问题。望采纳

    评论

报告相同问题?

问题事件

  • 系统已结题 1月13日
  • 修改了问题 1月5日
  • 创建了问题 1月5日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!