当相机沿 y 轴向下移动时,为什么这个 ThreeJs 平面会出现扭结?

Why does this ThreeJs plane appear to get a kink in it as the camera moves down the y-axis?

我有一个 THREE.PlaneBufferGeometry 的实例,我像这样应用图像纹理:

var camera, scene, renderer;
var geometry, material, mesh, light, floor;

scene = new THREE.Scene();

THREE.ImageUtils.loadTexture( "someImage.png", undefined, handleLoaded, handleError );
function handleLoaded(texture) {

  var geometry = new THREE.PlaneBufferGeometry(
    texture.image.naturalWidth,
    texture.image.naturalHeight,
    1,
    1
  );
  var material = new THREE.MeshBasicMaterial({
    map: texture,
    overdraw: true
  });
  floor = new THREE.Mesh( geometry, material );
  floor.material.side = THREE.DoubleSide;
  scene.add( floor );

  camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, texture.image.naturalHeight * A_BUNCH );
  camera.position.z = texture.image.naturalWidth * 0.5;
  camera.position.y = SOME_INT;
  camera.lookAt(floor.position);

  renderer = new THREE.CanvasRenderer();
  renderer.setSize(window.innerWidth,window.innerHeight);
  appendToDom();
  animate();
}

function handleError() {

  console.log(arguments);
}

function appendToDom() {

  document.body.appendChild(renderer.domElement);
}

function animate() {

  requestAnimationFrame(animate);
  renderer.render(scene,camera);
}

这里是码笔:http://codepen.io/anon/pen/qELxvj?editors=001

( 注意:ThreeJs "pollutes" 全局作用域,使用一个苛刻的术语,然后使用装饰器模式装饰THREE——依靠脚本以正确的顺序加载没有使用模块加载器系统。因此,为了简洁起见,我只是将一些必需的装饰器的源代码复制粘贴到代码笔中,以确保它们以正确的顺序加载。你必须向下滚动几千行到代码笔的底部,以使用实例化平面、绘制平面和移动相机的代码。)

在代码笔中,我只是将平面平放在 x-y 轴上,直视 z 轴,就像它一样。然后,我慢慢地沿着y轴向下摇摄相机,不断将它指向平面。

正如您在代码笔中看到的那样,当相机沿负方向沿 y 轴移动时,平面上的纹理似乎在德克萨斯州西部附近形成扭结。

为什么?我怎样才能防止这种情况发生?

我见过类似的行为,不是在 three.js 中,不是在带有 webGL 的浏览器中,而是在带有 directX 和 vvvv 的浏览器中;尽管如此,我认为您只需要将 PlaneBufferGeometry 的 widthSegments/heightSegments 设置为更高级别 (>4) 就可以了!