Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在波阵面obj(three.js)中加载画布纹理_Javascript_Three.js_Blender 2.49 - Fatal编程技术网

Javascript 如何在波阵面obj(three.js)中加载画布纹理

Javascript 如何在波阵面obj(three.js)中加载画布纹理,javascript,three.js,blender-2.49,Javascript,Three.js,Blender 2.49,谢谢你的关注。我想使用three.js显示从Blender导出的obj文件,并从画布映射纹理。我试着在obj中发布图像,结果成功了。但当我把画布纹理放在obj上时,模型会变成黑色。我还尝试通过toDataURL将画布转换为图片,然后将其映射,但仍然不起作用。任何帮助都将不胜感激 function convertCanvasToImage(ele) { var image = new Image(); image.src = ele.toDataURL("image/png"

谢谢你的关注。我想使用three.js显示从Blender导出的obj文件,并从画布映射纹理。我试着在obj中发布图像,结果成功了。但当我把画布纹理放在obj上时,模型会变成黑色。我还尝试通过toDataURL将画布转换为图片,然后将其映射,但仍然不起作用。任何帮助都将不胜感激

  function convertCanvasToImage(ele) {

    var image = new Image();
    image.src = ele.toDataURL("image/png");
    return image;
  }

  function changeCanvas() {

    canvas = document.getElementById('canvas_id'),
    ctx = canvas.getContext('2d');
    ctx.font = '20pt Arial';
    ctx.fillStyle = 'red';
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    ctx.fillStyle = 'white';
    ctx.fillRect(10, 10, canvas.width - 20, canvas.height - 20);
    ctx.fillStyle = 'black';
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(new Date().getTime(), canvas.width / 2, canvas.height / 2);
    image_t = convertCanvasToImage(canvas);
    return image_t;
}

    function init() {

        container = document.createElement('div');
        document.body.appendChild(container);

        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
        camera.position.z = 250;

        // scene
        scene = new THREE.Scene();
        scene.background = new THREE.Color( 'red' );

        var ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);
        scene.add(ambientLight);

        var pointLight = new THREE.PointLight(0xffffff, 0.8);
        camera.add(pointLight);
        scene.add(camera);

        // manager

        function loadModel() {

            object.traverse(function (child) {

                if (child.isMesh) child.material.map = texture;

            });

            object.position.y = -95;
            scene.add(object);

        }

        var manager = new THREE.LoadingManager(loadModel);

        manager.onProgress = function (item, loaded, total) {

            console.log(item, loaded, total);

        };

        // texture
    // texture = new THREE.Texture(canvas); //it's my initial try,but it didn't work

    var textureLoader = new THREE.TextureLoader();
    texture = textureLoader.load("three.js-master/examples/models/obj/clothes/426_con.png");//this works!!!
    // img = changeCanvas()
    texture = textureLoader.load(image_t);//but this doesn't work!!!


        // model
        function onProgress(xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log('model ' + Math.round(percentComplete, 2) + '% downloaded');
            }
        }

    function onError() {
    }

    var loader = new THREE.OBJLoader(manager);

    loader.load('three.js-master/examples/models/obj/clothes/426_con.obj', function (obj) {

        object = obj;
    }, onProgress, onError);

    renderer = new THREE.WebGLRenderer();
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    function animate() {
        requestAnimationFrame(animate);
        camera.lookAt(scene.position);
        changeCanvas();
        texture.needsUpdate = true;
        renderer.render(scene, camera);
    }

我想知道,如果three.js有直接在obj文件上对画布进行纹理处理的方法,那么需要进行任何翻译吗?

texture=new three.CanvaTexture(yourCanvas)?

应该说明的是,我不精通js,我真的很粗心。多亏了gman和manthrax,你帮了我大忙,你的回答让我冷静下来,分析问题。虽然我能找到的所有三个.js Canvas纹理示例都是gemotry的纹理贴图,但对于obj也是可能的。事实证明,画布生成的纹理与图像的纹理没有什么不同

<script>
    var container;
    var camera, scene, renderer,texture,canvas;
    var object;

  function changeCanvas() {
    canvas = document.getElementById('canvas_id');
    ctx = canvas.getContext('2d');
    img = new Image();
    img.onload = function(){ctx.drawImage(img, 0, 0)};
    img.src = "../assets/UV.png";//img address
  }

    function init() {

        container = document.createElement('div');
        document.body.appendChild(container);

        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
        camera.position.z = 250;

        // scene
        scene = new THREE.Scene();
        scene.background = new THREE.Color( 'black' );

        var ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);
        scene.add(ambientLight);

        var pointLight = new THREE.PointLight(0xffffff, 0.8);
        camera.add(pointLight);
        scene.add(camera);

        // manager

        function loadModel() {
            object.traverse(function (child) {
                if (child.isMesh) child.material.map = texture;
            });
            object.position.y = -95;
            scene.add(object);
        }

        var manager = new THREE.LoadingManager(loadModel);
        manager.onProgress = function (item, loaded, total) {
            console.log(item, loaded, total);
        };

        //texture
    changeCanvas();
    texture = new THREE.CanvasTexture(canvas);

        // model
        function onProgress(xhr) {
            if (xhr.lengthComputable) {
                var percentComplete = xhr.loaded / xhr.total * 100;
                console.log('model ' + Math.round(percentComplete, 2) + '% downloaded');
            }
        }

    function onError() {}

    var loader = new THREE.OBJLoader(manager);

    loader.load('../assets/426.obj', function (obj) {
        object = obj;
    }, onProgress, onError);

    renderer = new THREE.WebGLRenderer();
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

  var controls = new THREE.OrbitControls( camera, renderer.domElement );
}

    function animate() {
      // changeCanvas();
      texture.needsUpdate = true;
      camera.lookAt(scene.position);
      renderer.render(scene, camera);
    requestAnimationFrame(animate);
    }

  init();
    animate();

