Three.js初学(2)

Three.js初学(2)

  • 三维坐标系的认识
    • 1. 辅助坐标系
  • 光源的影响
    • 1. 光材质的影响
    • 2. 光源介绍
      • 点光源
      • 环境光
      • 平行光
    • 3. 光源衰减/位置
  • 相机控件
    • 1. 引入扩展库
    • 2. 使用方法

三维坐标系的认识

这一章节的主要作用是加强自我对三维坐标空间的认识。

1. 辅助坐标系

AxesHelper()的参数是辅助坐标系的线段的尺寸大小(设置时尽量比自己的三维场景几何体要大~)。坐标轴颜色红R、绿G、蓝B分别对应坐标系的x、y、z轴,对于three.js的3D坐标系默认y轴朝上。

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

如果模型颜色太深看不起坐标轴,可以将材质设置为半透明颜色,这样可以清楚观察到辅助坐标系。

const material = new THREE.MeshBasicMaterial({color: 0xff0000, //设置材质颜色transparent:true,//开启透明opacity:0.3,//设置透明度
});

效果如下图所示:
在这里插入图片描述
其余具体代码由此可看:—> 上一篇博客详情

如果想要更进一步了解三维坐标系位置关系,可以试着更改Mesh模型对象在场景的尺寸大小以及渲染位置。也可以更改相机的位置坐标以及相机的LookAt()的方向。

光源的影响

在实际生活中物体表面的明暗效果是会受到光照强度的影响,比如晚上不开灯,你就很有可能看不到或者看不清物体,灯光越暗,视线越模糊。咱们用网格模型Mesh模拟生活中物体,用Light模拟光照对物体表面的影响。

1. 光材质的影响

three.js提供的众多网格模型中,是有一些不受光照影响的。如下图所示:
在这里插入图片描述
漫反射网格材质MeshLambertMaterial会受到光照影响,不同面和光线夹角不同,立方体不同面就会呈现出来不同的明暗效果。

MeshPhongMaterial可以实现MeshLambertMaterial不能实现的高光反射效果。对于高光效果,你可以想象一下,你在太阳下面观察一辆车,你会发现在特定角度和位置,你可以看到车表面某个局部区域非常高亮.它就类似与一个镜面反射效果,比如你生活中拿一面镜子,放在太阳光下,调整角度,可以把太阳光反射到其它地方,如果反射光对着眼睛,也就是反射光线和视线平行的时候,会非常刺眼。
属性值:

  • 高光亮度属性.shininess
// 模拟镜面反射,产生一个高光效果
const material = new THREE.MeshPhongMaterial({color: 0xff0000,shininess: 20, //高光部分的亮度,默认30
});
  • 高光颜色属性.specular
// 模拟镜面反射,产生一个高光效果
const material = new THREE.MeshPhongMaterial({color: 0xff0000,shininess: 20, //高光部分的亮度,默认30specular: 0x444444, //高光部分的颜色
});

2. 光源介绍

光源种类名称
环境光AmbientLight
点光源PointLight
聚光灯光源SpotLight
平行光DirectionLight

在这里插入图片描述

点光源

两个参数分别表示光源颜色和光照强度

  • 参数1:0xffffff是纯白光,表示光源颜色
  • 参数2:1.0,表示光照强度,可以根据需要调整,你可以可以直接访问光照强度属性.intensity设置
const pointLight = new THREE.PointLight(0xffffff, 1.0);
pointLight.intensity = 2.0;//光照强度

通过点光源辅助观察对象PointLightHelper可视化点光源,可以借助相机控件OrbitControls旋转缩放三维场景便于预览点光源位置。

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

可以试着更改原来光源的位置,观察光源变化情况。
在这里插入图片描述

环境光

环境光没有特定方向,只是整体改变场景的光照明暗。

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

在这里插入图片描述

平行光

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

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

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

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

在这里插入图片描述

3. 光源衰减/位置

实际生活中点光源,比如比如一个灯泡,随机距离的改变,光线会衰减,越来越弱,光源衰减属性.decay默认值是2.0,如果你不希望衰减可以设置为0.0。

