Three——二、加强对三维空间的认识

Three——二、加强对三维空间的认识

接上个例子我们接着往下看

辅助观察坐标系

THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小,你可以根据需要改变尺寸。
使用方法:

// AxesHelper:辅助观察的坐标系
const axesHelper = new THREE.AxesHelper(150);
scene.add(axesHelper);

效果如下:
请添加图片描述

材质半透明设置

设置材质半透明,这样可以看到坐标系的坐标原点。

    const material = new THREE.MeshBasicMaterial({
      color: 0x51efe4,
      transparent: true, //开启透明
      opacity: 0.5, //设置透明度
    });

请添加图片描述

坐标轴

three.js坐标轴颜色红R、绿G、蓝B分别对应坐标系的x、y、z轴,对于three.js的3D坐标系默认y轴朝上。
请添加图片描述

设置模型在坐标系中的位置和尺寸

// 设置几何体长宽高,也就是x、y、z三个方向的尺寸
//对比三个参数分别对应xyz轴哪个方向
// 长100,宽60,高20
new THREE.BoxGeometry(100, 60, 20);
// 以中心为原点向x轴坐标偏移100
mesh.position.set(100,0,0);

请添加图片描述

改变相机参数——预览新的渲染效果

你可以尝试源码中改变相机的参数,看看场景中的物体渲染效果怎么变化。

相机放在x轴负半轴,目标观察点是坐标原点,这样相当于相机的视线是沿着x轴正方向,只能看到长方体的一个矩形平面。

camera.position.set(-1000, 0, 0);
camera.lookAt(0, 0, 0);

请添加图片描述

// 相机视线沿着x轴负半轴,mesh位于相机后面,自然看不到
camera.position.set(-1000, 0, 0);
camera.lookAt(-2000, 0, 0);

相机far偏小,mesh位于far之外,物体不会显示在画布上。

// const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
// 你可以进行下面测试,改变相机参数,把mesh放在视锥体之外,看看是否显示
// 3000改为300,使mesh位于far之外,mesh不在视锥体内,被剪裁掉
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 300);

这里模型并不会出现在画布中

请添加图片描述

光源对物体表面影响

实际生活中物体表面的明暗效果是会受到光照的影响,threejs中同样也要模拟光照Light对网格模型Mesh表面的影响。

受光照影响材质

threejs提供的网格材质,有的受光照影响,有的不受光照影响。
请添加图片描述

基础网格材质MeshBasicMaterial不会受到光照影响。这个就是之前模型展示的材质

//MeshBasicMaterial不受光照影响
const material = new THREE.MeshBasicMaterial(); 

请添加图片描述

漫反射网格材质MeshLambertMaterial会受到光照影响,该材质也可以称为Lambert网格材质,音译为兰伯特网格材质。这种材质就是可以通过灯光去显示物体明暗的样子
一个立方体长方体使用MeshLambertMaterial材质,不同面和光线夹角不同,立方体不同面就会呈现出来不同的明暗效果。

//MeshLambertMaterial受光照影响
const material = new THREE.MeshLambertMaterial(); 

请添加图片描述

光源简介

Three.js中给出了多种模拟生活中光源的API,在文档中查找light就可以看到
请添加图片描述

这三种光源看图片大家应该就可以理解,这里主要解释一下环境光后面还会说到
环境光主要就是把周围的场景的光打在模型上,比如阴,晴,日,夜,黄昏,黎明等,烘托主体,突出主体,在不使主体淹没在背景中,还具备营造环境气氛的作用

点光源PointLight可以类比为一个发光点,就像生活中一个灯泡以灯泡为中心向四周发射光线。

这里代码需要用到点光源,坐标,将光源加载场景中三部即可渲染在浏览器中查看效果
注意:这里的材质需要使用MeshLambertMaterial才能受到光照的影响

//点光源:两个参数分别表示光源颜色和光照强度
// 参数1:0xffffff是纯白光,表示光源颜色
// 参数2:1.0,表示光照强度,可以根据需要调整
    const pointLight = new THREE.PointLight(0xffffff, 1.0);
    // pointLight.position.set(400, 0, 0);//点光源放在x轴上
    pointLight.position.set(100, 60, 50); //设置光源的位置
    // 光源和网格模型Mesh对应一样是三维场景的一部分,自然需要添加到三维场景中才能起作用。
    scene.add(pointLight); // 添加光源到场景中

下面是演示效果:
请添加图片描述

请添加图片描述

相机控件OrbitControls

平时开发调试代码,或者展示模型的时候,可以通过相机控件OrbitControls实现旋转缩放预览效果。

引入扩展库OrbitControls.js

// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

注意:如果你在原生.html文件中,使用上面引入方式import { OrbitControls } from 'three/addons/controls/OrbitControls.js';,注意通过<script type="importmap">配置。

<script type="importmap">
  {
	"imports": {
	"three": "../../../three.js/build/three.module.js",
                 "three/addons/": "../../../three.js/examples/jsm/"
        }
  }
</script>

使用方式:

  // 相机控件
  const control = ()=>{
    // 可以对物体进行操作
    controls = new OrbitControls(camera, renderer.domElement);
    controls.addEventListener('change', function () {
    // 每次拖动都会监听相机位置变化
    console.log('camera.position',camera.position);
});
  }
  control()

请添加图片描述

平行光与环境光

平行光DirectionalLight和环境光AmbientLight进一步了解光照对应模型Mesh表面的影响

点光源辅助观察PointLightHelper

预览观察:可以借助相机控件OrbitControls旋转缩放三维场景便于预览点光源位置
借上面的点光源例子添加辅助观察

// 光源辅助观察
const pointLightHelper = new THREE.PointLightHelper(pointLight, 10);
scene.add(pointLightHelper);

效果如下:
请添加图片描述

环境光设置

环境光AmbientLight没有特定方向,只是整体改变场景的光照明暗。环境光就不需要加位置了,只有整体

//环境光:没有特定方向,整体改变场景的光照明暗
  // 光源
  // 光源
  const linght = () => {
    const ambient = new THREE.AmbientLight(0xffffff, 1.0);
    scene.add(ambient);
  };
  linght();

平行光

平行光DirectionalLight就是沿着特定方向发射。

// 平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
// 设置光源的方向:通过光源position属性和目标指向对象的position属性计算
directionalLight.position.set(100, 50, 50);
// 方向光指向对象网格模型mesh,可以不设置,默认的位置是0,0,0
directionalLight.target = mesh;
scene.add(directionalLight);

平行光辅助观察DirectionalLightHelper

通过点光源辅助观察对象DirectionalLightHelper可视化点光源。

const dirLightHelper = new THREE.DirectionalLightHelper(directionalLight, 5,0xff0000);
scene.add(dirLightHelper);

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java的社区养老服务系统 ssm空巢老人

创新点&#xff1a; 1、根据时间、类型统计用户下单记录&#xff0c;形成可视化图形&#xff08;饼状图&#xff09; 2、根据用户爱好推荐项目 包含模块&#xff1a;关于我们、联系我们、外链信息、资讯类型、服务资讯、服务类型、服务项目、案例类型、服务案例、讨论类型、讨论…

【数据库】— 2NF、3NF、BCNF、最小函数依赖集例题

判断范式级别 设有关系模式W(C,P,S,G,T,R)&#xff0c;其中各属性的含义是&#xff1a;C课程&#xff0c;P教师&#xff0c;S学生&#xff0c;G成绩&#xff0c;T时间&#xff0c;R教室&#xff0c;根据定义有如下数据依赖集 D{ C→P&#xff0c;(S,C)→G&#xff0c;(T,R)→C&…

2023.04.23 学习周报

文章目录 摘要文献阅读1.题目2.摘要3.介绍4.模型4.1 研究区域4.2 自相关分析4.3 LSTM 5.实验与讨论5.1 高架道路不同位置空气污染物的变化5.2 高架道路不同位置空气污染物的相关性5.3 高架道路不同位置空气污染物预测 6.结论7.展望 度规张量1.曲率2.度量张量3.代码实现4.平行四…

【go】三色标记-垃圾回收机制

垃圾回收原因 &#xff1a; 垃圾回收是一种内存管理技术&#xff0c;它的主要目的是自动管理程序中的内存分配和释放&#xff0c;以减少内存泄漏和野指针等问题 赋值器与回收器&#xff1a; 赋值器&#xff08;Mutator&#xff09;是指程序中的执行部分&#xff0c;负责创建…

LinkedBlockingQueue原理

