Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机

这篇具有很好参考价值的文章主要介绍了Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒Three.js🍖数据结构与算法体系教程

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容 参考链接
WebGL专栏 WebGL 入门
Three.js(一) 创建场景、渲染三维对象、添加灯光、添加阴影、添加雾化

前言

大家好,这里是前端杂货铺。

上篇文章我们学习了 创建场景、渲染三维对象、添加灯光、添加阴影、添加雾化,接下来继续我们 three.js 的学习!

在学习的过程中,如若需要深入了解或扩展某些知识,可以自行查阅 => three.js官方文档


一、scene 场景

在上篇文章中,我们已经使用过它,scene 场景能够让我们在什么地方、摆放什么东西来交给 three.js 来渲染,这是我们放置物体、灯光和摄像机的地方。

接下来,我们熟悉几个 scene 的常用 方法和属性

方法名 用途
add() 向场景中添加对象
getObjectByName() 通过命名获取对象
remove() 从场景中移除对象
属性名 用途
children 返回场景中所有对象的列表
fog 设置场景中的雾化效果
overrideMaterial 强制场景中所有对象使用相同材质

下面代码的场景中,我们添加了两个物体:立方体和球体。

我们使用 getObjectByName() 方法实现获取球体并放大球体为原来的两倍。使用 remove 方法移除了球体。

我们使用 chidren 属性查看场景中的对象列表(由于我们删除了球体,所有只有立方体和聚光灯)。使用 fog 属性在场景中添加雾化效果。使用 overrideMaterial 强制场景中所有对象使用同一材质。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/three/three.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <script>
        // 创建场景
        const scene = new THREE.Scene();
        // 创建相机 视野角度FOV、长宽比、近截面、远截面
        const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
        // 设置相机位置
        camera.position.set(0, 0, 20);

        // 创建渲染器
        const renderer = new THREE.WebGLRenderer();
        // 设置渲染器尺寸
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 添加立方体
        const cubeGeometry = new THREE.BoxGeometry(2, 2, 2);
        // 创建立方体材质
        const cubeMaterial = new THREE.MeshBasicMaterial({
            color: 0xff0000,
            wireframe: false
        });

        const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

        // 添加到场景
        scene.add(cube);

        // 添加球体
        const sphereGeometry = new THREE.SphereGeometry(1, 10, 10);
        // 创建球体材质
        const sphereMatrial = new THREE.MeshBasicMaterial({
            color: 0x00ff00,
            wireframe: true
        })
        const sphere = new THREE.Mesh(sphereGeometry, sphereMatrial);

        // 给球体命名
        sphere.name = 'sphere';

        // 添加到场景
        scene.add(sphere);

        // 通过命名放大球体为原来的两倍
        scene.getObjectByName("sphere").scale.set(2, 2, 2);

        // 添加灯光
        const spotLight = new THREE.SpotLight(0xffffff);
        spotLight.position.set(-10, 10, 10);
        scene.add(spotLight);

        // 查看场景中所有对象列表
        console.log(scene.children);

        // 设置场景中的雾化效果
        scene.fog = new THREE.Fog(0xffffff, 1, 50);

        // 移除立方体
        scene.remove(sphere);

        // 强制场景中所有对象使用相同材质
        scene.overrideMaterial = new THREE.MeshLambertMaterial({ color: 0xff0000});

        const animation = () => {
            cube.rotation.x += 0.01;
            cube.rotation.y += 0.01;

            sphere.rotation.x += 0.01;
            sphere.rotation.y += 0.01;
            // 渲染
            renderer.render(scene, camera);
            requestAnimationFrame(animation);
        }

        animation();
    </script>
</body>

</html>

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机,THREE,javascript,three.js,开发语言,前端


二、几何体位置、旋转、缩放

position 控制物体的位置、rotation 控制物体的旋转、scale 控制物体的缩放。

