在three.js中在页面滚动时旋转网格

bam*_*amm 2 three.js gsap

我想在页面滚动时旋转一个对象,但我无法使其正常工作。到目前为止,我在页面加载时更新对象的旋转是:

mesh.rotation.y = window.pageYOffset;

然而,这只会在页面加载时更新对象,而不会在滚动时进一步更新它。我知道对于相机,您必须更新投影矩阵才能在对象/网格上拥有交互式相机,但是默认情况下这似乎是启用的(mesh.updateMatrix),我仍然无法使其工作。我究竟做错了什么?

Mug*_*n87 6

我知道对于相机,您必须更新投影矩阵才能拥有交互式相机,

恐怕这是不对的。在许多应用中,投影矩阵实际上是静态的。相机three.js是一个像网格一样的 3D 对象。您可以修改positionrotation属性以对其进行转换。

查看以下实时示例,该示例展示了如何通过 GSAP 在滚动时为立方体设置动画:

let camera, scene, renderer;

init();
animate();

function init() {

  scene = new THREE.Scene();

  camera = new THREE.PerspectiveCamera(40, window.innerWidth / ( window.innerHeight * 2 ), 0.1, 10);
  camera.position.set(0, 0, 7);

  const geometry = new THREE.BoxBufferGeometry();
  const material = new THREE.MeshNormalMaterial();

  const mesh = new THREE.Mesh(geometry, material);
  scene.add(mesh);

  renderer = new THREE.WebGLRenderer({antialias: true});
  renderer.setPixelRatio( window.devicePixelRatio );
  renderer.setSize(window.innerWidth, window.innerHeight * 2);
  document.body.appendChild(renderer.domElement);

  // gsap

  gsap.registerPlugin(ScrollTrigger);

  gsap.to(mesh.rotation, {
    scrollTrigger: {
    trigger: "#trigger",
    start: "top top",
    end: "bottom top",
    scrub: true,
    toggleActions: "restart pause resume pause"
  },
    y: Math.PI
  });

}


function animate() {

  requestAnimationFrame(animate);
  renderer.render(scene, camera);
  
}
Run Code Online (Sandbox Code Playgroud)
body {
    margin: 0px;
}
canvas {
    display: block;
}
#trigger {
    position: absolute;
    height: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/three@0.122/build/three.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.5.1/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.5.1/ScrollTrigger.min.js"></script>  

<div id="trigger">

</div>
Run Code Online (Sandbox Code Playgroud)