除非修改源代码,否则 Three.js 骨骼动画无法工作

2023-12-24

使用 Three.js r68+,我需要对源代码进行轻微修改才能使我的动画正常工作。未经修改,每种类型的模型中只有一个是动画的(每种类型的模型都有多个生成)。

这是第 29407 行的修改后的源代码(从 29389 开始发布的代码):

THREE.AnimationHandler = {

LINEAR: 0,
CATMULLROM: 1,
CATMULLROM_FORWARD: 2,

//

add: function () { console.warn( 'THREE.AnimationHandler.add() has been deprecated.' ); },
get: function () { console.warn( 'THREE.AnimationHandler.get() has been deprecated.' ); },
remove: function () { console.warn( 'THREE.AnimationHandler.remove() has been deprecated.' ); },

//

animations: [],

init: function ( data ) {

    // original -> if ( data.initialized === true ) return;
    if ( data.initialized === true ) return data; //<-- modified

该函数现在返回动画数据(如果已初始化)。我假设它不会因为缓存而这样做。我的问题是对具有相同动画名称的多个模型进行动画处理的最佳实践是什么?我尝试根据模型名称对它们进行唯一命名,即:“Death_MaleWarrior”,但这没有效果。

目前我的模型和动画的处理方式如下:

var modelArray = [];
var geoCache   = [];
var loader     = new THREE.JSONLoader(true);

var _MODEL = function(data){

  this.data       = data;  
  this.mesh       = null;
  this.animations = {};
  this.canAnimate = false;

  this.parseAnimations = function () {

    var len,i,anim;

    if (this.mesh) {

          if( this.mesh.geometry.animations ){
              this.canAnimate = true;
              len = this.mesh.geometry.animations.length;
              if( len ){
                  for(i=0;i<len;i++){
                      anim = this.mesh.geometry.animations[i];
                      if( anim ){
                        this.animations[anim.name] = new THREE.Animation( this.mesh, anim );
                      }
                  }
              }
          }
      }
  };

  this.playAnimation = function(label){

    if (this.canAnimate) {
      if( this.animations[label] ){
        //if( this.animations[label].data ){
          this.animations[label].play(0,1);
        //}
      }
    }
    return false;

  };

  this.load = function(geo){

    var mat;

    mat = new THREE.MeshPhongMaterial({color:somecolor, skinning:true})

    this.mesh = new THREE.SkinnedMesh(geo,mat);

    this.mesh.position.x = this.data.position[0];
    this.mesh.position.y = this.data.position[1];
    this.mesh.position.z = this.data.position[2];

    this.parseAnimations();

    scene.add(this.mesh);

    this.playAnimation('Idle');

  };

  this.init = function(){

    var geo;

    if( geoCache[this.data.name] ){
      geo = geoCache[this.data.name];
      this.load(geo); 
    }else{
       geo = loader.parse(JSON.parse(this.data.json)).geometry;
       geoCache[this.data.name] = geo;
       this.load(geo);            
    }        

  };

  this.init();

};

var dataArray = [{name:'MaleWarrior',json:'json_data',position:[x,y,z]},{name:'FemaleWarrior',json:'json_data',position:[x,y,z]},{name:'MaleWarrior',json:'json_data',position:[x,y,z]}];

for(var i=0, len=objectArray.length; i<len; i++){
  modelArray.push(new _MODEL(dataArray[i]) );
}

在此示例中,第一个 MaleWarrior 将进行动画处理,但第二个则不会。如果有第二个女性,她也不会被动画化,因为动画(即使它是一个新的 THREE.Animation() )将被视为已初始化并且不会返回任何数据。如果我不检查 playAnimation 中是否存在animations.data,我会收到错误“Uncaught TypeError: Cannot read property 'name' of undefined ” on line 29665”。

我正在做的事情是否绕过了动画缓存并损害了性能?我觉得我失去了一些东西。没有数据的动画如何播放?

每个模型的所有动画名称都是相同的“空闲”、“运行”、“攻击”等。

任何帮助,将不胜感激。如果我不够清楚,请告诉我。我添加了额外的细节。


事实证明这是一个官方的 Three.js 错误。

https://github.com/mrdoob/ Three.js/issues/5516 https://github.com/mrdoob/three.js/issues/5516

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除非修改源代码,否则 Three.js 骨骼动画无法工作 的相关文章

  • SwiftUI 动画滑入和滑出

    我有一个视图将显示在另一个视图上 视图动画完美地从右侧滑入 但是当我单击 关闭 按钮时 视图消失 而没有在消失之前滑回右侧的所需动画 我尝试过使用 opacity self isShowing 1 0 但随后视图淡入和淡出 我需要它滑入和滑
  • 如何从右向左缩放按钮,android动画

    要将从左到右的缩放应用于按钮 我使用了以下代码 我的按钮位于布局的右侧 我希望按钮应该从右侧 X 位置开始并缩放到左侧 X 位置 如何实现这一点 view startAnimation new ScaleAnimation 0 0f 1 0
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • 三个 JS Orbitcontrols 设置目标而不用 LookAt

    我正在尝试制作一个用于构建模型的 3D 查看器 我们已加载模型并尝试与模型进行某种交互 因此 我们使用 OrbiControls 来旋转 平移和缩放模型 我们希望在查看器中具有这样的行为 当用户单击并拖动 从而旋转 时 旋转中心位于用户单击
  • 身体动画不流畅

    下面代码中的 spaceShip 在开始按住任何箭头键时移动并不顺利 它移动一步 冻结一瞬间 然后 平稳 地移动 怎样才能让它从一开始就顺利运转 而不是 冻结 My code
  • 从相机视图中拖动锁定在一定距离/半径处的对象

    我在场景中心有一个相机 距离相机 z 400 处有 1 个球体 其父级位于中心 我想从视图中向上 向下 向左 向右拖动球体 但同时不改变它相对于中心的 z 位置 我最终使用了另一个球体并使其不可见 添加side THREE DoubleSi
  • 在父视图之外对子视图进行动画处理

    我试图在其父视图之外对视图进行动画处理 当我这样做时 子视图无法在其父视图之外进行动画处理 我通过使用解决了这个问题setClipChildren false 它起作用了 当视图动画时up 当我为视图设置动画时down图像仍然隐藏 这是有效
  • SVG 用事件触发动画

    如何通过 javascript 使用任意事件触发 svg 动画元素开始动画 我在想象类似的事情begin mySpecialEvent 然后我可以发送mySpecialEvent并且动画将开始 如果已经播放则再次开始 这是一篇涵盖您需要的文
  • Three.js - 在代码中包含网格数据

    我有这个 Three js 代码 其中 JSON 加载器从文件 models mountain json 加载网格 var Three new function this scene new THREE Scene this camera
  • 如何在 Bootstrap 3 中制作进度条动画?

    我正在尝试为 Bootstrap 进度条设置动画 但我不知道该怎么做 我得到了宽度的值但是console log bar width 返回宽度px但不是 如内联所示style width 90 我用代码重新创建了一个 bootply Boo
  • UIView过渡动画

    ViewB and ViewC are subviews of ViewA Say ViewB is currently on top of ViewC I would like to bring ViewC on top with fli
  • 启动 CSS 动画 JavaScript

    如何用js启动CSS动画 第一行 webkitAnimation 有效 但其他行无效 anim logo style webkitAnimation threesixty 3s anim logo style mozAnimation th
  • 我想制作具有3D效果的幻灯片菜单,如下图所示

    我可以使用此代码制作滑块 但我不知道如何制作3D import android os Bundle import android support v4 app Fragment import android support v7 app A
  • 使用 Gridbaglayout 时的动画。

    我最近开始学习 Java 想知道是否可以在使用 GridBag 布局的同时制作动画 这些可能吗 如何实现 任何教程 帮助等将不胜感激 为了执行这种性质的任何类型的动画 您将需要某种代理布局管理器 它需要确定所有组件的当前位置 即布局管理器希
  • IE 中缓慢的 jQuery 动画

    我有一个网站http www special4you co uk http www special4you co uk并有一个由气球制成的动画导航 这在 FF 和 Chrome 中工作并且看起来很可爱 但在所有 IE 中它看起来很裤子 因为
  • 只有geometry.elementsNeedUpdate 会导致内存分配 - 为什么?

    如果我有一个简单的动画功能 function animate geometry elementsNeedUpdate true allocates memory without geometry faces 0 color requestA
  • JavaFX:使用 PathTransition 作为绘图笔的动画

    示例代码 node Rectangle rect new Rectangle 0 0 20 20 path Text text TextBuilder create text J a v a F X R o c k s font new F
  • 如何在网页中渲染 Blender 模型?

    因此 我探索了在网络应用程序中渲染搅拌机模型的多种选项 现在我将模型导出为 gltf格式 这是我的代码 App js import React Suspense from react import App css import Model
  • 三 JS 网格在模型的另一侧可见

    所以我使用在 Blender 中为 ThreeJS 制作的自定义模型 我将其导出为 obj 文件 并使用 Three js 转换实用程序创建 json 文件 我将其设置为旋转 当它旋转时 您可以看到模型的另一侧 这是我用来加载它的代码 lo
  • 使用 pytherejs 嵌入小部件:错误的视角和相机观察

    我在用pythreejs可视化一些 3D 模型 在 Jupyter 笔记本上可视化模型时 一切都按预期进行 但是当尝试将小部件嵌入 HTML 文档时 我面临两个问题 看起来相机在加载时正在查看 0 0 0 而不是预期的那样 一旦您与小部件交

随机推荐

  • 传单地图的大小不适合目标元素的尺寸

    我很难让传单地图在我的应用程序的 div 内正确呈现 可能值得一提的是 我正在使用 AngularJS Angular Material 具有基于 Flex 的布局 和 ui router 因此 div 所在的页面是用户调用操作导航到该页面
  • 无法在 Windows 上的 Python 3.11 中安装 PyQt6 工具

    我安装了Python 3 11在我的 Windows 11 计算机上预发布 https www python org downloads release python 3110a7 https www python org download
  • 禁用弹出窗口中的浏览器地址栏

    我有以下带有 Javascript 的 HTML a href Hide Address Bar a 它在 IE 中运行良好 但在 FireFox 3 及更高版本中运行不佳 我想在弹出窗口出现时禁用 位置 栏 问题不是你的语法错误 问题是安
  • R - 如何通过嵌套 tibbles + pwalk(rmarkdown::render) 生成参数化报告

    我正在尝试根据学生数据生成评估报告 我的想法是创建一个 RDS 嵌套 tibble 来传递给rmarkdown render using purrr pwalk 我对 purrr 及其它还比较陌生map函数族 这是有效的代码部分 尝试一下
  • 如何在 haskell 中为这棵树实现 monoid 接口?

    请原谅这些术语 我的思想仍然弯曲 那个树 data Ftree a Empty Leaf a Branch Ftree a Ftree a deriving Show 我有几个问题 If Ftree不可能Empty 它不再是一个Monoid
  • Azure Web api VS 移动服务

    使用时主要区别是什么 Azure Web API 技术上使用 Azure 网站模块 https www windowsazure com en us develop net tutorials rest service using web
  • 从上方查看城市坐标

    作为一个小项目 我一直在考虑创建一个类似 Google 地球的动画 我想在旋转地球以各个城市为中心的同时播放时间线 目前 我可以使用默认视图设置来渲染地球仪 其中城市由点表示 当我尝试使用俯视城市 例如丹佛 的视图向量来调整相机方向时 我最
  • 使用 C# 从 NVarchar(Max) 列流式传输数据

    我想将一些文件的内容放入数据库中以供单独的进程读取 这是一个两步的事情 因为文件将上传到 java 服务器 然后由定期运行的单独的 c 应用程序进行处理 我本来打算使用nvarchar Max 列来表示数据 但我不知道如何以合理的方式从此类
  • MySQL 按小时分组

    我正在尝试按小时使用情况从历史记录表中获取报告 history表是 CREATE TABLE IF NOT EXISTS history history id int 11 unsigned NOT NULL AUTO INCREMENT
  • 错误:由于“_”未定义而无法实例化模块 restangular

    当第一次在工作网站上使用 Restangular 时 我收到以下 JavaScript 错误 由于 未定义 无法实例化模块 restangular 我缺少什么 未定义 在 Restangular 模块中 是什么意思 这是一个简单的疏忽 下划
  • mosquitto 中的地址已在使用错误

    我已经在我的 ubuntu 机器上安装了 mosquitto 服务器和客户端软件包 当我运行命令 mosquitto 来运行 mosquitto 服务器时 我收到错误 错误 地址已在使用中 为什么我会收到此错误 我该如何解决这个问题 我遇到
  • Qt 中的内存管理

    我对 Qt 内存管理有一点疑问 让我们以Listview为例 在listview中我们通过动态分配内存来添加每个项目 那么在这种情况下我们是否需要手动删除所有 新 的项目 E g Qlistview list new Qlistview Q
  • 纱线全局命令不起作用

    我正在使用 Yarn v0 16 1 如果我理解正确的话 根据文档 https yarnpkg com en docs cli global yarn global add
  • sleep 0 在 shell 脚本中做什么?如果在 ansible SSH 配置中使用它在每个命令后附加它会做什么?

    什么是sleep 0在 shell 脚本中做什么 我阅读了 sleep 的手册页 它说 延迟指定的时间 参数 NUMBER 以秒为单位指定这个时间 默认情况下 但我看到 ansible 使用sh c echo ec2 user sleep
  • VSCODE 中的 YAML 文件格式

    我刚刚开始使用 VSCODE 每次在现有 YML 文件中粘贴 YAML 代码时都会遇到麻烦 基本上 编辑器似乎会自动格式化文档 这样做会弄乱文档中的重要空间 这会导致 Azure Devops 中的构建中断 尽管 VS code 可以很好地
  • 发送在我的 NDIS 修改过滤器驱动程序中无法正常工作

    我正在尝试使用 NDIS 来实现数据包修改过滤器 我使用了丢弃数据包并从克隆 NBL 发起发送 接收的方法 msdn 上的文档说这是允许的 https learn microsoft com en us windows hardware d
  • Leaflet/shiny:无法绘制反应多边形

    看完了Leaflet for R 页面上的闪亮集成示例 https rstudio github io leaflet shiny html 我在子集化和显示一些多边形以在我闪亮的应用程序中显示时遇到问题 目前 我正在得到一个带有侧边栏的应
  • phantomjs 没有关闭并留下孤立进程

    在 PhantomJS 1 9 2 ubuntu 12 LTS 和 Ghostdirver 1 04 以及 selenium 2 35 上 测试后我得到了悬空的 phantomjs 进程 有人知道如何解决这个问题的好方法吗 这是一个演示奇怪
  • 使express.js 中单个用户的所有会话失效

    出于安全原因 我们希望能够使用户的所有活动会话无效 例如 如果他们更改密码 或者只是希望能够强制注销其他会话 我们使用 Node js Express express sessions 和 Redis 会话存储 在我们的应用程序中 我们有
  • 除非修改源代码,否则 Three.js 骨骼动画无法工作

    使用 Three js r68 我需要对源代码进行轻微修改才能使我的动画正常工作 未经修改 每种类型的模型中只有一个是动画的 每种类型的模型都有多个生成 这是第 29407 行的修改后的源代码 从 29389 开始发布的代码 THREE A