下面的代码,我们使用 单个赋值方法赋值 的方式来操作几何体。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/three/three.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <script>
        // 创建场景
        const scene = new THREE.Scene();
        // 创建相机 视野角度FOV、长宽比、近截面、远截面
        const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
        // 设置相机位置
        camera.position.set(0, 0, 20);

        // 创建渲染器
        const renderer = new THREE.WebGLRenderer();
        // 设置渲染器尺寸
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 添加立方体
        const cubeGeometry = new THREE.BoxGeometry(2, 2, 2);
        // 创建立方体材质
        const cubeMaterial = new THREE.MeshBasicMaterial({
            color: 0xff0000,
            wireframe: false
        });

        const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

        // 单个赋值 效果同下
        // // 位置 x => 3
        // cube.position.x = 3;
        // // 旋转 45 度
        // cube.rotation.x = 0.125 * Math.PI;
        // cube.rotation.y = 0.125 * Math.PI;
        // cube.rotation.z = 0.125 * Math.PI;
        // // x 放大 2 倍
        // cube.scale.x = 2;

        // 通过方法赋值
        cube.position.set(3, 0, 0);
        cube.rotation.set(0.125 * Math.PI, 0.125 * Math.PI, 0.125 * Math.PI);
        cube.scale.set(2, 1, 1);

        // 添加到场景
        scene.add(cube);

        // 渲染
        renderer.render(scene, camera);
    </script>
</body>

</html>

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机,THREE,javascript,three.js,开发语言,前端


三、正射投影相机

正射投影相机 new THREE.OrthographicCamera(渲染的图片中物体的大小都保持不变),它接收六个参数:

  1. left:左边界
  2. right:右边界
  3. top:上边界
  4. bottom:下边界
  5. near:近面
  6. far:远面
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/three/three.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <script>
        // 创建场景
        const scene = new THREE.Scene();
	 	// 正射投影相机
        const camera = new THREE.OrthographicCamera(-10, 10, 10, -10, 1, 1000)
        // 设置相机位置
        camera.position.set(0, 0, 20);

        // 创建渲染器
        const renderer = new THREE.WebGLRenderer();
        // 设置渲染器尺寸
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 添加立方体
        const cubeGeometry = new THREE.BoxGeometry(2, 2, 2);
        // 创建立方体材质
        const cubeMaterial = new THREE.MeshBasicMaterial({
            color: 0xff0000,
            wireframe: false
        });

        const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

        cube.rotation.set(0.125 * Math.PI, 0.125 * Math.PI, 0.125 * Math.PI);

        // 添加到场景
        scene.add(cube);

        // 渲染
        renderer.render(scene, camera);
    </script>
</body>

</html>

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机,THREE,javascript,three.js,开发语言,前端


四、透视投影相机

正射投影相机 new THREE.PerspectiveCamera (用来模拟人眼所看到的景象,近大远小),它接收四个参数:

  1. fov:视角
  2. aspect:宽高比
  3. near:近面
  4. far:远面
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/three/three.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <script>
        // 创建场景
        const scene = new THREE.Scene();
        // 透视投影相机 视野角度FOV、长宽比、近截面、远截面
        const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
        // 设置相机位置
        camera.position.set(0, 0, 20);

        // 创建渲染器
        const renderer = new THREE.WebGLRenderer();
        // 设置渲染器尺寸
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 添加立方体
        const cubeGeometry = new THREE.BoxGeometry(2, 2, 2);
        // 创建立方体材质
        const cubeMaterial = new THREE.MeshBasicMaterial({
            color: 0xff0000,
            wireframe: false
        });

        const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

        cube.rotation.set(0.125 * Math.PI, 0.125 * Math.PI, 0.125 * Math.PI);

        // 添加到场景
        scene.add(cube);

        // 渲染
        renderer.render(scene, camera);
    </script>
</body>

</html>

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机,THREE,javascript,three.js,开发语言,前端


总结

本篇文章我们熟悉了scene场景的一些方法和属性的使用,认识了如何对几何体进行位置、选择和缩放的操作,并简单了解了正射投影相机和透视投影相机。