光源其实就是一个灯泡,你放的位置不同,渲染的效果就不一样,需要注意的是光源位置尺寸大小

最后将光源添加到3D场景中即可

pointLight.decay = 0.0;//设置光源不随距离衰减
//点光源位置
pointLight.position.set(400, 0, 0);//点光源放在x轴上
scene.add(pointLight); //点光源添加到场景中

光源在x轴的效果如下图所示:
在这里插入图片描述

相机控件

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

本质上就是改变相机的参数,比如相机的位置属性,改变相机位置也可以改变相机拍照场景中模型的角度,实现模型的360度旋转预览效果,改变透视投影相机距离模型的距离,就可以改变相机能看到的视野范围。

1. 引入扩展库

  • 项目开发中引入方式:
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  • 如果在原生的HTML文件中:
<script type="importmap">{"imports": {"three": "../three.js/build/three.module.js","three/addons/": "../three.js/examples/jsm/"}}
</script><script type="module">
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
</script>

2. 使用方法

// 设置相机控件轨道控制器OrbitControls
const controls = new OrbitControls(camera, renderer.domElement);
// 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景
controls.addEventListener('change', function () {renderer.render(scene, camera); //执行渲染操作
});//监听鼠标、键盘事件
  • 旋转:拖动鼠标左键
  • 缩放:滚动鼠标中键
  • 平移:拖动鼠标右键

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫头虎分享已解决Bug || TypeError: Cannot set property ‘innerHTML‘ of null

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

华为配置直连三层组网隧道转发示例

配置直连三层组网隧道转发示例 组网图形 图1 配置直连三层组网隧道转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不…

Linux 系统编程:文件编程

本篇涉及文件的创建、打开、读和关闭。 文件为操作系统服务和设备提供了一个简单而一致的 接口 。“接口”指的是一种约定或标准&#xff0c;通过提供一个一致的接口&#xff0c;可以为上层隐藏底层硬件和服务的复杂性&#xff0c;上层无需关注它们的具体实现细节。 比如操作系…

Kafka进阶

文章目录 概要应用场景消息队列两种模式kafka的基础架构分区常见问题小结 概要 kafka的传统定义&#xff1a;kafka是一个分布式的基于发布\订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。 kafka的最新概念&#xff1a;kafka是一个开源的分布式事件流平台&#x…

随机森林模型、模型模拟技术和决策树模型简介

随机森林模型、模型模拟技术和决策树模型简介 随机森林模型 随机森林模型是一种比较新的机器学习模型&#xff0c;它是通过集成学习的方法将多个决策树模型组合起来&#xff0c;形成一个更加强大和稳定的模型。随机森林模型的基本原理是“数据随机”和“特征随机”&#xff0…

10种常见的光伏发电量计算方法

光伏发电是一种将太阳能转化为电能的清洁能源技术。随着环境保护意识的日益增强和能源结构的转型&#xff0c;光伏发电得到了广泛的应用。对于光伏系统来说&#xff0c;发电量的准确计算是评估系统性能、预测长期收益和优化系统运行的关键。以下是常见的光伏发电量计算方法&…

Vista 2.08: The storm chaser

A story about Mathew —— the storm chaser. "He is too young to understand his dream and the Harvard is just others dream put into his mind." "You dont have to chase for the happiness that defined by others. You must define your own happines…

Python3零基础教程之Python解释器与开发环境搭建

大家好&#xff0c;我是千与编程&#xff0c;硕士毕业于北京大学&#xff0c;曾先后就职于字节跳动&#xff0c;京东等互联网大厂&#xff0c;目前在编程导航知识星球担任星球嘉宾&#xff0c;著有《AI算法毕设智囊袋》&#xff0c;《保姆级带你通关秋招教程》两大专栏。 今天开…

从it方面介绍部分好玩的电影

