javascript 从计算机 onclick 在地板上添加纹理

标签 javascript input three.js textures

我正在尝试使用 <input type="file" onchange=function()> 在我的地板上放置纹理但我总是只看到黑色纹理。不知道如何将计算机上的 .jpg 文件作为纹理放在地板上。有什么帮助吗?

这是我的代码

javascript:

  function preview_image(event) {
    var reader = new FileReader();
    reader.onload = function() {
      var floorTexture = THREE.ImageUtils.loadTexture(reader);
      floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping;
      floorTexture.repeat.set(10, 10);
      var floorMaterial = new THREE.MeshBasicMaterial({
        map: floorTexture,
        side: THREE.DoubleSide
      });
      var floorGeometry = new THREE.PlaneGeometry(100, 100, 10, 10);
      var floor = new THREE.Mesh(floorGeometry, floorMaterial);
      floor.position.set(0, 0, 0);
      floor.rotation.set(0, 0, 0);
      scene.add(floor);

      var output = floorTexture;
      output.src = reader.result;
    }
    reader.readAsDataURL(event.target.files[0]);
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/91/three.min.js"></script>
<input type="file" accept="image/jpeg, image/png" onchange="preview_image(event)" /> <img id="output_image" />

最佳答案

这里发生了一些事情。 THREE.ImageUtils.loadTexture 已被弃用。我使用 THREE.TextureLoader() 代替。我还添加了相机,并设置了 z 位置。要加载的纹理信息是 reader.result,而不仅仅是 reader。这是一个工作片段:

var scene = new THREE.Scene();

var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, .1, 50);
camera.position.z = 30;

var renderer = new THREE.WebGLRenderer();

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

function preview_image(event) {
    var reader = new FileReader();
    reader.onload = function() {
        // instantiate a loader
        var loader = new THREE.TextureLoader();
        // load a resource
        loader.load(
            // resource URL
            reader.result,
            // onLoad callback
            function(floorTexture) {
                floorTexture.needsUpdate = true;
                var floorMaterial = new THREE.MeshBasicMaterial({ map: floorTexture, side: THREE.DoubleSide });
                var floorGeometry = new THREE.PlaneGeometry(10, 10, 10);
                var floor = new THREE.Mesh(floorGeometry, floorMaterial);
                scene.add(floor);
                renderer.render(scene, camera);
            },
            // onProgress callback currently not supported
            undefined,
            // onError callback
            function(err) {
                console.error('An error happened.');
            }
        );
    }
    reader.readAsDataURL(event.target.files[0]);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/91/three.min.js"></script>
    <input type="file" accept="image/jpeg, image/png" onchange="javascrpit:preview_image(event)" /> <img id="output_image" />

关于javascript 从计算机 onclick 在地板上添加纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49437061/

相关文章:

three.js - 基于相机位置和纹理坐标的三点闪烁,但仅限于 Nvidia 卡

javascript - $ ('#<form name> input[name=<field>]' ).val() 返回未定义?

javascript - 在这种情况下无法访问特定变量

javascript - 插入不会以 php 和 mysql 形式发生

angularjs - Angular 在输入中显示 NaN 值

three.js - WebGLRenderingContext 加载纹理贴图时出错

javascript - Chrome 中 Canvas 图像上的 Three.js 安全错误

javascript - 弹出窗口在关闭时将数据返回给父级

java - 在 Java 中读取文本文件时进行跟踪

javascript - JS 正则表达式验证帮助