Threejs学习笔记 二

简介: 在我第一集的笔记中,我们实现了在react中创建简单三维模型,接下来,我们在此基础上学习材质贴图,并实现一个简单的vr看房。

在上一章节中,我们实现了一个简单的三维场景,在此基础上,我们进行一些小小的改造。
我们了解一个网格模型由几何体和材质模型组成,我们可以对材质进行贴图处理,用我们想要的图片作为几何体材质覆盖到几何体中。
下面是一个简单示例

import React, { Component } from 'react'
import Earth from './Earth.png'
import * as THREE from 'three';
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'

export default class index extends Component {
componentDidMount(){
  /**
   * 
   * 创建场景对象Scene
   */
   const scene = new THREE.Scene();
   /**
    * 创建网格模型
    */
   
    const geometry = new THREE.SphereGeometry(60, 100, 100); //球体
   // TextureLoader创建一个纹理加载器对象,可以加载图片作为几何体纹理
   const textureLoader = new THREE.TextureLoader();
   // 执行load方法,加载纹理贴图成功后,返回一个纹理对象Texture
  const texture=  textureLoader.load(Earth)
   const material = new THREE.MeshLambertMaterial({
    // color: 0x0000ff,
    // 设置纹理贴图:Texture对象作为材质map属性的属性值
    map: texture,  
   // wireframe:true//线框渲染方式
  }); //材质对象Material 
   const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
   scene.add(mesh); //网格模型添加到场景中
   //纹理贴图加载成功后,调用渲染函数执行渲染操作
  
   /**
    * 光源设置
    */
   //点光源
   const point = new THREE.PointLight(0xffffff);
   point.position.set(400, 200, 300); //点光源位置
   scene.add(point); //点光源添加到场景中
   //环境光
   const ambient = new THREE.AmbientLight(0x444444);
   scene.add(ambient);
   /**
    * 相机设置
    */
   const width = window.innerWidth; //窗口宽度
   const height = window.innerHeight; //窗口高度
   const k = width / height; //窗口宽高比
   const s = 150; //三维场景显示范围控制系数,系数越大,显示的范围越大
   //创建相机对象
   const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);
   camera.position.set(200, 300, 200); //设置相机位置
   camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
   /**
    * 创建渲染器对象
    */
   const renderer = new THREE.WebGLRenderer();
   renderer.setSize(width, height); //设置渲染区域尺寸
   renderer.setClearColor(0x000000, 1); //设置背景颜色
   document.getElementById("Earth").appendChild(renderer.domElement); //body元素中插入canvas对象
 
   // 渲染函数
   function render() {
     renderer.render(scene, camera); //执行渲染操作
      mesh.rotation.y+=0.01;//转动方向
      
     requestAnimationFrame(render);//请求再次执行渲染函数render,渲染下一帧
   }
   render();
   //创建控件对象  相机对象camera作为参数   控件可以监听鼠标的变化,改变相机对象的属性
  const controls = new OrbitControls(camera,renderer.domElement);
  //controls.addEventListener('change',render);
}
render() {
  return (
    <div>
      <div id="Earth"/>
    </div>
  )
}
}
这个代码中的重点代码是下面这段
 // TextureLoader创建一个纹理加载器对象,可以加载图片作为几何体纹理
   const textureLoader = new THREE.TextureLoader();
   // 执行load方法,加载纹理贴图成功后,返回一个纹理对象Texture
  const texture=  textureLoader.load(Earth)
   const material = new THREE.MeshLambertMaterial({
    // color: 0x0000ff,
    // 设置纹理贴图:Texture对象作为材质map属性的属性值
    map: texture,  
   // wireframe:true//线框渲染方式
  }); //材质对象Material 
   const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
   scene.add(mesh); //网格模型添加到场景中  

效果如下
image-20210802114310379.png
第二个例子,这次我们以正方体为例,正方体六个面。
按照上面的方法,我们会发现,正方体六个面都会被同一张图片覆盖,此时,我们可以进行材质数组的创建,为正方体的六个面分别创建不同的材质数组
我们将上述的代码进行一些小小的改动