1. 基本的入队出队 public class LinkedBlockingQueue<E> extends AbstractQueue<E>implements BlockingQueue<E>, java.io.Serializable {static class Node<E> {E item;/*** 下列三种情况之一* - 真正的后继节点* - 自己, 发生在出队时* - null, 表…

Django框架之创建项目、应用并配置数据库

django3.0框架创建项目、应用并配置数据库 创建项目 进入命令行 新建一个全英文的目录 进入目录 输入命令 django-admin startproject project 项目目录层级 查看当前目录层级 tree /f 目录文件说明 创建数据库 做一个学生管理系统做演示&#xff0c;使用navicat创建数据…

windows中vscode配置C/C++环境

首先要把MinGW的环境安装完&#xff0c;我一般是下载带有MinGW的codeblocks&#xff0c;这样省去自己安装MinGW。因为安装MinGW还挺麻烦的。 安装完codeblocks&#xff0c;找到其安装目录&#xff0c;把bin文件配置到环境变量去&#xff1a; 将bin添加到环境变量 然后打开vsco…

[读书笔记] 从问题和公式角度理解 Diffusion Model

[小全读书笔记] 从问题和公式角度理解 Diffusion Model 1. Diffusion Model的结构1.1 定义与限制1.2 定义与限制的数学体现 2. Diffusion Model的模型训练2.1 似然函数转换成ELBO2.2 拆解ELBO2.3 求解关键&#xff1a; q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1…

【c语言】函数的数据传递原理 | 数组传入函数方法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

ChatGPT实现语义分析情感分类

语义分析情感分类 我们从开源社区找到了中科院谭松波博士整理的携程网酒店评论数据集(https://raw.githubusercontent.com/SophonPlus/ChineseNlpCorpus/master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv)。一共七千余条数据&#xff0c;包括 label 和 review …

5G基站外市电改造建设方案 (ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 外市电定义及分类 定义&#xff1a;由供电部门提供的专用高压电源或非专用高压电源或低压电源均称为市电。分类&#xff1a; &#xff08;1&#xff09;按电压等级分类 ①提供…

Linux Shell 实现一键部署http+用户名密码登录

Apache 前言 Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充&#xff0c;将Perl/Python等…

西交大-一百本书-解决不能粘贴的限制

快毕业了&#xff0c;要填四个一百&#xff0c;其他三个都几分钟就填完了。只有读一百本书要写读书笔记且不能粘贴&#xff0c;防谁呢真是的。发现一种解决不能粘贴限制的方法。顺道附上利用ChatGpt快速生成书评的方法。 四个一百网址 一、 解除粘贴限制 以edge浏览器为例 登…

Redis基础知识概述

Redis基础知识概述 文章目录 Redis基础知识概述一、Redis简介二、NoSQL技术三、Redis的高并发和快速原因四、Redis为什么是单线程的 五、单线程的优劣势1、优势2、劣势 六、Redis高并发总结七、在java中使用Redis1、添加Jedis依赖 八、Redis在Java Web中的应用1、存储缓存用的数…

C++的异常

文章目录 1. C语言传统的处理错误的方式2. C异常概念3. 异常的使用3.1 异常的抛出和匹配原则 4. C标准库的异常体系5. 自定义异常体系6. 异常的重新抛出7. 函数调用链中异常栈展开匹配原则8. 异常安全9. 异常规范10. 异常的优缺点 1. C语言传统的处理错误的方式 传统的错误处理…

【LPC55s69】使用FAL分区管理与easyflash变量管理

文章目录 1.FAL组件1.1什么是FAL1.2 使用ENV配置FAL1.3 FAL SFUD 移植1.4 FAL SFUD 测试用例1.5 测试结果 2.DFS文件系统2.1 什么是DFS2.2 DFS架构2.3 使用ENV配置DFS2.4 DFS挂载到FAL分区测试2.5 测试结果 3.Easyflash移植到FAL分区3.1 简述EasyFlash3.2EasyFlash软件包使用3.…

windows 文件夹目录过长超过长度259字符 文件打不开

当路径超过260个字符时&#xff0c;Windows操作系统就无法处理文件或文件夹&#xff0c;并且无法打开或重命名。这是因为Windows系统使用的文件系统&#xff0c;即FAT和NTFS文件系统&#xff0c;都有最大路径限制。NTFS文件系统最大长度限制为32767个字符&#xff0c;但操作系统…

凝心聚力,携“源”出海:开源社顾问委员会2023年第一季度会议圆满举办!

2023 年 3 月 25 日&#xff0c;开源社顾问委员会&#xff08;以下简称"顾问委员会"&#xff09;第一季度会议在北京圆满召开。这是顾问委员会自 2018 年成立以来的第 17 次全体委员会议。 为增进顾问委员会成员交流&#xff0c;加强开源社社区建设&#xff0c;实现开…

ansible自动运维——ansible使用临时命令通过模块来执行任务

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

制冷暖通工业互联网平台建设

制冷暖通工业互联网平台建设需要遵循一定的流程&#xff0c;具体步骤如下&#xff1a; 需求分析&#xff1a;了解客户需求&#xff0c;包括业务流程、系统功能、界面设计等方面。 系统设计&#xff1a;基于需求分析&#xff0c;进行系统设计&#xff0c;包括系统结构、数据库设…