1

https://github.com/mrdoob/three.js/blob/master/examples/js/effects/OculusRiftEffect.jsの OculusRiftEffect を使用して OculusRift 用に開発しており、スプライトを使用しています。問題は、スプライトがスクリーンショットのように各目の正しい位置に表示されないことです。スクリーンショット家のスプライトがそれぞれの目で異なる位置にあり、眼球に「複視」効果を引き起こしていることがわかります。コードをいじりながら(ここにデモプランカーがあります) 画面の端の近くではポジショニングがより正確であることがわかりますが、ポジショニングがオフになっている画面の中央に近づける必要があります。これは OculusRiftEffect のシェーディング/レンダリングと関係があると思いますが、分解するのに十分な知識がありません。どんな方向性でも感謝します!

サンプルコード:

var _scene, _camera, _renderer, _effect, _sprite;

function init() {
  _scene = new THREE.Scene();
  _camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, .1, 100000);
  _camera.lookAt(new THREE.Vector3());
  _renderer = new THREE.WebGLRenderer({
        antialias: true,
      canvas: document.getElementById('legit')
    });

  _renderer.setSize(window.innerWidth, window.innerHeight);

  _effect = new THREE.OculusRiftEffect(_renderer, {
    worldScale: 1000
  });
  _effect.setSize(window.innerWidth, window.innerHeight);

  THREE.ImageUtils.crossOrigin = 'anonymous';

  _sprite = new THREE.Sprite(
    new THREE.SpriteMaterial({
        map: new THREE.Texture(document.getElementById('icon')),
        color: 0xff0000
    })
  );

  _sprite.scale.set(200, 200, 1);
  _sprite.position.set(500, 800, 1);
  _scene.add(_sprite);

  _scene.add(new THREE.Mesh(
    new THREE.SphereGeometry(3000, 64, 32),
    new THREE.MeshBasicMaterial({
      color: 0xffffff,
      wireframe: true,
      side: THREE.DoubleSide
    })
  ));

  animate();
}

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

function render() {
    _renderer.render(_scene, _camera);
    _effect.render(_scene, _camera);
}

document.addEventListener('DOMContentLoaded', init);
4

3 に答える 3

0

pailhead と Jherico が述べたように、これは Oculus プラグインでは不可能です。私が効果的だと思った回避策は、単純に PlaneGeometry を使用して、それをカメラの子として設定することです。カメラの位置を見るように設定すると、スプライトのように動作し、OculusRiftEffect に対して正しくレンダリングされます。基本的な例 (カメラとシーンを想定):

var sprite = new THREE.Mesh(
    new THREE.PlaneGeometry(100, 100),
    new THREE.MeshBasicMaterial({color: 0xffffff})
);
//assuming camera is at (0,0,0) we need to offset it
sprite.position.set(20, 20, -100);
sprite.lookAt(camera.position);

camera.add(sprite);

//normally camera doesnt need to be added
//but if it has child meshes it is necessary
scene.add(camera);

平面はカメラの子であるため、オフセットが正しく配置されると、どこに行ってもカメラに従います。注意点は、スプライトとまったく同じようには機能しないということです。シーン内で独立して移動することはできませんが、これが私が見つけた最も近い解決策です。

于 2014-06-14T16:52:29.687 に答える
0

Three.js スプライトを読んだところ、シーン内のジオメトリではなく、画面座標を使用して配置されていることがわかりました。このため、シーンに適用される目ごとの射影マトリックス オフセットを無視しています。このため、Oculus Rift の歪み効果と組み合わせて適切に機能するとは思えません。

于 2014-05-27T18:09:47.947 に答える