ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网页3D效果库Three.js初窥

2022-09-09 10:32:27  阅读:315  来源: 互联网

标签:THREE Three window var new js 3D


一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手
ThreeJs官网
ThreeJs-github;
接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加。

第一部分:three.js介绍

创建场景

这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑。

开始之前

在你使用Three.js之前,你需要在你的电脑上建立文件存放下面的html,并需要建立js目录将three.js放入,打开浏览器浏览。

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <title>My first Three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <script>
            // Our Javascript will go here.
        </script>
    </body>
</html>

好了,接下来的代码都放进空的script标签里

创建场景

事实上使用Three.js创建任何可显示的效果,都需要三样东西:场景,相机,渲染器,我们可以通过相机渲染场景.

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);
 
var renderer = new THREE.WebGLRenderer();
renderer.setSIze(window.innerWidth,window.innerHeight); 
document.body.appendChild(renderer.domElement);

让我们花点时间解释下上面的代码做了些什么,现在我们建立了场景,相机和渲染器
Three.js有几种不同的相机,现在我们使用PerspectiveCamera.第一个属性是视角,我们可以把相机理解为我们的眼睛, 第二个属性是宽高比,你通常希望使用元素的宽度除以高度,或者理解为当你在一个宽屏电视上看一个老电影是也会得到这种结果-图像会被拉伸,接下来的两个属性是远近剪切面,什么意思呢?字面上意思是:物体远离相机的far值或者比相机的near值还要近都不会被渲染! 看到这个我有点懵逼查了半天 投影矩阵 这篇文章讲的大概能看懂是什么意思。你现在不用担心这个,但是你可能会在你的app里使用其它值来达到更好的展现 !

接下来时渲染器,这是最神奇的地方,除了WebGLRenderer之外在这里使用其它的东西来兼容老的浏览器活着不支持WebGl的浏览器。

除了创建renderer实例,我们还需要设置渲染的尺寸,最好使用浏览器的宽度高度来填充应用,考虑性能,你仍可以setSize小的values。比如:window.innerWidth/2和 window.innerHeight/2,这样可以渲染半个屏幕

如果你想保持渲染的尺寸,但渲染在一个低分辨率的设备上,你可以调用setSize的updateStyle(第三个属性)设置为false,比如 setSize(window.innerWidth/2, window.innerHeight/2, false) 这样将会渲染在低分辨率的设备上但Canvas 100%显示

最后,我们添加渲染元素到HTML文档,这是一个canvas标签的渲染器来展示场景

"这非常好,但是立方体呢" 让我们继续

var geometry = new THREE.BoxGeometry(1,1,1);
var material = new THREE.MeshBasicMaterial({color:0x00ff00});
var cube = new THREE.Mesh(geometry,material);
scene.add(cube);
camera.position.z = 5

这将创建一个循环使渲染器每秒60次的频率绘画。如果你在写浏览器游戏,你可能会说“为什么我们不创建一个setInterval ?其实我们是可以的,但requestAnimationFrame有许多优点。最重要的是当用户导航到另一个浏览器选项卡它暂停,因此不浪费他们宝贵的处理能力和电池寿命。可以在控制台试试下面这段代码,切换tab观察!

function render(){
    requestAnimationFrame(render);console.log(1);
}
render();

 

使cube动起来

如果将上面所有的代码插入到我们开始创建的文件上,您应该看到一个绿色的盒子。接下来让它更有趣的旋转。
添加下面的代码到渲染器,调用renderer.render 在render函数里

cube.rotation.x += 0.1;
cube.rotation.y += 0.1;

每一帧的运行(60次/秒),并使立方体旋转动画。基本上,任何你想要移动或改变应用程序运行时必须经过渲染循环。你当然可以调用其他函数,这样你就不会得到一个数百行的渲染函数。

写在最后

恭喜你,你完成了你的第一个Three.js的应用,很简单,但你有了个起点!

下面提供了完整的代码,它可以让你更好的理解它是如何工作的

<html>
    <head>
        <title>My first Three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="js/three.js"></script>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
 
            var renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );
 
            var geometry = new THREE.BoxGeometry( 1, 1, 1 );
            var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
            var cube = new THREE.Mesh( geometry, material );
            scene.add( cube );
 
            camera.position.z = 5;
 
            var render = function () {
                requestAnimationFrame( render );
 
                cube.rotation.x += 0.1;
                cube.rotation.y += 0.1;
 
                renderer.render(scene, camera);
            };
 
            render();
        </script>
    </body>
</html>

 

标签:THREE,Three,window,var,new,js,3D
来源: https://www.cnblogs.com/Im-Victor/p/16671890.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有