【问题标题】:Trouble getting world position of object in THREE.js在 THREE.js 中获取对象的世界位置时遇到问题
【发布时间】:2019-10-01 10:35:12
【问题描述】:

我目前正在尝试制作一个“地牢生成器”——我有一组场景对象,每个对象内部都有一个 EntryNode、ExitNode 和 Room 网格。我无法根据前一个房间 ExitNode 设置 Room 对象的位置。

模型的结构如下:

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); - 它总是返回(看似)出口节点的本地位置 - THREE.Vector3(0, 0, 46)

我希望它根据世界位置返回出口节点的位置 - 第一个房间为 46,第二个房间为 92,第三个房间为 138,依此类推。 不知道这里出了什么问题,感谢任何帮助!

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

【问题讨论】:

    标签: three.js


    【解决方案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];
    

    很高兴我能提供帮助。

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多