1

私は現在、ThreeJs(キャンバスモード)で遊んでおり、アルファの問題があります。

Y の周りを反時計回りに回転する固体の球体を取得しようとしています。その周りを時計回りに回転するわずかに大きな半透明の球体を使用します。それらが静止していてカメラを動かすと、すべてがうまく見えますが、回転を追加するとすぐに、半透明の球が「裂ける」か、小さな球でクリップされます。

私は解決策を求めて StackOverflow を調べ、すべてが y > 0 であること、renderer.sortObjects が false であり、transparents が true に設定されていることを確認し、depthWrite/depthTest を試してみましたが、結果を変更できないようです。

内側の球体をもっと小さくすると問題は解決するようですが、目の前のタスクでは 2 つの球体をほぼ同じサイズにする必要があります。

Z深度の解像度に関連している可能性があると思ったので、近平面と遠平面のクリップをいじってみましたが、違いはありませんでした。

ここに問題の jsFiddle があります。どんな助けでも大歓迎です。

enter code here
var container;
var camera;
var scene;
var renderer;
var objects = [];

init();
animate();

function init() {

    container = document.createElement('div');
    document.body.appendChild(container);

    var info = document.createElement('div');
    info.style.position = 'absolute';
    info.style.top = '10px';
    info.style.width = '100%';
    info.style.textAlign = 'center';
    container.appendChild(info);

    var width = window.innerWidth
    var height = window.innerHeight

    camera = new THREE.PerspectiveCamera(70, width / height , 1, 1000);
    camera.position.set(0, 10, 400);

    scene = new THREE.Scene();

    // ---------------------------------------------------------------
    // object 1
    var geometryOne = new THREE.SphereGeometry(190, 10, 10);
    var materialOne = new THREE.MeshBasicMaterial({
        color: 0x0000ff,
        opacity: 1.0,
        transparent: true
    });

    var objectOne = new THREE.Mesh(geometryOne, materialOne);

    objectOne.position.x = 0.0;
    objectOne.position.y = 10.0;
    objectOne.position.z = 0.0;

    objectOne.scale.x = 1.0;
    objectOne.scale.y = 1.0;
    objectOne.scale.z = 1.0;

    objectOne.rotation.x = 0.0;
    objectOne.rotation.y = 0.0;
    objectOne.rotation.z = 0.0;

    scene.add(objectOne);
    objects.push(objectOne);

    // ---------------------------------------------------------------
    // object 2
    var geometryTwo = new THREE.SphereGeometry(200, 10, 10);
    var materialTwo = new THREE.MeshBasicMaterial({
        color: 0xffff00,
        opacity: 0.5,
        transparent: true,
        depthWrite: false,
        depthTest: false
    });

    var objectTwo = new THREE.Mesh(geometryTwo, materialTwo);

    objectTwo.position.x = 0.0;
    objectTwo.position.y = 10.0;
    objectTwo.position.z = 10.0;

    objectTwo.scale.x = 1.0;
    objectTwo.scale.y = 1.0;
    objectTwo.scale.z = 1.0;

    objectTwo.rotation.x = 0.0;
    objectTwo.rotation.y = 0.0;
    objectTwo.rotation.z = 0.0;

    scene.add(objectTwo);
    objects.push(objectTwo);

    //------------------------------------------------------------------
    //renderer
    renderer = new THREE.CanvasRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.sortObjects = false;

    container.appendChild(renderer.domElement);

    //------------------------------------------------------------------
    //event listener(s)
    window.addEventListener('resize', onWindowResize, false);
}

function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();

    renderer.setSize(window.innerWidth, window.innerHeight);
}

function animate() {
    requestAnimationFrame(animate);
    render();
}

function render() {
    objects[0].rotation.y += 0.001;
    objects[1].rotation.y -= 0.001;
    renderer.render(scene, camera);
}

http://jsfiddle.net/tonka_thompson/qwjWG/2/

4

1 に答える 1

1

ではCanvasRenderer、ジオメトリのテッセレーション (面の数) を増やすことでアーティファクトを減らすことができます。

var geometryOne = new THREE.SphereGeometry( 200, 24, 16 );

更新されたフィドル: http://jsfiddle.net/qwjWG/3/

three.js r.59

于 2013-07-23T14:36:34.807 に答える