</script>

var容器;
摄像机、场景、渲染器、纹理、画布;
var对象;
函数changeCanvas(){
canvas=document.getElementById('canvas_id');
ctx=canvas.getContext('2d');
img=新图像();
img.onload=function(){ctx.drawImage(img,0,0)};
img.src=“../assets/UV.png”;//img地址
}
函数init(){
container=document.createElement('div');
文件.正文.附件(容器);
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,12000);
摄像机位置z=250;
//场面
场景=新的三个。场景();
scene.background=新的三种颜色(“黑色”);
var环境光=新的三个环境光(0xCCCC,0.4);
场景。添加(环境光);
var pointLight=新的三点光源(0xffffff,0.8);
添加(点光源);
场景。添加(摄影机);
//经理
函数loadModel(){
遍历(函数(子对象){
如果(child.isMesh)child.material.map=纹理;
});
object.position.y=-95;
场景。添加(对象);
}
var manager=新的三个加载管理器(加载模型);
manager.onProgress=功能(项目、已加载、总计){
控制台日志(项目、已加载、总计);
};
//质地
changeCanvas();
纹理=新的三个。CanvasTexture(canvas);
//模型
函数onProgress(xhr){
if(xhr.长度可计算){
var percentComplete=xhr.loaded/xhr.total*100;
console.log('model'+Math.round(完成百分比,2)+'%download');
}
}
函数onError(){}
var装入器=新的三个。对象装入器(管理器);
loader.load('../assets/426.obj',函数(obj){
对象=obj;
},onProgress,onError);
renderer=new THREE.WebGLRenderer();
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
container.appendChild(renderer.domeElement);
var controls=新的三个.OrbitControls(camera、renderer.doElement);
}
函数animate(){
//changeCanvas();
texture.needsUpdate=true;
摄像机。注视(场景。位置);
渲染器。渲染(场景、摄影机);
请求动画帧(动画);
}
init();
制作动画();

//纹理=新的三个纹理(画布)//这是我第一次尝试,但没有成功。你可能会觉得很有帮助。你很有帮助。谢谢。