未捕获的错误:3.Quaternion: . setfromeuler()现在期望欧拉旋转而不是Vector3和顺序

Uncaught Error: THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order

本文关键字:旋转 期望 Vector3 顺序 错误 Quaternion setfromeuler      更新时间:2023-09-26

我正在使用ThreeJS/WebGL来演示iframe内部的旋转行星。除了一个警告和一个问题外,它工作正常:

Warning: THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter. 
Issue: Uncaught Error: THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.

我在iframe的主体中包含了以下资产:

<div id="webgl"></div> 
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.js"></script> 
<script type="text/javascript" src="https://cdn.rawgit.com/bubblin/The-Solar-System/master/jupiter/js/detector.js"> 
</script> 
<script type="text/javascript" src="https://cdn.rawgit.com/bubblin/The-Solar-System/master/jupiter/js/trackBallControls.js"> </script>
<script type="text/javascript" src="https://cdn.rawgit.com/bubblin/The-Solar-System/master/jupiter/js/xRingGeometry.js"> </script>

正如你所看到的,我正在使用trackBallControls.js根据用户输入/触摸旋转球体,我已经覆盖了一个RingGeometry方法,使ring_image沿着圆周分层,而不是径向放射。

下面是模拟木星的完整代码,例如:

(function() {
  var webglEl = document.getElementById('webgl');
  if (!Detector.webgl) {
    Detector.addGetWebGLMessage(webglEl);
    return;
  }
  THREE.ImageUtils.crossOrigin = '';
  var width = window.innerWidth,
    height = window.innerHeight;
  var radius = 0.45,
    segments = 32,
    rotation = 5;
  var scene = new THREE.Scene();
  var camera = new THREE.PerspectiveCamera(45, width / height, 0.01, 1000);
  camera.position.z = 3;
  camera.position.y = 1;
  camera.position.x = -1;
  var renderer = new THREE.WebGLRenderer();
  renderer.setSize(width, height);
  scene.add(new THREE.AmbientLight(0x553333));
  var light = new THREE.DirectionalLight(0xffffff, .5);
  light.position.set(5, 3, 5);
  scene.add(light);
  var sphere = createSphere(radius, segments);
  sphere.rotation.y = rotation;
  scene.add(sphere);
  var rings = createRings(radius, segments);
  rings.rotation.y = rotation;
  scene.add(rings);
  var stars = createStars(90, 64);
  scene.add(stars);
  var controls = new THREE.TrackballControls(camera);
  webglEl.appendChild(renderer.domElement);
  render();
  function render() {
    controls.update();
    sphere.rotation.y += 0.08;
    rings.rotation.y += 0.05;
    requestAnimationFrame(render);
    renderer.render(scene, camera);
  }
  function createSphere(radius, segments) {
    return new THREE.Mesh(new THREE.SphereGeometry(radius, segments, segments), new THREE.MeshPhongMaterial({
      map: THREE.ImageUtils.loadTexture('https://cdn.rawgit.com/marvindanig/Images/master/jupiter/jupitermap.jpg'),
      bumpScale: 0.05,
      specular: new THREE.Color('#190909')
    }));
  }
  function createRings(radius, segments) {
    return new THREE.Mesh(new THREE.XRingGeometry(1.3 * radius, 1.6 * radius, 2 * segments, 5, 0, Math.PI * 2), new THREE.MeshBasicMaterial({
      map: THREE.ImageUtils.loadTexture('https://cdn.rawgit.com/bubblin/The-Solar-System/master/jupiter/images/rings.png'),
      side: THREE.DoubleSide,
      transparent: true,
      opacity: 0.2,
      specular: new THREE.Color('#495909')
    }));
  }
  function createStars(radius, segments) {
    return new THREE.Mesh(new THREE.SphereGeometry(radius, segments, segments), new THREE.MeshBasicMaterial({
      map: THREE.ImageUtils.loadTexture('https://cdn.rawgit.com/marvindanig/Images/master/galaxy_starfield.png'),
      side: THREE.BackSide
    }));
  }
}());

它可以工作(参见这里的输出),但是我得到了这些警告和一个错误。错误和警告最终累积起来,我的应用在iPad/iPhone上崩溃了。

请帮帮我,我是ThreeJS的新手。

关于:

Warning: THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter. 

在计算机图形学中,2次幂的纹理可以比非2次幂的纹理处理得更快,这就是为什么你会得到警告。我建议你使用你最喜欢的图像编辑器将球体纹理和圆环纹理调整为2的平方次方。或者,您可以根据警告设置minFilter:

  function createSphere(radius, segments) {
    var texture = THREE.ImageUtils.loadTexture('https://cdn.rawgit.com/marvindanig/Images/master/jupiter/jupitermap.jpg');
    texture.minFilter = THREE.NearestFilter;
    return new THREE.Mesh(new THREE.SphereGeometry(radius, segments, segments), new THREE.MeshPhongMaterial({
      map: texture,
      bumpScale: 0.05,
      specular: new THREE.Color('#190909')
    }));
  }

至于第二个错误,我没有在Chrome 42上看到它,但这是因为你的一个脚本(可能没有显示在这里,因为我找不到任何一个问题)使用Quaternion.setFromEuler这样:

 quat.setFromEuler(new THREE.Vector3(pitch, yaw, roll));

当它应该这样使用的时候:

 quat.setFromEuler(new THREE.Euler(pitch, yaw, roll));

在代码中快速执行CTRL + F,您将找到错误的脚本。