第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Three.js 中以編程方式創(chuàng)建骨架

在 Three.js 中以編程方式創(chuàng)建骨架

飲歌長嘯 2023-11-12 15:22:40
我正在 Three.js 中加載機(jī)構(gòu)模型(例如機(jī)器人手臂)。遺憾的是,我使用的模型沒有骨架,但我有關(guān)節(jié)的位置、軸等。為了使用諸如 Three-IK 之類的逆運(yùn)動(dòng)解算器,我想根據(jù)這些參數(shù)創(chuàng)建一個(gè)骨架。由于我想使用許多不同的模型,因此我寧愿不手動(dòng)創(chuàng)建骨架,而是用代碼創(chuàng)建骨架。我已經(jīng)嘗試了一個(gè)多星期,根據(jù)這些反映模型的值創(chuàng)建有效的骨骼結(jié)構(gòu),但沒有成功。例如,如果我使用關(guān)節(jié)的位置創(chuàng)建骨骼鏈,我會(huì)得到一個(gè)非常長的骨架,它與我使用的位置完全不匹配。let boneParent;let bonepos = [];let bones = [];model.traverse(child => {? ? switch(child.type) {? ? ? ? case "joint":? ? ? ? ? ? let p = new Vector3();? ? ? ? ? ? child.getWorldPosition(p);? ? ? ? ? ? bonepos.push(p);? ? ? ? ? ? let bone = new Bone();? ? ? ? ? ? boneParent && boneParent.add(p);? ? ? ? ? ? bone.worldToLocal(p.clone());? ? ? ? ? ? bone.position.copy(p);? ? ? ? ? ? bone.rotation.copy(child.rotation);? ? ? ? ? ? bone.scale.copy(child.scale);? ? ? ? ? ? boneParent = bone;? ? ? ? ? ? bones.push(bone);? ? ? ? ? ? break;? ? }});showPoints(scene, bonepos, 0xff0000);const skeletonHelper = new SkeletonHelper(bones[0]);skeletonHelper.visible = true;scene.add(skeletonHelper);上面的代碼產(chǎn)生下面的屏幕截圖。紅色標(biāo)記是我從機(jī)器人關(guān)節(jié)獲得的位置,蜿蜒延伸到遠(yuǎn)處的線是 SkeletonHelper 可視化的骨架。所以我的問題是:我似乎不太了解 Three.js 中如何處理骨骼。如何創(chuàng)建一個(gè)從關(guān)節(jié)位置和方向反映現(xiàn)有模型的骨架?提前致謝!對(duì)于未來的訪客:?Rocksi 是開源的!
查看完整描述

2 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊

經(jīng)過一番擺弄,我找到了解決方案:


let root = new Bone();

let parent = root;

let pos = new Vector3();


for (let joint of robot.arm.movable) {

    let link = robot.getLinkForJoint(joint);

    link.getWorldPosition(pos);

    

    let bone = new Bone();

    parent.add(bone);

    parent.lookAt(pos);

    parent.updateMatrixWorld();  // crucial for worldToLocal!

    bone.position.copy(bone.worldToLocal(pos));

        

    parent = bone;

}

重要的部分是在lookAt()之后調(diào)用updateMatrixWOrld(),以便bone.worldToLocal()正常工作。還lookAt()省去了很多矩陣麻煩:)


查看完整回答
反對(duì) 回復(fù) 2023-11-12
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

child.getWorldPosition(p);

恐怕將世界空間中的位置應(yīng)用于代表本地Bone.position空間中的位置是不正確的。

骨骼父 = 骨骼;

這條線看起來也有問題。一根骨頭可以有多個(gè)子元素。在我看來,您的代碼沒有考慮這個(gè)用例。


查看完整回答
反對(duì) 回復(fù) 2023-11-12
  • 2 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)