three调研- - obj文件导入

vue+three

<template>
  <div id="container">
  </div>
</template>
<script>
  import * as THREE from "three";
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
  import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
  //import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';
  //import { TGALoader } from 'three/examples/jsm/loaders/TGALoader.js';
  export default { 
    name: "HelloWorld",
    data() {
      return {
        scene: '',//环境
        light: '',//灯光
        camera: '',//相机
        controls: '',//控制器
        renderer: '',//渲染
      }
    },
    methods: {
		init() {
			//创建场景
			this.scene = new THREE.Scene();
			// 创建相机
			this.camera =  new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 1, 1000);
			this.camera.position.set(0,0,80);
			// 环境光
			this.scene.add(new THREE.AmbientLight(4210752, 3));
// 		this.scene.fog = new THREE.Fog(0xffffff, 0.015, 1000);//雾
			this.scene.background = new THREE.CubeTextureLoader()
      .setPath('static/cube/room-1/').load( ['px.jpg','nx.jpg','py.jpg','ny.jpg','pz.jpg','nz.jpg']);

// 		console.log(this.scene.background)

			// 平行光
			// var light = new THREE.DirectionalLight(0xffffff, 1);
			// light.position.set(30, 30, 30);
			// this.scene.add(light);
			
			// var helper = new THREE.CameraHelper(light.shadow.camera);
			// this.scene.add(helper); 

			this.scene.add(new THREE.AmbientLight(0x0c0c0c));
      let spotLight1 = new THREE.SpotLight(0xffffff);
      spotLight1.position.set(-400, -400, -400);

      let spotLight2 = new THREE.SpotLight(0xffffff);
      spotLight2.position.set(400, 400, 400);

      this.scene.add(spotLight1);
      this.scene.add(spotLight2);
			
			
			// 坐标系
			/* var axes = new THREE.AxesHelper(30);
			this.scene.add(axes); */
			
			//加载模型数据
      this.loadObj()

			//渲染
      this.renderer = new THREE.WebGLRenderer({
				antialias: true,    // 平滑效果
        alpha: true,    // canvas背景透明
			});
			this.renderer.setClearColor(0xFFFFFF);//背景
			
			this.renderer.setPixelRatio(window.devicePixelRatio);//为了兼容高清屏幕
			this.renderer.setSize(window.innerWidth, window.innerHeight);    
			//初始化控制器
			this.controls = new OrbitControls(this.camera,this.renderer.domElement);
			this.controls.target.set(0, 0,0);
			this.controls.update();
			
			this.animate();

      const container = document.getElementById('container');
      container.appendChild(this.renderer.domElement);   
      window.addEventListener('resize', this.onWindowResize, false);//添加窗口监听事件(resize-onresize即窗口或框架被重新调整大小)
		},
        //窗口监听函数
		onWindowResize() {
			this.camera.aspect = window.innerWidth / window.innerHeight;
      this.camera.updateProjectionMatrix();
			this.renderer.setSize(window.innerWidth, window.innerHeight);
        },
        animate() {
          requestAnimationFrame(this.animate);
          this.render();
        },
        render() {
			this.controls.update();
			this.renderer.render(this.scene, this.camera);
        },
        //外部模型加载函数
		loadObj() {
			var that = this
			
			var manager = new THREE.LoadingManager();
			manager.onProgress = function(item, loaded, total){
        window.console.log(item, loaded, total);
			};
			
			var onProgress = function(xhr){
        if(xhr.lengthComputable){
          var percentComplete = xhr.loaded / xhr.total * 100;
          window.console.log(Math.round(percentComplete, 2) + '% downloaded');
        }
			};
			
			var onError = function(xhr){
        window.console.error(xhr);
			};
      
      
// 		   var tga_loader = new TGALoader(manager);
// 			tga_loader.setPath('static/models/mooncake/');
// 			var map = tga_loader.load('Sofa_OS_0727_01___Default_Diffuse.tga')
// 			console.log(map)
// 			var material = new THREE.MeshPhongMaterial({  //MeshStandardMaterial
// 			    map:map ,
// // 			    normalMap: tga_loader.load('Sofa_OS_0727_01___Default_Normal.tga'),
// // 			    specularMap: tga_loader.load('贴图__3_法线凹凸.tga'),
// // 			    bumpMap: tga_loader.load('Sofa_OS_0727_01___Default_Bump.tga')
// 			});  
			var tga_loader = new THREE.TextureLoader(manager);
			tga_loader.setPath('static/models/mooncake/');
			var material = new THREE.MeshPhongMaterial({  //MeshStandardMaterial
      map: tga_loader.load('mooncake.png'),
// 			    normalMap: tga_loader.load('xian.jpg'),
// 			    specularMap: tga_loader.load('xian.jpg'),//高光贴图(Specular Map)
// 			    bumpMap: tga_loader.load('xian.jpg')//凹凸贴图(Bump Map)
			}); 
// 			console.log(material)
// 			material.map.repeat.set( 10, 10)
			var obj_loader = new OBJLoader(manager);
			obj_loader.setPath('static/models/mooncake/');
			obj_loader.load('mooncake.obj', function(object){
        var geometry = object.children[0].geometry;
        geometry.attributes.uv2 = geometry.attributes.uv;
        geometry.center();
        material.side = THREE.DoubleSide;
        var mesh = new THREE.Mesh(geometry, material);
        mesh.scale.multiplyScalar(0.2);
        that.scene.add(mesh);
        }, onProgress, onError); 
        }
    },
    mounted() {
      this.init();
    }
  }
