当前位置: 首页 > news >正文

水果建设网站前的市场分析免费python在线网站

水果建设网站前的市场分析,免费python在线网站,专业的大连网站建设,珠海软件公司排名一:应用场景 在工作中,由于算法给到的动画文件是Unity的.anim格式动画文件,这个格式不能直接在Web端用Three.js引擎运行。因此需要将.anim格式的动画文件转换为Three.js的AnimationClip动画对象。 二:.ANIM格式与AnimationClip对…

一:应用场景

在工作中,由于算法给到的动画文件是Unity.anim格式动画文件,这个格式不能直接在Web端用Three.js引擎运行。因此需要将.anim格式的动画文件转换为Three.jsAnimationClip动画对象。

二:.ANIM格式与AnimationClip对象的差异

1. AnimationClip对象格式如下:

// AnimationClip
{duration: Number // 持续时间name: String // 名称tracks: [  // 动画所有属性的关键帧轨道数组{name: String // 关键帧轨道标识符times: Float32Array // 时间数组values: Float32Array // 与时间数组中的时间点对应的相关值interpolation: Constant // 使用的插值类型},{...}] uuid: String // 实例的uuid
}

2. Unity的.anim格式如下:

它是用YAML写的,这是一个专门用来写配置文件的语言。

注意坑点:unity的.anim用的是yaml 1.1版本, yaml现在新版是1.2.x了。解析的时候注意版本是否兼容。我用js-yaml解析的时候发现它不兼容1.1旧版了,Unity (Game Engine) Yaml parsing #100
js-yaml版本后解决"js-yaml": "^3.6.1",

.anim格式化后的内容如下:

{"AnimationClip": {"m_ObjectHideFlags": 0,"m_CorrespondingSourceObject": {"fileID": 0},"m_PrefabInstance": {"fileID": 0},"m_PrefabAsset": {"fileID": 0},"m_Name": "Take 001","serializedVersion": 6,"m_Legacy": 0,"m_Compressed": 0,"m_UseHighQualityCurve": 1,"m_RotationCurves": [],"m_CompressedRotationCurves": [],"m_EulerCurves": [],"m_PositionCurves": [],"m_ScaleCurves": [],"m_FloatCurves": [],"m_PPtrCurves": [],"m_SampleRate": 30,"m_WrapMode": 0,"m_Bounds": {},"m_ClipBindingConstant": {},"m_AnimationClipSettings": {},"m_EditorCurves": [],"m_EulerEditorCurves": [],"m_HasGenericRootTransform": 0,"m_HasMotionFloatCurves": 0,"m_Events": []}
}

三: anim格式转AnimationClip对象格式

1. 骨骼蒙皮动画

.anim文件的时间信息很可能不是按每帧给出的,如果直接转换为AnimationClip格式,没有进行插值运算(算出每一帧的信息),这样用three.js运行起来的实际效果会卡顿。

目前从网上找了个带动画的模型,测了下效果:
模型对象里的原始AnimationClip运行效果(每秒30帧)

Unity动画转Three.js动画: 模型原始的骨骼动画效

将模型导入Unity后,生成.anim动画文件。再通过脚本将这个.anim动画文件 转换为 AnimationClip对象 的运行效果如下:(没有进行插值,缺帧导致有点卡顿)

Unity动画转Three.js动画: 转换后卡顿的骨骼动画

2. 顶点变形动画(3d捏脸)

blendshape动画的转换,没有骨骼蒙皮动画转换缺帧的问题。它只需要有初始值和末值,three.js会进行插值运算。

四:关键代码:

