Three.js入门篇(一)创建一个场景

上一面讲述了向场景中添加物体对象。这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解。另一方面希望能够

帮助到有需要的人。

一、在学习WEBGL的时候,你应该先了解要创建一个WebGL程序需要哪些步骤。就跟弄梅菜扣肉一样,需要哪些步骤。

  • 初始化WebGL绘图上下文
  • 初始化着色器程序
  • 建立模型和数据缓存
  • 完成绘制和动画

这是一个面向过程编程。然而three.js不一样,是一个面向对象编程。主要构建三个对象 scene(场景) camera(相机) renderer(渲染器).。

这三个东西是什么意思呢?听起来完全不懂是啥。举个小列子:就拿电影来说。场景(scene)就好比整个布局空间,相机(camera)相当于

拍摄期。而渲染器相当于(renderer)把拍摄的电影转换成胶卷也就是电脑的屏幕。

场景和空间包含了3D和数据模型,而renderer包含了着色器和WebGL绘图上下文。

二、THREE.JS创建场景,相机,渲染器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Demo1(three入门第一篇)</title>
</head>
<body>

</body>
<script type="text/javascript" src="js/three.js"></script>
<script type="text/javascript">
    var width = window.innerWidth, height = window.innerHeight;
    var scene = new THREE.Scene(); //创建一个场景
    var camera = new THREE.PerspectiveCamera(75,width/height,1,5000); //创建相机
    /*
        three.js创建相机的方式有很多种,其中最长用的是PerspectiveCamera();
        远景相机,相当于人眼观察模式
        肯定有人会有疑问,这几个参数是什么意思呢?
        第一个 75 是 视角
        width / height 相机拍摄面的长宽比,别问为什么这么写,我也没搞清楚。反正设置为窗口
        的width/height图形就不会被压变形。
        下面两个是近裁剪面。和远裁剪面。
     */
    var renderer = new THREE.WebGLRenderer();  //s上一篇用的是CSS3DRenderer
    //WebGLrenderer其实是用CANVAS渲染。
    renderer.setSize(width,height);
    document.getElementsByTagName(‘body‘)[0].appendChild(renderer.domElement);
</script>
</html>

电影,场景,胶卷都准备好了,那如何才能展示演员呢?也就是上面一篇说 的如何向场景中添加物体对象呢?

三、添加演员(3D立方体)。

 //演员进场
    var geometry = new THREE.BoxGeometry(1,1,1);
    //BoxGeometry(); 3D盒子模型。包含了立方体所有顶点和填充面的对象。
    var material = new THREE.MeshBasicMaterial({color:‘red‘});
    //有个几何模型,我们需要材料为其上色。我们采用的时候 网孔基础材料MeshBasicMaterial();
    var mesh = new THREE.Mesh(geometry,material);
    //需要一个网孔,来承载几何模型和材料
    scene.add(mesh);  //把这个网孔放置到场景中去。

    camera.position.z = 5; //调节相机的位置。

    renderer.render(scene,camera); //把画面转换成相机,并播放

这样这个演员就入镜了。

四、如何让这个演员动起来呢?

    //懂动起来。
    function loop(){
        requestAnimationFrame(loop);
        mesh.rotation.x += 0.1;  //X选择
        mesh.rotation.y += 0.1;  //Y旋转
        renderer.render(scene,camera); //把画面转换成相机,并播放
    }
    loop();
    //解释下requestAnimationFrame这个api
    /*
     requestAnimationFrame这个函数,它用来替代 setInterval, 这个新接口具备多个优点,
     比如浏览器Tab切换后停止渲染以节约资源、
     和屏幕刷新同步避免无效刷新、在不支持该接口的浏览器中能安全回退为setInterval。
     简直就是动画神奇
     */

演员入镜,并有了,打动效果。第一个小短篇算完成了吧。

五、整个代码(本来想托管到githup上)。发现太慢了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Demo1(three入门第一篇)</title>
</head>
<body>