电影推荐 1.《黑客帝国》《The matrix》 仅推荐第一二三部2. 《代码奔腾》《code rush》3 人物传记类 《社交网络》 《硅谷传奇》 《乔布斯》4《模仿游戏》也是传记 但主演是 卷福5 《环形使者》6 《蝴蝶效应》 三部7.《隐私大盗》8.《监视资本主义&#xff1a;智能陷阱》9. 剧…

RMAN备份与恢复

文章目录 一、RMAN介绍二、全量备份三、增量备份0级备份1级增量备份累积性差量备份总结 四、压缩备份压缩备份介绍压缩备份操作压缩备份优缺点 五、异常恢复1、恢复前的准备2、恢复数据库 六、RMAN相关参数 一、RMAN介绍 RMAN&#xff08;Recovery Manager&#xff09;是Oracl…

在做了frp的实验室服务器不同端口间传输文件

背景 实验室有两台服务器&#xff0c;使用的是一个IP&#xff0c;两个端口&#xff0c;给人看上去是一台服务器的两个端口&#xff0c;实际是两台服务器。 现在我需要从一个端口传输一个文件夹到另外一个端口&#xff0c;实际上是从一个机器传输到另外一个机器。 操作 在两台…

linux系统消息中间件rabbitmq部署镜像集群

RabbitMQ镜像集群配置 RabbitMQ镜像集群配置创建镜像集群:镜像队列策略设置说明 RabbitMQ镜像集群配置 上面已经完成RabbitMQ默认集群模式&#xff0c;但并不保证队列的高可用性&#xff0c;尽管交换机、绑定这些可以复制到集群里的任何一个节点&#xff0c;但是队列内容不会复…

thonny 使用命令行安装包并且替换源,安装速度嗖嗖的

thonny 使用命令行安装包并且替换源 点击 “工具”->"打开系统shell"替换源下载嘎嘎快 点击 “工具”->“打开系统shell” 替换源 pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/ pip config set global.trusted-host mirrors.aliy…

AI Agent几篇不错的概述和介绍

​2023年人工智能体(AI Agent)开发与应用全面调研&#xff1a;概念、原理、开发、应用、挑战、展望 OpenAI的CEO都在谈的 AI Agent&#xff0c;到底是什么&#xff1f; | 人人都是产品经理 AI智能体卷爆大模型&#xff01;4大Agent打擂&#xff0c;西部世界谁将成为软件2.0&am…

快速学习安全框架 Springsecurity最新版(6.2)--用户授权模块

简介 上一节Springsecurity 用户认证 Springsecurity 拥有强大的认证和授权功能并且非常灵活&#xff0c;,一来说我们都i有以下需求 可以帮助应用程序实现以下两种常见的授权需求&#xff1a; 用户-权限-资源&#xff1a;例如张三的权限是添加用户、查看用户列表&#xff0c;李…

康威生命游戏

康威生命游戏 康威生命游戏(Conway’s Game of Life)是康威发明的细胞自动机。 生命游戏有几个简单的规则&#xff1a; 细胞有两种状态&#xff0c;存活或死亡&#xff0c;每个细胞以自身为中心与周围的八格细胞互动。 对于存活的细胞&#xff1a; 当周围的细胞过少(<2)或…

【Linux】:简易实现自动化构建代码make/Makefile

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux自动化构建代码make/makefile的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&…

Leo赠书活动-18期 《高效使用Redis》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

Ubuntu22部署MySQL5.7详细教程

Ubuntu22部署MySQL5.7详细教程 一、下载MySQL安装包二、安装MySQL三、启动MySQL检查状态登录MySQL 四、开启远程访问功能1、允许其他主机通过root访问数据库2、修改配置文件&#xff0c;允许其他IP通过自定义端口访问 五、使用Navicat连接数据库 默认情况下&#xff0c;Ubuntu2…

Android的ViewModel

前言 在Compose的学习中&#xff0c;我们在可组合函数中使用rememberSaveable​​​​​​​保存应用数据&#xff0c;但这可能意味着将逻辑保留在可组合函数中或附近。随着应用体量不断变大&#xff0c;您应将数据和逻辑从可组合函数中移出。 而在之前的应用架构学习中&…