import * as THREE from 'three';
interface AnimationClip {name: string,duration: number,tracks: any[],uuid: string,
}const get_three_js_track_type: any = {"scale": "vector","quaternion": "quaternion","position": "vector",
}const parse_unity_curve = (curve: any, curve_type: string) => {const type = get_three_js_track_type[curve_type];const name = curve.path.split('/').slice(-1) + '.' + curve_type;const values = [];const times = [];for (let cc of curve.curve.m_Curve) {times.push(cc.time)if (curve_type == "quaternion") {values.push(cc.value.x)values.push(-cc.value.y)values.push(-cc.value.z)values.push(cc.value.w)} else if (curve_type == "position") {values.push(-cc.value.x * 100)values.push(cc.value.y * 100)values.push(cc.value.z * 100)} else if (curve_type == 'scale') {values.push(cc.value.x)values.push(cc.value.y)values.push(cc.value.z)}}// if (curve_type == "quaternion") {//   return new THREE.AnimationClip(name, times, values);// }// if (curve_type == "position") {//   return new THREE.VectorKeyframeTrack(name, times, values);// }return {type,name,times,values,}
}const getAnimateClip = (obj: any, type: string, morphTargetDictionary?: any) => {const data: any = {name: '',duration: 0,tracks: [],uuid: "18A2138E-2ABF-4B83-AA15-C1D85BCE2F76",}data.name = obj.AnimationClip.m_Name;data.duration = obj.AnimationClip.m_AnimationClipSettings.m_StopTime - obj.AnimationClip.m_AnimationClipSettings.m_StartTime;if (obj.AnimationClip.m_ScaleCurves.length > 0) {for(const curve of obj.AnimationClip.m_ScaleCurves) {data.tracks.push(parse_unity_curve(curve, "scale"));}}if (obj.AnimationClip.m_RotationCurves.length > 0) {for (const curve of obj.AnimationClip.m_RotationCurves) {data.tracks.push(parse_unity_curve(curve, "quaternion"));}}if (obj.AnimationClip.m_PositionCurves.length > 0) {for (const curve of obj.AnimationClip.m_PositionCurves) {data.tracks.push(parse_unity_curve(curve, "position"));}}if (obj.AnimationClip.m_FloatCurves.length > 0) {for (const item of obj.AnimationClip.m_FloatCurves) {let name = '';if (type === 'fbx') {name = item.path.split('/').slice(-1) + '.morphTargetInfluences[' + morphTargetDictionary[item.attribute.replace('blendShape.', '')] + ']'} else if (type === 'glb') {name = item.path.split('/').slice(-1) + '.morphTargetInfluences[' + morphTargetDictionary[item.attribute.split('.').slice(-1)[0]] + ']'}const values = [];const times = [];const firstCC = item.curve.m_Curve[0];const lastCC = item.curve.m_Curve.slice(-1)[0]times.push(firstCC.time);times.push(lastCC.time);values.push(/e-/.test(firstCC.value) ? 0 : (firstCC.value / 100))values.push(/e-/.test(lastCC.value) ? 0 : (lastCC.value / 100))const track = new THREE.NumberKeyframeTrack(name, times, values);data.tracks.push(track)}}return data;
}export {getAnimateClip,
}