</body>
<script type="text/javascript" src="js/three.js"></script>
<script type="text/javascript">
    var width = window.innerWidth, height = window.innerHeight;
    var scene = new THREE.Scene(); //创建一个场景
    var camera = new THREE.PerspectiveCamera(75,width/height,1,5000); //创建相机
    /*
        three.js创建相机的方式有很多种,其中最长用的是PerspectiveCamera();
        远景相机,相当于人眼观察模式
        肯定有人会有疑问,这几个参数是什么意思呢?
        第一个 75 是 视角
        width / height 相机拍摄面的长宽比,别问为什么这么写,我也没搞清楚。反正设置为窗口
        的width/height图形就不会被压缩。
        下面两个是近裁剪面。和远裁剪面。
     */
    var renderer = new THREE.WebGLRenderer();  //s上一篇用的是CSS3DRenderer
    //WebGLrenderer其实是用CANVAS渲染。
    renderer.setSize(width,height);
    document.getElementsByTagName(‘body‘)[0].appendChild(renderer.domElement);

    //演员进场
    var geometry = new THREE.BoxGeometry(1,1,1);
    //BoxGeometry(); 3D盒子模型。包含了立方体所有顶点和填充面的对象。
    var material = new THREE.MeshBasicMaterial({color:‘red‘});
    //有个几何模型,我们需要材料为其上色。我们采用的时候 网孔基础材料MeshBasicMaterial();
    var mesh = new THREE.Mesh(geometry,material);
    //需要一个网孔,来承载几何模型和材料
    scene.add(mesh);  //把这个网孔放置到场景中去。

    camera.position.z = 5; //调节相机的位置。

    //懂动起来。
    function loop(){
        requestAnimationFrame(loop);
        mesh.rotation.x += 0.1;  //X选择
        mesh.rotation.y += 0.1;  //Y旋转
        renderer.render(scene,camera); //把画面转换成相机,并播放
    }
    loop();
    //解释下requestAnimationFrame这个api
    /*
     requestAnimationFrame这个函数,它用来替代 setInterval, 这个新接口具备多个优点,
     比如浏览器Tab切换后停止渲染以节约资源、
     和屏幕刷新同步避免无效刷新、在不支持该接口的浏览器中能安全回退为setInterval。
     简直就是动画神奇
     */

</script>
</html>

六、在WebGL中three.js扮演了重要的角色,然而中文api真的少。只有一个一个的慢慢累积。

时间: 2024-10-08 00:14:51

Three.js入门篇(一)创建一个场景的相关文章

第七篇:创建一个SOUI的Hello World

从0开始一个SOUI项目 1.环境配置 SOUI项目本质是一个基于Win32窗口的应用程序.因此首先我们可以从Win32窗口应用程序向导创建一个简单的Win32项目. 并在第3页选择“Window应用程序” 选择“完成”后生成一个Win32应用程序骨架. 项目的文件结构如下图: 要使用SOUI开发程序程序,首先当然是要找到从SVN获取的SOUI项目代码.假定SOUI项目保存在%SOUIPATH%这个环境变量指向的目录(安装了SOUI向导后会自动创建这个环境变量). 我们需要在VS的include

cocos3.2中如何创建一个场景

1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ #include "cocos2d.h" USING_NS_CC; #define winSize Director::getInstance()->getWinSize() #define CCLog cocos2d::log #endif 2.创建一个场景

【SSRS】入门篇(一) -- 创建SSRS项目

在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中运行的报表. 1.单击“开始 --> 所有程序 --> Microsoft SQL Server 2012 ,然后单击“SQL Server Data Tools”: 打开SQL Data Tools的界面如下: 2.在“文件”菜单上,指向“新建”,然后单击“项目”. 3.选择"商业智能 -->Reporting Services --

初学node,js入门篇(1) ========搭建第一个node服务器

闲来无事,研究一番node.js,虽然网上已有大把的资源教程,但是还是不如自己手写一份来的记忆深刻. 创建node服务器第一步:下载node.js安装以及配置环境变量. 创建node服务器第二步:找到node.js的根目录,盘符:\nodejs\node_modules   这是node.js的根目录. 创建node服务器第三步:创建一个新的js文件,例如server.js,放置在node_modules目录下面. 创建node服务器第四步:编辑server.js文件,具体代码如下 //引入re

Three.js 第一篇:绘制一个静态的3D球体

第一篇就画一个球体吧 首先我们知道Three.js其实是一个3D的JS引擎,其中的强大之处就在于这个JS框架并不是依托于JQUERY来写的.那么,我们在写这一篇绘制3D球体的文章的时候,应该注意哪些地方呢?下面我就来一一列举 1.场景. 场景是什么,说得简单一点,场景就是一个canvas ,我们就是要在Canvas上面实现3D效果的画面而已.场景和容器,相机是息息相关的,我们就拿拍戏来说,假如我们需要演一个古装剧的撕逼场景,那么,我们需要的道具其中之一就是一个相机. 2.容器 就是承载球体的DI

Orchard入门:如何创建一个完整Module

这是一个Orchard-Modules的入门教程.在这个教程里,我们将开发两个功能页面分别用于数据录入与数据展示. 完成上述简单功能开发,我们一共需要6个步骤.分别为: 创建Module 创建Model 创建Services 创建Controller.View 创建Route 创建Admin Menu 上面6个步骤可能不太好理解.在这里,我们把他们转换从MVC中的概念让我们更好理解. Module 项目模块 Model 实体层 Controller.View Controller.View Ro

JS入门学习,写一个简单的图片库

<!-- 新手刚开始学JS,每天坚持写点东西 坚持下去,希望能有所进步 .  加油~~ --> <!DOCTYPE html>                                            <html><head> <title>创建一个图片库</title> <meta charset="gb2312" /> <link rel="stylesheet"

Node.js 入门篇

Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性能非常好.Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好. Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集

JS入门学习,写一个时钟~

<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <title>数码时钟</title> <meta charset="gb2312"> <style type="text/css"> *{ padding:0; margin:0;} body{background:rgb(0,2