Threejs入门学习

228 阅读6分钟

Threejs学习

参考郭隆邦_技术博客学习,不过这个博客使用的版本较低,如果有些api方法未定义建议百度一下新的api。

演示地址https://arthaskj.github.io/3js/01/index.html,替换01即可演示不同场景。受制于网络原因,下载源码到本地更方便。

一、生成第一个立方体演示地址

  /**
  * 创建网格模型
  */
  var box = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象
  var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象
  var mesh = new THREE.Mesh(box, material); //网格模型对象
  scene.add(mesh); //网格模型添加到场景中

image.png

二、添加多个立方体,设置透明度,显示结构线演示地址

 /**
       * 创建网格模型
       */
      var box = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象
      //球体(半径60,细分数40,40)
      // var box = new THREE.SphereGeometry(60, 60, 60);
      //圆台(顶部半径20,底部半径40,高度100,圆周细分数40)
      // var box = new THREE.CylinderGeometry(20, 40, 100, 40);
      //圆柱(顶部、底部半径均为40,高度100,圆周细分数40)
      // var box = new THREE.CylinderGeometry(40, 40, 100, 40);
​
      //矩形平面,宽度30,高度50
      // var box = new THREE.PlaneGeometry(30, 50);
​
      //正五边形
      // var box = new THREE.CircleGeometry(50, 5);
      //正40边形(圆平面)
      // var box = new THREE.CircleGeometry(50, 40);
      //四分之一扇形
      // var box = new THREE.CircleGeometry(50, 40, 0, 0.5 * Math.PI);
​
      var texture = new THREE.TextureLoader().load("./1.jpg"); //加载纹理贴图
      var material = new THREE.MeshLambertMaterial({
        //贴图通过材质添加给几何体
        map: texture, //给纹理属性map赋值
        side: THREE.DoubleSide, //两面可见
      }); //材质对象
      // var material = new THREE.MeshLambertMaterial({
      //   color: 0x00ff00,
      //   //THREE.DoubleSide设置两面均显示
      //   side: THREE.DoubleSide,
      // }); //材质对象
      var mesh = new THREE.Mesh(box, material); //网格模型对象
      scene.add(mesh); //网格模型添加到场景中
​
      //球体(半径60,细分数40,40)
      var box2 = new THREE.SphereGeometry(60, 40, 40);
​
      var material2 = new THREE.MeshLambertMaterial({
        color: new THREE.Color(0x3f7b9d),
        wireframe: true,
        side: THREE.DoubleSide,
      }); //材质对象
      var mesh2 = new THREE.Mesh(box2, material2); //网格模型对象
      mesh2.translateY(110); //沿着x轴正方向平移距离100
      scene.add(mesh2); //网格模型添加到场景中
​
      //圆台(顶部半径20,底部半径40,高度100,圆周细分数40)
      var box3 = new THREE.CylinderGeometry(20, 40, 100, 40);
​
      var material3 = new THREE.MeshLambertMaterial({
        color: 0x00ffff,
        // wireframe: true,
​
        //THREE.DoubleSide设置两面均显示
        side: THREE.DoubleSide,
      }); //材质对象
      var mesh3 = new THREE.Mesh(box3, material3); //网格模型对象
      mesh3.translateX(110); //沿着x轴正方向平移距离100
      scene.add(mesh3); //网格模型添加到场景中
​
      //圆柱(顶部、底部半径均为40,高度100,圆周细分数40)
      var box4 = new THREE.CylinderGeometry(40, 40, 100, 40);
​
      var material4 = new THREE.MeshLambertMaterial({
        color: 0xff00ff,
        // wireframe: true,
        opacity: 0.5, //透明度属性
        transparent: true, //开启透明度计算
        //THREE.DoubleSide设置两面均显示
        side: THREE.DoubleSide,
      }); //材质对象
      var mesh4 = new THREE.Mesh(box4, material4); //网格模型对象
      mesh4.translateZ(110); //沿着x轴正方向平移距离100
      scene.add(mesh4); //网格模型添加到场景中

image.png

三、拷贝克隆立方体演示地址

 /**
  * 创建网格模型
  */
var box = new THREE.BoxGeometry(10, 10, 10); //创建一个立方体几何对象
var box2 = box.clone();
​
var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象
var mesh = new THREE.Mesh(box, material); //网格模型对象
scene.add(mesh); //网格模型添加到场景中
var material2 = new THREE.MeshLambertMaterial({ color: 0xff00ff }); //材质对象
var mesh2 = new THREE.Mesh(box2, material2); //网格模型对象
mesh2.translateX(120);
scene.add(mesh2); //网格模型添加到场景中for (var x = 0; x < 10; x++) {
    //10表示立方体数量
    var mesh = new THREE.Mesh(box, material); //网格模型对象
    mesh.position.set(x * 15, 0, 0); //立方体间距15(阵列距离)
    scene.add(mesh); //网格模型添加到场景中
}

image.png

四、循环创建立方体演示地址

 /**
  * 创建网格模型
  */
