three.js入门(四):纹理Texture之平面纹理

1、测试页面:index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
    <script src="js/three.min.js"></script>
    <script src="js/stats.min.js"></script>
    <script src="js/tweenjs.min.js"></script>
    <style>
        html, body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
<canvas></canvas>
</body>
<script src="js/chapter/chapter6.1.js"></script>
</html>

2、js代码实现:chapter6.1.js

var scene, camera, renderer;

function init() {
    //init scene
    scene = new THREE.Scene();

    //init renderer
    var canvas = document.body.querySelector("canvas");
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    renderer = new THREE.WebGLRenderer({
        canvas: canvas,
        antialias: true
    });
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.setClearColor(0x000000, 1);

    //init camera
    camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(0, 0, 100);
    camera.up.set(0, 1, 0);
    camera.lookAt(0, 0, 0);

    //init light
    var light = new THREE.PointLight(0xffffff);
    light.position.set(0, 0, 100);
    scene.add(light);

    var geometry = new THREE.PlaneGeometry(60, 30);
    var texture = new THREE.TextureLoader().load("images/a.jpg");
    var material = new THREE.MeshLambertMaterial({
        map: texture,
        side: THREE.DoubleSide
    });
    var mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);
}

function animate() {
    //不是很明白为什么设置纹理需要用requestAnimationFrame
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}
init();
animate();

单个平面的纹理贴图会覆盖整个Geometry的平面,如果要做出商标那样覆盖局部区域的贴图,便满足不了需求。对于这种情况,初步设想是新增一个小的平面作为商标贴图的区域,然后使该平面与原平面紧贴。如下图:紫色区域的正方体的一个面,左上角是另一个平面贴图。

代码实现:

var box = new THREE.BoxGeometry(25, 25, 25);
    var boxMaterial = new THREE.MeshLambertMaterial({color: 0xDDA0DD});
    var boxMesh = new THREE.Mesh(box, boxMaterial);
    scene.add(boxMesh);

    var plane = new THREE.PlaneGeometry(6, 4);
    var texture = new THREE.TextureLoader().load("images/a.jpg");
    var planeMaterial = new THREE.MeshLambertMaterial({
        map: texture
    });
    var planeMesh = new THREE.Mesh(plane, planeMaterial);
    planeMesh.translateX(-9);
    planeMesh.translateY(10);
    planeMesh.translateZ(15.6);//平移纹理贴图网格模型
    scene.add(planeMesh);

实际操作的过程中发现,要想正好将贴图贴在几何体上,贴图的位置还是很难调整的,特别是当集合体的角度不好计算的时候,就更难确定坐标了。不知道当物体在运动过程中是怎么保证贴图的位置正确的...前端真的好难啊= =

转载于:https://my.oschina.net/u/4108765/blog/3059560

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值