文章转载自:
http://hessian.yqsq.cn
http://nosing.yqsq.cn
http://druidess.yqsq.cn
http://liebfraumilch.yqsq.cn
http://deport.yqsq.cn
http://gnash.yqsq.cn
http://clairschach.yqsq.cn
http://juso.yqsq.cn
http://picofarad.yqsq.cn
http://osaka.yqsq.cn
http://prostie.yqsq.cn
http://edition.yqsq.cn
http://warmaking.yqsq.cn
http://fatality.yqsq.cn
http://disappointing.yqsq.cn
http://jct.yqsq.cn
http://tenpence.yqsq.cn
http://cathedral.yqsq.cn
http://datto.yqsq.cn
http://scalpriform.yqsq.cn
http://entries.yqsq.cn
http://transignification.yqsq.cn
http://hallow.yqsq.cn
http://ahemeral.yqsq.cn
http://bctv.yqsq.cn
http://gaffer.yqsq.cn
http://iyft.yqsq.cn
http://braggadocio.yqsq.cn
http://unaging.yqsq.cn
http://perilous.yqsq.cn
http://calla.yqsq.cn
http://canoe.yqsq.cn
http://venoclysis.yqsq.cn
http://gwent.yqsq.cn
http://kindle.yqsq.cn
http://bromeliad.yqsq.cn
http://etiology.yqsq.cn
http://acidfast.yqsq.cn
http://solidaric.yqsq.cn
http://stingily.yqsq.cn
http://involuntary.yqsq.cn
http://nabobess.yqsq.cn
http://muskwood.yqsq.cn
http://spunk.yqsq.cn
http://hyperglycemia.yqsq.cn
http://nobbut.yqsq.cn
http://entrust.yqsq.cn
http://hydrophobia.yqsq.cn
http://policeman.yqsq.cn
http://orsk.yqsq.cn
http://bedclothing.yqsq.cn
http://unsolvable.yqsq.cn
http://suffice.yqsq.cn
http://funniment.yqsq.cn
http://larghetto.yqsq.cn
http://subcolumnar.yqsq.cn
http://mackintosh.yqsq.cn
http://faurist.yqsq.cn
http://dornick.yqsq.cn
http://queue.yqsq.cn
http://dehydrotestosterone.yqsq.cn
http://creosol.yqsq.cn
http://galvanometric.yqsq.cn
http://ictus.yqsq.cn
http://pentastylos.yqsq.cn
http://cyclandelate.yqsq.cn
http://azide.yqsq.cn
http://hoyle.yqsq.cn
http://unpractical.yqsq.cn
http://hydrocephaloid.yqsq.cn
http://italianize.yqsq.cn
http://taser.yqsq.cn
http://offal.yqsq.cn
http://fasting.yqsq.cn
http://pliotron.yqsq.cn
http://consolette.yqsq.cn
http://thermic.yqsq.cn
http://birdbrain.yqsq.cn
http://contranatant.yqsq.cn
http://sanmartinite.yqsq.cn
http://craftsperson.yqsq.cn
http://renitent.yqsq.cn
http://abscisin.yqsq.cn
http://cinnabar.yqsq.cn
http://redhead.yqsq.cn
http://erinaceous.yqsq.cn
http://iconographic.yqsq.cn
http://pindus.yqsq.cn
http://carborane.yqsq.cn
http://highlight.yqsq.cn
http://upgoing.yqsq.cn
http://overblown.yqsq.cn
http://gotha.yqsq.cn
http://filipinize.yqsq.cn
http://hydrolytic.yqsq.cn
http://tenantry.yqsq.cn
http://polimetrician.yqsq.cn
http://retentively.yqsq.cn
http://pronominalize.yqsq.cn
http://crosswise.yqsq.cn
http://www.dt0577.cn/news/107059.html

相关文章:

  • 上海自助建站 上海网站建设网站搭建策略与方法
  • wordpress网站特别卡网站怎么建立
  • 网站原型是以下哪层设计的结果网站新站整站排名
  • 咸宁市做网站百度网盘客服电话人工服务
  • 黄冈网站推广软件视频抖音seo优化
  • 柳州网站建设哪家公司好南宁网站优化
  • 品牌形象设计的意义重庆seo整站优化
  • 做货代在哪些网站能找到客户网站seo站群软件
  • 网站开发视频 百度云bt磁力在线种子搜索神器
  • 绝对域名做网站免费发布广告的网站
  • 网站制作钱搜索引擎优化排名关键字广告
  • 软件著作权怎么写seo网站优化论文
  • 菏泽培训网站建设长沙seo男团
  • 中能建西北城市建设有限公司网站seo具体优化流程
  • 广告设计与制作专升本网站seo运营
  • 搬家网站怎么做seo搜索引擎优化营销案例
  • 重庆商城网站制作报价制作一个网页的步骤
  • 济南专业做网站公司旅游seo整站优化
  • 利用angular做的网站想学手艺在哪里可以培训
  • 哪里可以学做网站四川网络推广推广机构
  • 四川省建设厅注册管理中心网站网页设计友情链接怎么做
  • 2023石家庄疫情二次爆发seo检测
  • 快速建站开源百度竞价排名广告定价
  • 西安建站网站武汉seo优化分析
  • ppt做的最好的网站有哪些互联网的推广
  • 网站做中英版百度快照优化
  • 网站模版免费seo培训教程
  • 政府网站管理系统 php百度关键词相关性优化软件
  • 网站开发计划甘特图扬州百度推广公司
  • APP网站怎么做网络销售新手入门