【小沐学Web3D】three.js 加载三维模型(Angular)

06-01 1453阅读

文章目录

  • 1、简介
    • 1.1 three.js
    • 1.2 angular.js
    • 2、three.js + Angular.js
    • 结语

      1、简介

      1.1 three.js

      Three.js 是一款 webGL(3D绘图标准)引擎,可以运行于所有支持 webGL 的浏览器。Three.js 封装了 webGL 底层的 API ,为我们提供了高级的开发接口,可以使用简单的代码去实现 3D 渲染。

      【小沐学Web3D】three.js 加载三维模型(Angular)

      1.2 angular.js

      https://angular.dev/

      Angular 是一个用于构建移动和桌面 Web 应用的平台,拥有百万开发者的支持。

      AngularJS 通过新的属性和表达式扩展了 HTML。

      AngularJS 可以构建一个单一页面应用程序(SPAs:Single Page Applications)。

      AngularJS 学习起来非常简单。

      【小沐学Web3D】three.js 加载三维模型(Angular)

      
      
      
      
      
      
      

      名字 :

      Hello {{name}}

      保存为index.html文件,用浏览器打开如下:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      2、three.js + Angular.js

      确保已经安装了 Angular CLI。如果没有安装,可以使用以下命令安装:

      npm install -g @angular/cli
      

      【小沐学Web3D】three.js 加载三维模型(Angular)

      打印版本信息如下:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      然后创建一个新的 Angular 项目:

      ng new threejs-angular-app
      cd threejs-angular-app
      

      【小沐学Web3D】three.js 加载三维模型(Angular)

      angular项目创建完毕:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      生成的文件夹如下:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      创建一个新的 Angular 组件来加载和渲染三维模型:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      这会在 src/app 目录下生成一个新的组件文件夹 threejs-model。

      生成文件夹如下:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      npm install --save-dev @types/three
      

      【小沐学Web3D】three.js 加载三维模型(Angular)

      修改 threejs-model.component.ts:

      import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
      import * as THREE from 'three';
      import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
      import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
      @Component({
        selector: 'app-threejs-model',
        template: '',
        styles: [`
          .three-container {
            width: 100%;
            height: 100%;
          }
        `]
      })
      export class ThreejsModelComponent implements AfterViewInit {
        @ViewChild('threeContainer') threeContainer!: ElementRef;
        private scene!: THREE.Scene;
        private camera!: THREE.PerspectiveCamera;
        private renderer!: THREE.WebGLRenderer;
        private model!: THREE.Group;
        private controls!: OrbitControls; // 添加 OrbitControls
        
        ngAfterViewInit() {
          this.initThree();
          this.loadModel();
          this.animate();
        }
        initThree() {
          // 创建场景
          this.scene = new THREE.Scene();
          this.scene.background = new THREE.Color(0xaaaaaa);
          // 创建相机
          this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.01, 1000);
          this.camera.position.set(0, 0.15, 0.15);
          this.camera.lookAt(this.scene.position);
          // 创建渲染器
          this.renderer = new THREE.WebGLRenderer({ antialias: true });
          this.renderer.setSize(window.innerWidth, window.innerHeight);
          this.threeContainer.nativeElement.appendChild(this.renderer.domElement);
      	// 添加环境光
      	const ambientLight = new THREE.AmbientLight(0xf0f0f0, 0.9);
      	this.scene.add(ambientLight);
      	// 初始化 OrbitControls
          this.controls = new OrbitControls(this.camera, this.renderer.domElement);
          this.controls.enableDamping = true; // 添加阻尼效果
          this.controls.dampingFactor = 0.05; // 阻尼系数
          // 处理窗口大小变化
          window.addEventListener('resize', () => {
            this.camera.aspect = window.innerWidth / window.innerHeight;
            this.camera.updateProjectionMatrix();
            this.renderer.setSize(window.innerWidth, window.innerHeight);
          });
        }
        loadModel() {
          // 初始化 GLTF 加载器
          const loader = new GLTFLoader();
          // 加载 GLTF 模型
          loader.load(
            './assets/models/Avocado2.glb', // 模型路径
            (gltf) => {
              this.model = gltf.scene;
              this.scene.add(this.model);
              console.log('模型加载成功', gltf);
            },
            (xhr) => {
              console.log(`模型加载进度:${(xhr.loaded / xhr.total) * 100}%`);
            },
            (error) => {
              console.error('模型加载失败', error);
            }
          );
        }
        animate() {
          requestAnimationFrame(() => this.animate());
          // 模型动画(例如旋转)
          if (this.model) {
            this.model.rotation.y += 0.01;
          }
          this.renderer.render(this.scene, this.camera);
        }
      }
      

      将你的 3D 模型文件(如 .glb 或 .gltf)放置在 public/assets/models 文件夹中。如果没有这个文件夹,可以手动创建:

      public/assets/models/Avocado2.glb

      【小沐学Web3D】three.js 加载三维模型(Angular)

      在 app.routes.ts 中添加路由配置:

      import { Routes } from '@angular/router';
      import { ThreejsModelComponent } from './threejs-model/threejs-model.component';
      export const appRoutes: Routes = [
        { path: '', component: ThreejsModelComponent },
      ];
      

      【小沐学Web3D】three.js 加载三维模型(Angular)

      修改 app.config.ts:

      import { ApplicationConfig } from '@angular/core';
      import { provideRouter } from '@angular/router';
      import { appRoutes } from './app.routes';
      export const appConfig: ApplicationConfig = {
        providers: [provideRouter(appRoutes)]
      };
      

      修改app.component.ts:

      import { Component } from '@angular/core';
      import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
      import { ThreejsModelComponent } from './threejs-model/threejs-model.component';
      @Component({
        selector: 'app-root',
        standalone: true,
        imports: [ThreejsModelComponent],
        schemas: [CUSTOM_ELEMENTS_SCHEMA],
        templateUrl: './app.component.html',
        styleUrl: './app.component.css',
      })
      export class AppComponent {
        title = 'threejs-angular-app';
      }
      

      修改app.component.html:

      
      
      
      
      
      
      
      
        
      
      
        
      
      
      
      
      
      
      
      
      
      

      修改tsconfig.json:

      /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
      /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
      {
        "compileOnSave": false,
        "compilerOptions": {
          "outDir": "./dist/out-tsc",
          "strict": true,
          "noImplicitOverride": true,
          "noPropertyAccessFromIndexSignature": true,
          "noImplicitReturns": true,
          "noFallthroughCasesInSwitch": true,
          "skipLibCheck": true,
          "isolatedModules": true,
          "esModuleInterop": true,
          "experimentalDecorators": true,
          "moduleResolution": "bundler",
          "importHelpers": true,
          "target": "ES2022",
          "module": "ES2022",
      	"typeRoots": ["node_modules/@types"]
        },
        "angularCompilerOptions": {
          "enableI18nLegacyMessageIdFormat": false,
          "strictInjectionParameters": true,
          "strictInputAccessModifiers": true,
          "strictTemplates": true
        }
      }
      

      执行项目:

      ng serve
      

      【小沐学Web3D】three.js 加载三维模型(Angular)

      浏览器运行如下:

      【小沐学Web3D】three.js 加载三维模型(Angular)

      【小沐学Web3D】three.js 加载三维模型(Angular)

      结语

      如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭

      如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???

      如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)

      感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码