如何建设一个web网站/什么是新媒体营销

如何建设一个web网站,什么是新媒体营销,阿里巴巴批发网站怎么做,智慧团建网站登录密码系列文章目录 系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六…

请添加图片描述

系列文章目录

系列文章目录

Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型


文章目录

  • 系列文章目录
  • 系列文章目录
  • 一、前言
  • 二、创建透视投影相机
  • 三、位置设置
  • 四、方向控制
  • 五、旋转相机
  • 六、牛刀小试
  • 总结


一、前言

    在 Three.js 创建的 3D 虚拟世界中,相机是我们观察场景的窗口。而透视投影相机(PerspectiveCamera)是 Three.js 里常用的相机类型之一,它模拟了人眼观察物体的方式,即近大远小,能为场景带来逼真的深度感。本篇文章将介绍透视投影相机在 Three.js 中的使用。


二、创建透视投影相机

// 创建一个透视相机
const camera = new THREE.PerspectiveCamera(75, // 视场角(FOV)window.innerWidth / window.innerHeight, // 宽高比0.1, // 近裁剪面2000 // 远裁剪面
);

PerspectiveCamera( fov, aspect, near, far )参数介绍:

参数说明默认值
fov视野角度(Field of View),指垂直方向上的视角,单位是度。通常设置为 45 - 75 度,类似人眼的视角范围,能让场景看起来自然。数值越大,视角越广,场景中的物体看起来越小;数值越小,视角越窄,物体看起来越大50
aspect宽高比,即渲染区域的宽度与高度之比。一般设置为Canvas画布宽高比width / height,确保场景在不同尺寸屏幕上正确显示1
near近裁剪面,相机能看到的最近距离。小于此距离的物体不会被渲染。设置过小可能导致近处物体出现闪烁或错误,需根据场景大小合理调整0.1
far远裁剪面,相机能看到的最远距离。大于此距离的物体不会被渲染。设置过大可能影响性能,因为 GPU 需要处理更多远处的物体。2000

ps:表格中提到的Canvas画布指的是3d场景在网页上渲染的dom节点,它是个canvas,可通过渲染器的domElement属性获取。

//创建渲染器
const renderer = new THREE.WebGLRenderer();
//获取dom
const canvas=renderer.domElement

三、位置设置

改变相机在3D场景中位置

1、通过camera.position.set(x,y,z),其中x,y,z分别代表3维坐标系中x轴、y轴、z轴坐标向量

camera.position.set(5, 10, 30);

2、通过camera.position.属性设置,camera.position是一个THREE.Vector3对象(三维向量),有x、y、z三个属性

camera.position.x = 5;
camera.position.y = 10;
camera.position.z = 30;

ps:相机默认位置在原点(0,0,0)


四、方向控制

设置相机方向,使得它的正前方指向某个方向。

通过camera.lookAt(x,y,z),让相机看向某个点

camera.lookAt(0,10,30);

或传入一个三维向量对象

const target = new THREE.Vector3( 0, 10, 30 );
camera.lookAt( target );

看向场景中一个物体:

const mesh= new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1),new THREE.MeshStandardMaterial({ color: 0x00ff00 })
);
scene.add(mesh);
camera.lookAt(mesh.position);

始终保持看向该物体:

function animate() {requestAnimationFrame(animate);camera.lookAt(mesh.position);renderer.render(scene, camera);
}
animate();

ps:相机方向默认看向z轴负方向

知识点提前了解:z轴方向跟css z-index方向是一致的,人眼睛跟电脑屏幕垂直方向即为z轴,
向屏幕内为负,向屏幕外为正,屏幕宽方向为x轴,高方向为y轴

五、旋转相机

1、通过camera.rotation.set(x,y,z);

入参x,y,z以弧度为单位

// 设置相机绕z轴旋转45度(转换为弧度),x轴和y轴不旋转
camera.rotation.set(0,0,Math.PI / 4,);

2、通过rotation属性旋转相机