var box = new THREE.BoxGeometry(10, 10, 10); //创建一个立方体几何对象
var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象
// var mesh = new THREE.Mesh(box, material); //网格模型对象var object = new THREE.Object3D(); //创建Object3D对象
for (var y = 0; y < 10; y++) {
    //10表示y方向立方体数量
    for (var x = 0; x < 10; x++) {
        for (var z = 0; z < 10; z++) {
            //10表示x方向立方体数量
            var mesh = new THREE.Mesh(box, material); //网格模型对象
            mesh.position.set(x * 15, y * 15, z * 15); //立方体间距15(阵列距离)
            object.add(mesh); //网格模型添加到场景中
        }
    }
}
object.translateY(50); //平移所有网格模型
scene.add(object); //网格模型添加到场景中

image.png

五、贴图,长方体贴图演示地址

 /**
  * 创建网格模型
  */
var box = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象
/**
 * 纹理贴图网格模型
 */
// var box = new THREE.PlaneGeometry(60, 50); //矩形平面
var texture = new THREE.TextureLoader().load("./1.jpg"); //加载纹理贴图
var material = new THREE.MeshLambertMaterial({
    //贴图通过材质添加给几何体
    map: texture, //给纹理属性map赋值
    side: THREE.DoubleSide, //两面可见
}); //材质对象
var mesh = new THREE.Mesh(box, material); //网格模型对象
mesh.translateX(300);
scene.add(mesh); //网格模型添加到场景中
​
/**
 * 立方体网格模型(药盒)
 */
// MeshFaceMaterial方法已经废弃
var box2 = new THREE.BoxGeometry(70, 255, 480); //长宽高尺寸70,255,480
//加载六个面的纹理贴图
var texture1 = new THREE.TextureLoader().load("1.jpg");
var texture2 = new THREE.TextureLoader().load("2.jpg");
var texture3 = new THREE.TextureLoader().load("3.jpg");
var texture4 = new THREE.TextureLoader().load("4.jpg");
var texture5 = new THREE.TextureLoader().load("5.jpg");
var texture6 = new THREE.TextureLoader().load("6.jpg");
var materialArr = [
    //纹理对象赋值给6个材质对象
    new THREE.MeshPhongMaterial({ map: texture1 }),
    new THREE.MeshPhongMaterial({ map: texture2 }),
    new THREE.MeshPhongMaterial({ map: texture3 }),
    new THREE.MeshPhongMaterial({ map: texture4 }),
    new THREE.MeshPhongMaterial({ map: texture5 }),
    new THREE.MeshPhongMaterial({ map: texture6 }),
];
//6个材质对象组成的数组赋值给MeshFaceMaterial构造函数
// var facematerial = new THREE.MeshFaceMaterial(materialArr);
var mesh2 = new THREE.Mesh(box2, materialArr); //
scene.add(mesh2);

六、加载模型文件演示地址

 /**
  * 加载立方体obj文件,自定义材质的对象,生成网格模型
  */
var loader = new THREE.OBJLoader(); //创建obj模型加载器对象
loader.load("1.obj", obj); //加载obj完成后执行函数stl()
//stl加载完成后等待执行的函数
function obj(object3D) {
    object3D.scale.set(100, 100, 100); //放大object3D对象
    object3D.translateY(200);
    scene.add(object3D); //网格模型添加到场景中
}
​
/**
 * 加载立方体fbx文件,自定义材质的对象,生成网格模型
 */
var loader2 = new THREE.FBXLoader(); //创建obj模型加载器对象
loader2.load("1.fbx", obj2); //加载obj完成后执行函数stl()
//stl加载完成后等待执行的函数
function obj2(object3D) {
    object3D.traverse(function (child) {
        if (child.isMesh) {
            child.castShadow = true;
            child.receiveShadow = true;
        }
    });
    scene.add(object3D); //网格模型添加到场景中
}
​
/**
 * 加载立方体glb文件,自定义材质的对象,生成网格模型
 */
var loader3 = new THREE.GLTFLoader(); //创建obj模型加载器对象
loader3.load("1.glb", obj3); //加载obj完成后执行函数stl()
//stl加载完成后等待执行的函数
function obj3(object3D) {
    object3D.scene.scale.set(700, 700, 700);
    scene.add(object3D.scene); //网格模型添加到场景中
}

image.png

七、多个结构体进行组合,封装演示地址

 /**
  * 创建场景对象
  */
var scene = new THREE.Scene();
/**
 * 阵列立方体网格模型
 */
var box = new THREE.CylinderGeometry(5, 5, 10, 40);
var box2 = new THREE.SphereGeometry(5, 20, 20);
var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象
var object = new THREE.Object3D(); //创建Object3D对象
var mesh = new THREE.Mesh(box, material); //网格模型对象
mesh.position.set(0, 0, 0); //立方体间距15(阵列距离)
object.add(mesh); //网格模型添加到Object3D对象中
var mesh2 = new THREE.Mesh(box2, material); //网格模型对象
mesh2.position.set(0, 10, 0); //立方体间距15(阵列距离)
object.add(mesh2); //网格模型添加到Object3D对象中object.translateX(-70); //平移所有网格模型
scene.add(object); //网格模型添加到场景中

image.png

八、全景贴图演示地址

let sphereGeometry = new THREE.SphereGeometry(16, 50, 50);
let texture = new THREE.TextureLoader().load("./1.jpg");
let sphereMaterial = new THREE.MeshBasicMaterial({ map: texture });
var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphereGeometry.scale(10, 10, 10);
scene.add(this.sphere);

image.png

九、源码地址

源码地址:https://github.com/Arthaskj/3js.git

下载代码后使用vscode打开,点击Go Live就可以访问http://localhost:5500/07/index.html静态网页了。

image.png