8

したがって、基本的には、グループ Object3D の子 object3D がありますが、子オブジェクトの [x、y、z] 座標は、親オブジェクトのオブジェクト空間に対して相対的に表示されます。3D 空間内の子オブジェクトの位置を変更したいと考えています。 . 最初に、ワールド空間に対する子オブジェクトの位置を取得します。

var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3);

これは、ワールド空間内の子の位置の 3 要素ベクトルを返します。今、私は自分の位置を設定したいと思います。そこで、3 要素ベクトルを作成します。

var new_pos = THREE.Vector3();
new_pos.x = 1;
new_pos.y = 2;
new_pos.z = 3;

childobject.matrixWorld.setPosition(new_pos);

setPosition の関数定義が提供されると、基本的に、オブジェクトのワールド マトリックスの最後の 3 つの要素が、引数として渡されたベクトルの値に設定され、ワー​​ルド空間でのオブジェクトの位置が変更されます。これらの変更後にマトリックスが確実に更新されるように、次の関数を呼び出します。

childobject.matrixWorldNeedsUpdate = true;
childobject.updateMatrixWorld();

オブジェクトの新しいワールド マトリックスを調べると、setPosition 関数が何もしていないことに気付きました。

なんで?実際のコード例が必要な場合は、提供します。しかし、上記は、私が使用したアプリケーション ドメインと構文を非常に正確に表しているはずです。

4

2 に答える 2

8

編集:回答が更新されました。


子オブジェクトのワールド位置を変更したい。

シーンに変換が適用されていないと仮定すると、必要なことを行う 1 つの方法は、次のパターンを使用することです。

scene.attach( child ); // detach from parent and add to scene

child.position.set( x, y, z );

parent.attach( child ); // reattach to original parent

このObject3D.attach( child )メソッドは、子のワールド トランスフォームを維持しながら、子オブジェクトを追加します。

three.js r.132

于 2012-09-22T21:42:27.067 に答える