//声明一个正方体
const geometry = new THREE.BoxGeometry(100,100,100);
//声明材质数组
const material_1 = new THREE.MeshPhongMaterial({
    color:0xffff3f
});
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(Earth);
const material_2 = new THREE.MeshLambertMaterial({
    map:texture
 });

const materialArr = [material_1, material_1, material_1, material_1, material_2, material_1];
 const mesh = new THREE.Mesh(geometry,materialArr);
 console.log("数组详情",geometry.groups)
 scene.add(mesh);

效果如下
image-20210802155704048.png

经过上面的铺垫,我们开始实现一个简单的vr看房,实现思路如下,
1.以正方形为例
我们选取一个室内的前后左右,上下的六张图片分别赋值给材质数组,大家可以自行搜索贴图资源,具体效果如下
image-20210802161627227.png
但此时我们只是成功了一半,我们要实现想要的效果还差一点,首先,图片向内翻转180度,然后将摄像机的位置放在内部的中心点中。
只需要一个小小的改动,将网格模型的gemoetry对象进行缩放,当为负数的时候,就会进行翻转,然后设置相机坐标就大功告成了

mesh.geometry.scale(1, 1, -1);

圆形的几何体也可以,而且只需要加载一张图片,不过需要特殊的全景图片,这里给出一个效果图片
D6808EB2-3151-41AA-8863-2EDB60D43A75.png

相关文章
|
2月前
Threejs制作窗户透亮效果
这篇文章讲解了如何在Three.js中制作窗户的透亮效果,包括设置透明材质和光照以实现逼真的窗户渲染效果的技术细节。
67 1
|
2月前
ThreeJs场景中添加视频
这篇文章详细说明了如何在Three.js场景中添加并播放视频,包括视频纹理的创建与应用,以及如何将视频流显示在3D模型的表面上。
43 2
ThreeJs场景中添加视频
|
2月前
Threejs使用CubeCamera实现环境映射
这篇文章详细介绍了如何在Three.js中使用CubeCamera来实现环境映射,包括创建CubeCamera、设置反射材质以及实时更新渲染结果的具体步骤。
68 3
|
2月前
|
移动开发 JavaScript 前端开发
ThreeJs简介
这篇文章介绍了Three.js的基础知识,包括其相对于WebGL的优势以及如何使用Three.js创建基本的3D场景。
49 1
|
2月前
|
Web App开发 数据可视化 前端开发
Pixi入门第一章:绘制一个小精灵
这篇文章是关于Pixi.js的入门教程第一部分,指导读者如何创建并显示一个基本的2D精灵,适用于开始学习Pixi.js进行2D图形开发的初学者。
72 0
Pixi入门第一章:绘制一个小精灵
|
2月前
Threejs制作海面效果
这篇文章详细介绍了利用Three.js制作逼真海面效果的过程,包括设置Water材质、调整光照及实现波动动画的步骤。
41 0
Threejs制作海面效果
|
2月前
|
JavaScript API 图形学
ThreeJS入门-创建一个正方体
这篇文章介绍了如何使用Three.js创建一个基本的正方体模型,并提供了实现这一功能的详细步骤和代码示例。
44 0
ThreeJS入门-创建一个正方体
|
4月前
|
API
【threejs教程】threejs中的边边角角:几何体详解
【8月更文挑战第6天】threejs中的几何体详解
117 4
【threejs教程】threejs中的边边角角:几何体详解
|
4月前
|
编解码 JavaScript 前端开发
ThreeJs 基础学习
ThreeJs 基础学习
57 0
|
7月前
|
JavaScript 开发工具 git
Three.js第1篇,Three.js新手教学,如何在项目中使用Three.js(three.js使用流程详细,three.js的使用方式,three.js创建3d物体)
Three.js封装了WebGL的底层细节,是一款运行在浏览器中的 3D 引擎,可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象,目前在Git上已经拥有90k+的star。
170 0
Three.js第1篇,Three.js新手教学,如何在项目中使用Three.js(three.js使用流程详细,three.js的使用方式,three.js创建3d物体)