Maru_TIme 2023-04-12 09:29 采纳率: 0%
浏览 12

基于three.js的3d全景地图无法正常显示

弱卞来了。3d全景地图无法正常显示
这是我的完整代码 不知道为什么 在点击加载全景图像1或者加载全景图像2按钮之后 不会有任何显示

img

img

img

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>全景图片展示</title>
    <style>
      body { margin: 0; }
      canvas { display: block; }
      #buttonContainer { position: absolute; top: 10px; left: 10px; }
    </style>
  </head>
  <body>
    <div id="buttonContainer">
      <button id="loadImage1">加载全景图片1</button>
      <button id="loadImage2">加载全景图片2</button>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script type="module">
      import { OrbitControls } from "https://cdn.skypack.dev/three/examples/jsm/controls/OrbitControls";
      window.OrbitControls = OrbitControls;
    </script>
    <script src="3Dcube.js"></script>
  </body>
</html>


import { OrbitControls } from 'https://cdn.skypack.dev/three@0.132.2/examples/jsm/controls/OrbitControls.js';

var scene = new THREE.Scene();

var camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建立方体几何体
var cubeGeometry = new THREE.BoxGeometry(10, 10, 10);

// 创建初始材质
var initialTexture = new THREE.TextureLoader().load('./placeholder-image.jpg');
var initialMaterials = [];
for (let i = 0; i < 6; i++) {
  initialMaterials.push(new THREE.MeshBasicMaterial({ map: initialTexture }));
}

// 创建立方体网格
var cube = new THREE.Mesh(cubeGeometry, initialMaterials);
scene.add(cube);

camera.position.z = 15;

var controls = new OrbitControls(camera, renderer.domElement);
controls.enableZoom = false;
controls.target = new THREE.Vector3(0, 0, 0);

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

animate();

document.getElementById('loadImage1').addEventListener('click', function () {
  updatePanorama('./K2qKb.png');
});

document.getElementById('loadImage2').addEventListener('click', function () {
  updatePanorama('./KAFjI.jpg');
});

function updatePanorama(faceImages) {
  splitPanoramaImage(faceImages, function (faces) {
    const loader = new THREE.CubeTextureLoader();

    loader.load(faces, function (texture) {
      texture.mapping = THREE.CubeReflectionMapping;

      for (let i = 0; i < 6; i++) {
        cube.material[i].map = texture;
        cube.material[i].needsUpdate = true;
      }
    });
  });
}

function splitPanoramaImage(imageUrl, callback) {
  const canvas = document.createElement('canvas');
  const context = canvas.getContext('2d');

  const img = new Image();
  img.crossOrigin = 'anonymous';
  img.src = imageUrl;

  img.onload = function () {
    const faceSize = img.width / 4;
    canvas.width = faceSize;
    canvas.height = faceSize;

    const faces = [];
    for (let i = 0; i < 6; i++) {
      let x, y;
      if (i === 0) { // +Y
        x = faceSize;
        y = 0;
      } else if (i === 1) { // -Y
        x = 3 * faceSize;
        y = 0;
      } else if (i === 2) { // -Z
        x = 0;
        y = faceSize;
      } else if (i === 3) { // +X
        x = faceSize;
        y = faceSize;
      } else if (i === 4) { // -X
        x = 3 * faceSize;
        y = faceSize;
      } else { // +Z
        x = 2 * faceSize;
        y = faceSize;
      }

      context.clearRect(0, 0, faceSize, faceSize);
      context.drawImage(img, x, y, faceSize, faceSize, 0, 0, faceSize, faceSize);

      const faceUrl = canvas.toDataURL('image/png');
      faces.push(faceUrl);
    }

    callback(faces);
  };
}


所有的文件都在同一个文件件内 相对路径应该没有出错

img


我水平不是很高 但是这个问题困扰了我好长时间 应该是因为一些低级错误T_T

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-04-12 09:50
    关注

    以下内容部分参考ChatGPT模型:


    首先,建议检查浏览器控制台是否有任何错误信息,以便确定问题的具体原因。

    其次,需要确定three.js库是否已正确加载,并且所有依赖项是否都已加载。可以通过在浏览器控制台中运行ThreeJS变量来测试这一点。

    最后,建议检查代码中的路径是否正确,特别是加载纹理和模型的路径。如果路径不正确,将无法加载纹理和模型。

    以下是一个简单的示例代码,用于加载一个全景图像并将其显示在three.js场景中:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Three.js Panorama Example</title>
      <style>
        body {
          margin: 0;
          overflow: hidden;
        }
      </style>
    </head>
    <body>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
      <script>
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
    
        var renderer = new THREE.WebGLRenderer();
        renderer.setSize( window.innerWidth, window.innerHeight );
        document.body.appendChild( renderer.domElement );
    
        var geometry = new THREE.SphereGeometry( 500, 60, 40 );
        geometry.scale( - 1, 1, 1 );
    
        var texture = new THREE.TextureLoader().load( 'path/to/panorama.jpg' );
        var material = new THREE.MeshBasicMaterial( { map: texture } );
    
        var mesh = new THREE.Mesh( geometry, material );
        scene.add( mesh );
    
        camera.position.z = 0.01;
    
        function animate() {
          requestAnimationFrame( animate );
          renderer.render( scene, camera );
        }
        animate();
      </script>
    </body>
    </html>
    

    请注意,上述代码仅适用于加载单个全景图像。如果要加载多个全景图像,并在用户点击按钮时切换它们,则需要编写更复杂的代码。


    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    评论

报告相同问题?

问题事件

  • 创建了问题 4月12日

悬赏问题

  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?