更多内容扩展请大家自行查阅 => three.js官方文档,真心推荐读一读!!

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Three.js 官方文档
  2. WebGL+Three.js 入门与实战【作者:慕课网_yancy】

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机,THREE,javascript,three.js,开发语言,前端文章来源地址https://www.toymoban.com/news/detail-850504.html


到了这里,关于Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter

    前言:    vtkPolyDataConnectivityFilter 使用过,但网上没有看到完事的教程;这里整理一下;   提取数据集中连通的多边形数据。 该类是一个滤波器,提取cell(区域) - 拥有公共点或者满足某个阈值 该类在提取连通区域时候有如下6种模式:    1 )提取数据集中的最大(最多

    2024年02月02日
    浏览(38)
  • Threejs学习05——球缓冲几何体背景贴图和环境贴图

    这是一个非常简单基础的threejs的学习应用!本节主要学习的是球面缓冲几何体的贴图部分,这里有环境贴图以及背景贴图,这样可以有一种身临其境的效果!这里环境贴图用的是一个.hdr的文件,可以在网上随便下载一些使用,我在这里的例子里面使用的hdr文件已经免费上传

    2024年02月11日
    浏览(15)
  • 【ThreeJS基础教程-初识Threejs】1.6各种各样的几何体

    本段内容会写在0篇以外所有的,本人所编写的Threejs教程中 对,学习ThreeJS有捷径 当你有哪个函数不懂的时候,第一时间去翻一翻文档 当你有哪个效果不会做的时候,第一时间去翻一翻所有的案例,也许就能找到你想要的效果 最重要的一点,就是,绝对不要怕问问题,越怕找

    2024年02月08日
    浏览(34)
  • d3d12龙书阅读----绘制几何体(上)

    本节主要介绍了构建一个简单的彩色立方体所需流程与重要的api 下面主要结合立方体代码分析本节相关知识 输入装配器阶段的输入 首先,我们需要定义立方体的八个顶点 顶点结构体: 当然,对于更复杂的情况,我们不仅要定义顶点的位置与颜色,还要包括法线向量、纹理

    2024年03月27日
    浏览(44)
  • three.js鼠标控制场景旋转

    鼠标控制旋转

    2024年02月17日
    浏览(29)
  • three.js之scene

    THREE.Scene对象有时被称为场景图,可以用来保存所有图形场景的必要信息。在Three.js中,这意味着THREE.Scene保存所有对象、光源和渲染所需的其他对象。 本节主要是构建一个基本场景,然后可以通过gui添加,删除场景里的对象等。 效果图 源码 引入的插件js【本人的csdn也有下载

    2023年04月14日
    浏览(21)
  • three js模型旋转

    如何让立方体模型旋转到指定的面 父页面 效果:

    2024年02月15日
    浏览(26)
  • 从three.js旋转动画,我了解了requestAnimationFrame

    前言  📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!  🍅  个人主页: 南木元元 目录 three.js旋转动画 动画前置知识 屏幕刷新率与浏览器重绘次数 动画是如何形成的 实现动画的方式有哪些 什么是requestAnimationFrame setTimeoutsetInterval 结

    2024年02月03日
    浏览(32)
  • Three.js使用OrbitControls后修改相机旋转方向无效

            在项目中添加了OrbitControls控制器来控制相机的旋转和平移,但是需要修改初始的相机角度,于是我把相机的角度进行修改,如下: 运行项目后发现相机的位置并没有发生变化。原因是相机旋转和移动被OrbitControls控制器托管了。         方法1.于是我尝试创建一个组

    2024年02月16日
    浏览(41)
  • Three.js移动端双指触屏控制旋转和缩放

    在移动端通过双指来控制物体的选择和缩放。旋转通过双指旋转操作,而缩放通过双指距离实现。实现平台是小程序基于three.js的AR版。 旋转:两个手指产生的两个点可以算出一个向量,那么我就通过程序前后两帧计算两个向量之间的夹角来判断旋转的角度信息。这里我通过

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包