无法在THREE.js中获得对象的世界位置

时间:2019-05-14 11:48:25

标签: three.js

我目前正在尝试制作一个“地牢生成器”-我有一些场景对象,每个对象内部都有一个EntryNode,ExitNode和Room网格。我在基于先前的房间ExitNode设置Room对象的位置时遇到麻烦。

模型的结构如下:

; Encrypted HTTP proxy authenticated with a client certificate
; located in the Windows certificate store
;[example-proxy]
;client = yes
;accept = 127.0.0.1:8080
;connect = example.com:8443

不能保证房间大小统一或始终相同,否则这很简单。

我目前正在像这样创建一个房间:

Scene
   L Entry_Node (instanceof THREE.Mesh) position: 0,0,0
   L Room (instaceof THREE.Group), positiom 0,0,23
      L (Several Children that are irrelevant)
   L Exit_Node position: 0,0,46

我正在尝试像这样附加多个房间:

_generateRoom(name) {
    let room = common.assets.model(name);       // Returns THREE.Scene with EntryNode, Room and ExitNode as children

    const entryNode = room.children.find(e => e.name.startsWith('Node_Entry'));
    const exitNode = room.children.find(e => e.name.startsWith('Node_Exit'));

    return [room, entryNode, exitNode];
}

但是,问题是在_preGenerate(count) { let rooms = []; for (let i = 0; i < count; i++) { const room = this._generateRoom('endless_straight3'); // Returns an array as [Room, EntryNode, ExitNode] this._stage.add(room[0]); room[0].updateMatrixWorld(); if (rooms.length > 0) { this._exitNode.updateMatrixWorld(true); this._exitNode.getWorldPosition(room[0].position); } else { room[0].position.setScalar(0); } this._exitNode = room[2]; console.log(room[0].position); rooms.push(room); } } 处-它总是返回(貌似)退出节点的本地位置-this._exitNode.getWorldPosition(room[0].position);

我希望它根据世界位置返回退出节点的位置-因此第一个房间为46,第二个房间为92,第三个房间为138,依此类推。 不知道这里出了什么问题,我们将不胜感激!

cc。 https://discourse.threejs.org/t/trouble-getting-world-position-of-object/7540

1 个答案:

答案 0 :(得分:1)

Three.js discourse所述,问题在于更改其位置后不更新父房间WorldMatrix。将room[0].updateMatrixWorld();移至更新后,可以解决所有问题。

const room = this._generateRoom('endless_straight3'); 
this._stage.add(room[0]);

if (rooms.length > 0) {
    this._exitNode.updateMatrixWorld(true);
    this._exitNode.getWorldPosition(room[0].position);
} else {
    room[0].position.setScalar(0);
}
room[0].updateMatrixWorld();
this._exitNode = room[2];

很高兴我能够提供帮助。