rotation属性包含三个值,分别是绕 X、Y、Z 轴的旋转角度(以弧度为单位)

//绕着x轴旋转45度
camera.rotation.x=Math.PI/4;
//绕着y轴旋转90度
camera.rotation.y=Math.PI/2;
//绕着z轴旋转60度
camera.rotation.z=Math.PI/3;

旋转顺序:默认XYZ(可通过camera.rotation.order修改)

camera.rotation.order='YZX';

六、牛刀小试

下面实现一个小案例:通过鼠标滚轮实现相机缩放功能

代码示例:

import * as THREE from "three";
//创建场景
const scene = new THREE.Scene();
//设置黑色背景色
scene.background = new THREE.Color(0x000000);//创建一个球体
const geometry = new THREE.SphereGeometry(5);
//创建一个基础材质
const material = new THREE.MeshBasicMaterial({color: "#ff00ff",
});
//创建一个网格对象
const mesh = new THREE.Mesh(geometry, material);
//设置网格对象位置
mesh.position.set(0, 0, 0);
//添加到场景中
scene.add(mesh);//创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
//设置相机位置
camera.position.set(0, 10, 30);
//相机默认看向网格对象
camera.lookAt(mesh.position);//创建渲染器
const renderer = new THREE.WebGLRenderer();
//设置渲染器尺寸为页面宽高
renderer.setSize(document.documentElement.clientWidth,document.documentElement.clientHeight
);
//将渲染器的 DOM 元素添加到页面中
document.body.appendChild(renderer.domElement);// 循环动画
function animate() {// 定时刷新requestAnimationFrame(animate);renderer.render(scene, camera);
}
// 执行动画
animate();//监听滚轮事件
window.addEventListener("wheel", (event) => {const speed = 1;if (event.deltaY > 0) {//缩小camera.position.z += speed;} else {//放大camera.position.z -= speed;}
});

运行效果:

请添加图片描述

说明:监听wheel事件,根据滚轮滚动方向调整相机的position.z值,position.z值越大相机离我们眼睛越近,离物体越远呈现视觉效果就是物体在缩小,反之在放大。

总结

      透视投影相机是 Three.js 创建逼真 3D 场景的重要工具。通过掌握其创建、位置与方向控制以及与场景的交互,我们能为用户带来更丰富、沉浸式的 3D 体验。在实际应用中,需根据场景需求和用户体验,不断调整相机参数和交互逻辑,创造出令人满意的 3D 作品。

更多three.js入门知识点请关注该系列教程后续的更新。

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

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

相关文章

IntelliJ IDEA 控制台输出中文出现乱码

IntelliJ IDEA 控制台输出中文出现乱码通常是由于编码设置不一致导致的。以下是常见原因及解决方法 1. 项目编码设置 检查路径:File → Settings → Editor → File Encodings 确保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…

Scrum方法论指导下的Deepseek R1医疗AI部署开发

一、引言 1.1 研究背景与意义 在当今数智化时代,软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论,以其迭代式开发、快速反馈和高效协作的特点,在软件开发领域占据了重要地位。自 20 世纪 90 …

蓝桥与力扣刷题(蓝桥 交换瓶子)

题目:有 N 个瓶子,编号 1 ~ N,放在架子上。 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置。 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况&#x…

Spring AutoWired与Resource区别?

大家好,我是锋哥。今天分享关于【Spring AutoWired与Resource区别?】面试题。希望对大家有帮助; Spring AutoWired与Resource区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Spring 中,Autowired 和 Resource 都是用于…

行业分析---对自动驾驶规控算法的思考

1 前言 随着自动驾驶端到端大模型的兴起,小鹏、华为、理想、蔚来、小米等公司都对自动驾驶业务部进行了组织架构的调整,准备应对新的或者更高级别的自动驾驶研发任务。 近几年由于自动驾驶技术的快速发展,不少从业者觉得相关职业的未来充满了…

【YOLOv8】损失函数

学习视频: yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失:BCE Loss 定位损失…

小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试等,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。

小鱼深度评测 通义灵码2.0 1、引言2、通义灵码 更新与安装2.1 IDE插件更新2.1.1 PyCharm 更新2.1.2 VSCode 更新 2.2 官网下载更新 3、 使用体验3.1生成单元测试3. 2 跨语言编程3.3灵码2.0 与1.0 对比 4、总结 1、引言 通义灵码, 我一直使用的编码协助工具&#xf…

《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成

量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…

深度解读DeepSeek:从原理到模型

一、大模型模型发展路线退 二、DeepSeek V2-V3/R1技术原理 DeepSeek V2、V3 和 R1 模型架构优化要点: 1、‌DeepSeek V2‌ 混合专家架构(DeepSeekMoE)‌:采用细粒度专家划分与共享专家机制,总参数规模达236B但仅激活…

easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题

需求背景&#xff1a;有一个需求要做下拉框的值有100多条&#xff0c;同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出&#xff0c;会出现下拉框的值过多&#xff0c;导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…

AI工作流+专业知识库+系统API的全流程任务自动化

我有点悲观&#xff0c;甚至很沮丧&#xff0c;因为AI留给普通人的机会不多了&#xff0c;这既是人类之间权力的斗争&#xff0c;也是硅基生命和碳基生命的斗争。AI自动化是无法避免的趋势&#xff0c;如果人类不能平权&#xff0c;那就只能跪下接受审判。 通过整合AI工作流、专…

Lua | 每日一练 (3)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (3)题目参考答案减少查找次数预分配表…

二叉树(中等题)

1、先序&#xff0c;中序遍历确定二叉树 105 方法一、 前提 ① 必须不能有重复元素② 只有先序&#xff0b;中序和后序&#xff0b;中序才能实现唯一树 思考要点&#xff1a; 不要想着用for循环&#xff0c;递归一定更好解决输入是vector&#xff0c;递归就得考虑传入索…

巧妙实现右键菜单功能,提升用户操作体验

在动态交互式图库中&#xff0c;右键菜单是一项能够显著提升用户操作便捷性的功能。它的设计既要响应用户点击位置&#xff0c;又需确保菜单功能与数据操作紧密结合&#xff0c;比如删除图片操作。以下将通过一段实际代码实现&#xff0c;展示从思路到实现的详细过程。 实现右键…

KEGG条形图绘制

原始数据 setwd("C:\\Users\\HUAWEI\\Desktop\\proteomic_WGCNA\\bacteria\\Eggnog\\KEGGhun") library(ggplot2) library(cols4all) dt <- read.csv("bacteria_KEGG.csv")dt$KEGG_Term <- factor(dt$KEGG_Term, levels rev(dt$KEGG_Term))#基础富集…

My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片

应用介绍 My Metronome 是一款适用于 macOS 的专业节拍器应用程序&#xff0c;旨在帮助音乐家、作曲家、学生和任何需要精确节奏控制的人进行练习。无论是进行乐器练习、音乐创作还是演出排练&#xff0c;My Metronome 都能为用户提供精准的节拍支持和灵活的功能&#xff0c;确…

宇树科技13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 Humanoid 100清单清单中…

Part 3 第十二章 单元测试 Unit Testing

概述 第十二章围绕单元测试展开&#xff0c;阐述了单元测试的实践与重要性&#xff0c;通过对比其他测试类型&#xff0c;突出其特点&#xff0c;还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容&#xff0c;为编写高质量单元测试提供指导。 章节概要 1…

酒店旅游API:数据交互的隐形桥梁——以携程API为例

一、API&#xff1a;酒店 和第三方服务无缝连接。 核心价值&#xff1a; 实时数据互通&#xff1a;房态、价格、库存秒级同步。业务流程自动化&#xff1a;预订、支付、确认全程无需人工干预。生态扩展&#xff1a;开发者可基于API构建定制化工具&#xff08;如比价插件、智能…