0

Three.jsを使用してオブジェクトの表示と選択を行っていますが、可視性に問題があります

私はthree.jsにcolladaオブジェクトをロードします。私のcolladaローダーはリポジトリのものとは少し異なります。追加した

function copyMaterial (_material) {
    var newMaterial = new THREE.MeshLambertMaterial();
    for (var p in _material) {
        if (_material.hasOwnProperty(p) && p !== "id") {
            var obj = _material[p];
            newMaterial[p] = obj;
        }
    }
    return newMaterial;
}

マテリアルをロードするときは、割り当てる前にコピーするだけです。

これにより、同じコラーダマテリアルを使用している場合でも、すべてのオブジェクトの不透明度を個別に変更できます。

これはうまくいきます。そうすることで、奇妙な振る舞いが見られるようになりました。オブジェクトの向きによっては、透明度が透けて見える部分もあれば、見えない部分もあります。スクリーンショットはよりよく説明します、

内部部品は見えません

内部部品が見えます

何が起こっているのか、そしてそれをどのように解決するのかについてのアイデアはありますか?

ありがとう

4

1 に答える 1

3

私の知る限り、これは2つの場合に発生します。

1)同じ位置に複数のファセットが設定されていて、一方が表示され、もう一方が表示されていない場合。したがって、レンダリング時には、最初にレンダリングする面のカメラアングルによって異なります。

2)通常、オブジェクトのすべての部分を透明に設定しようとしますが、それでも一部の面が他の面を通して見えるようにしたい場合。繰り返しますが、これはレンダラーの動作方法です。

今、私が見つけた唯一の解決策は、FrondSideとBackSideを別々のマテリアルに割り当て、両方を同じオブジェクト(オブジェクトの一部だと思います)に設定することです。

texture = new THREE.Texture(textureImage);
texture.needsUpdate = true;
material = new THREE.MeshBasicMaterial({
    map: texture,
    transparent: true,
    side: THREE.BackSide
 }); 
material2 = new THREE.MeshBasicMaterial({
    map: texture,
    transparent: true
});
geometry = new THREE.SphereGeometry(RADIUS, 40, 20);
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
mesh = new THREE.Mesh(geometry, material2);
scene.add(mesh);

この問題の詳細については、https://github.com/mrdoob/three.js/issues/2476をご覧ください

于 2012-12-05T04:27:13.130 に答える