以下是使用Three.js实现的程序,可以通过点击Mesh上的某一点获取该点在世界坐标系中的坐标,并且可以通过鼠标拖动改变视角:

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8' />
    <title>Three.js Mouse Interaction</title>
    <style>
      body { margin: 0; }
    </style>
  </head>
  <body>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js'></script>
    <script>
      var camera, scene, renderer;
      var mesh, raycaster, mouse;

      init();
      animate();

      function init() {
        // 创建相机
        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.01, 10);
        camera.position.z = 1;

        // 创建场景
        scene = new THREE.Scene();

        // 创建一个红色立方体
        var geometry = new THREE.BoxGeometry(0.2, 0.2, 0.2);
        var material = new THREE.MeshNormalMaterial();
        mesh = new THREE.Mesh(geometry, material);
        scene.add(mesh);

        // 创建射线投射器
        raycaster = new THREE.Raycaster();
        mouse = new THREE.Vector2();

        // 创建渲染器
        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 添加鼠标事件监听器
        document.addEventListener('mousedown', onDocumentMouseDown, false);
        document.addEventListener('mousemove', onDocumentMouseMove, false);

        // 添加窗口大小变化事件监听器
        window.addEventListener('resize', onWindowResize, false);
      }

      function animate() {
        requestAnimationFrame(animate);

        // 旋转立方体
        mesh.rotation.x += 0.01;
        mesh.rotation.y += 0.02;

        renderer.render(scene, camera);
      }

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

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

      function onDocumentMouseDown(event) {
        event.preventDefault();

        // 将鼠标点击位置转换为标准设备坐标
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

        // 通过射线投射器获取点击位置的物体
        raycaster.setFromCamera(mouse, camera);
        var intersects = raycaster.intersectObjects(scene.children);

        if (intersects.length > 0) {
          // 获取点击位置的相对世界坐标
          var point = intersects[0].point;
          console.log('点击位置相对于世界坐标系的坐标:', point);
        }
      }

      function onDocumentMouseMove(event) {
        // 将鼠标移动事件的位置转换为标准设备坐标
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

        // 通过射线投射器获取鼠标所在位置的物体
        raycaster.setFromCamera(mouse, camera);
        var intersects = raycaster.intersectObjects(scene.children);

        if (intersects.length > 0) {
          // 设置鼠标所在位置的物体为选中状态
          intersects[0].object.material.color.set(0xff0000);
        }
      }
    </script>
  </body>
</html>

在这段程序中,我们创建了一个红色立方体,并在场景中添加了该立方体。通过鼠标点击立方体的某一点,可以在浏览器的控制台输出该点在世界坐标系中的坐标。同时,鼠标移动到立方体上时,立方体的颜色会变为红色。

你可以将上述代码保存为一个HTML文件,在浏览器中打开该文件,就可以看到程序的运行效果。


原文地址: https://www.cveoy.top/t/topic/pRkB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录