</script>

<style scoped>
#container{
  width: 1200px;
  margin: 0 auto;
  height: 800px;
  overflow: hidden;
}
</style>

自己旋转的动画

关键代码是:

if(this.mesh){

          this.mesh.rotation.y+=0.01;

        }

这个写在render里面,让他自己转

<template>
  <div id="container">
  </div>
</template>
<script>
  import * as THREE from "three";
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
  import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
  //import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';
  //import { TGALoader } from 'three/examples/jsm/loaders/TGALoader.js';
  export default { 
    name: "HelloWorld",
    data() {
      return {
        scene: '',//环境
        light: '',//灯光
        camera: '',//相机
        controls: '',//控制器
        renderer: '',//渲染
        mesh:'',
      }
    },
    methods: {
		init() {
			//创建场景
			this.scene = new THREE.Scene();
			// 创建相机
			this.camera =  new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 1, 1000);
			this.camera.position.set(0,0,80);
			// 环境光
			this.scene.add(new THREE.AmbientLight(4210752, 3));
// 		this.scene.fog = new THREE.Fog(0xffffff, 0.015, 1000);//雾
			this.scene.background = new THREE.CubeTextureLoader()
      .setPath('static/cube/room-1/').load( ['px.jpg','nx.jpg','py.jpg','ny.jpg','pz.jpg','nz.jpg']);

// 		console.log(this.scene.background)

			// 平行光
			// var light = new THREE.DirectionalLight(0xffffff, 1);
			// light.position.set(30, 30, 30);
			// this.scene.add(light);
			
			// var helper = new THREE.CameraHelper(light.shadow.camera);
			// this.scene.add(helper); 

			this.scene.add(new THREE.AmbientLight(0x0c0c0c));
      let spotLight1 = new THREE.SpotLight(0xffffff);
      spotLight1.position.set(-400, -400, -400);

      let spotLight2 = new THREE.SpotLight(0xffffff);
      spotLight2.position.set(400, 400, 400);

      this.scene.add(spotLight1);
      this.scene.add(spotLight2);
			
			
			// 坐标系
			/* var axes = new THREE.AxesHelper(30);
			this.scene.add(axes); */
			
			//加载模型数据
      this.loadObj()

			//渲染
      this.renderer = new THREE.WebGLRenderer({
				antialias: true,    // 平滑效果
        alpha: true,    // canvas背景透明
			});
			this.renderer.setClearColor(0xFFFFFF);//背景
			
			this.renderer.setPixelRatio(window.devicePixelRatio);//为了兼容高清屏幕
			this.renderer.setSize(window.innerWidth, window.innerHeight);    
			//初始化控制器
			this.controls = new OrbitControls(this.camera,this.renderer.domElement);
			this.controls.target.set(0, 0,0);
			this.controls.update();
			
			this.animate();

      const container = document.getElementById('container');
      container.appendChild(this.renderer.domElement);   
      window.addEventListener('resize', this.onWindowResize, false);//添加窗口监听事件(resize-onresize即窗口或框架被重新调整大小)
		},
        //窗口监听函数
		onWindowResize() {
			this.camera.aspect = window.innerWidth / window.innerHeight;
      this.camera.updateProjectionMatrix();
			this.renderer.setSize(window.innerWidth, window.innerHeight);
        },
        animate() {
          requestAnimationFrame(this.animate);
          this.render();
        },
        render() {
        if(this.mesh){
          this.mesh.rotation.y+=0.01;
        }
			this.controls.update();
			this.renderer.render(this.scene, this.camera);
        },
        //外部模型加载函数
		loadObj() {
			var that = this
			
			var manager = new THREE.LoadingManager();
			manager.onProgress = function(item, loaded, total){
        window.console.log(item, loaded, total);
			};
			
			var onProgress = function(xhr){
        if(xhr.lengthComputable){
          var percentComplete = xhr.loaded / xhr.total * 100;
          window.console.log(Math.round(percentComplete, 2) + '% downloaded');
        }
			};
			
			var onError = function(xhr){
        window.console.error(xhr);
			};
      
      
// 		   var tga_loader = new TGALoader(manager);
// 			tga_loader.setPath('static/models/mooncake/');
// 			var map = tga_loader.load('Sofa_OS_0727_01___Default_Diffuse.tga')
// 			console.log(map)
// 			var material = new THREE.MeshPhongMaterial({  //MeshStandardMaterial
// 			    map:map ,
// // 			    normalMap: tga_loader.load('Sofa_OS_0727_01___Default_Normal.tga'),
// // 			    specularMap: tga_loader.load('贴图__3_法线凹凸.tga'),
// // 			    bumpMap: tga_loader.load('Sofa_OS_0727_01___Default_Bump.tga')
// 			});  
			var tga_loader = new THREE.TextureLoader(manager);
			tga_loader.setPath('static/models/mooncake/');
			var material = new THREE.MeshPhongMaterial({  //MeshStandardMaterial
      map: tga_loader.load('mooncake.png'),
// 			    normalMap: tga_loader.load('xian.jpg'),
// 			    specularMap: tga_loader.load('xian.jpg'),//高光贴图(Specular Map)
// 			    bumpMap: tga_loader.load('xian.jpg')//凹凸贴图(Bump Map)
			}); 
// 			console.log(material)
// 			material.map.repeat.set( 10, 10)
			var obj_loader = new OBJLoader(manager);
			obj_loader.setPath('static/models/mooncake/');
			obj_loader.load('mooncake.obj', function(object){
        var geometry = object.children[0].geometry;
        geometry.attributes.uv2 = geometry.attributes.uv;
        geometry.center();
        material.side = THREE.DoubleSide;
        var mesh = new THREE.Mesh(geometry, material);
        window.console.log(mesh)
        mesh.scale.multiplyScalar(0.2);
        that.mesh = mesh;
        that.scene.add(mesh);
        }, onProgress, onError); 
        }
    },
    mounted() {
      this.init();
    }
  }
</script>

<style scoped>
#container{
  width: 1200px;
  margin: 0 auto;
  height: 800px;
  overflow: hidden;
}
</style>

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值