Three.js笔记(三)第一个场景

基础文件

首先,要创建一个简单的index.html文件

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>(三)第一个场景</title>

</head>

    <body>

        <script src="./script.js"></script>

    </body>

</html>

然后在同级目录下创建script.js文件

console.log('喂喂喂,试音试音')

在浏览器里打开index.html文件——当然不是双击直接打开,需要直接拽到浏览器里,然后按F12打开管理工具,就能在控制台里看到输出的汉字。

加载Three.js

现在来加载Three.js库。方法有很多,比如简单的通过<script/>标签来加载下载好的库。

前往官网,下载并解压官方文件,从three.js-master/build/下,拷贝three.min.js到自己的项目中。

然后,就可以在<body>标签后载入库,

<script src="./three.min.js"></script>

<script src="./script.js"></script>

确保在加载three.min.js后,加载script.js,否则,自己编写的代码无法感知three.min.js中的函数。

使用Three.js

在script.js中,能够读取到一个叫做THREE的变量。注意应该大写。

如果将THREE放入console.log()函数中,在控制台会看到一堆返回值。

THREE包含了大多数经典Three.js项目中可能会用到的类与属性。但不幸的是,并非所有的类都在这个变量里,稍后我们将讨论如何访问它们。

要使用其中一个类,就需要将它初始化。比如,想要创建一个场景,需要写

const scene = new THREE.Scene()

想要创建一个球形几何体,需要写

const sphereGeometry = new THREE.SphereGeometry(1.5,32,32)

首个场景

想要在场景中显示些什么,首先需要准备4个要素

·一个场景——用来容纳各种对象

·一些对象

·一个相机

·一个渲染器

场景

场景就像个容器。它用来放置对象、模型、粒子、光线等等,然后在某个时刻,需要请求Three.js来渲染场景。

要创建场景,需要用到场景类Scene

//创建场景

const scene = new THREE.Scene()

对象

对象可以是很多东西。它可以是原始几何体、导入的模型、粒子、光照等等。

下面以一个红色的正方体为例。

要创建一个红色的立方体,需要创建一种叫做Mesh的类型的对象。一个Mesh是由几何体(形状)和材质(外观)组成。

虽然有很多种几何体与材质,但是为了简化,所以创建BoxGeometry和一个MeshBasicMaterial。

要创建几何体。使用带有三个参数的BoxGeometry,三个参数代表立方体的外形尺寸。

//创建对象

const geometry = new THREE.BoxGeometry(1,1,1)

要创建材质,使用带有一个参数的MeshBasicMaterial类,参数是一个对象{},这个对象包含了所有的选项。在这里仅仅需要颜色color属性。

有许多方法来定义Three.js里的颜色,可以发一个JS十六进制数比如0xff0000,也可以发送字符串型的十六进制"#ff0000",也可以直接用颜色的名字'red',或者传递一个Color类的实例。

//创建对象

const geometry = new THREE.BoxGeometry(1,1,1)

const material = new THREE.MeshBasicMaterial({color: 0xff0000})

要创建最终的网格体,使用Mesh类,然后将geometry和material作为参数传进去。

//创建对象

const geometry = new THREE.BoxGeometry(1,1,1)

const material = new THREE.MeshBasicMaterial({color: 0xff0000})

const mesh = new THREE.Mesh(geometry,material)

然后使用add()函数把网格体添加到场景中

scene.add(mesh)

如果不把对象添加到场景,场景里面什么也看不到。

相机

相机是不可见的,更像是一个理论观察点。当渲染一个场景时,会从相机视角来进行渲染。

场景里可以有多个相机,就像是拍电影,并且可以随时在相机之间切换。通常情况下,场景里只有一个相机。

相机有不同的类型,这点稍后讲。当下,场景里需要一个简单的透视镜头(近大远小的那种)。

要创建这样的镜头,要使用PerspectiveCamera类。

有两个重要的参数需要注意:

视场角

视场角就是视角的角度大小。如果视场角很大,会一下看到各个角度,但是带有很大的失真,因为视线被绘制在很小的矩形里面。如果视场角很小,场景内的东西就像放大了。视场角(fov)对应竖直方向上的视角的角度。这次我们使用75度。

长宽比

大多数情况下,长宽比是画布的长度除以高度。当前不用设置长宽比,但是以后会用得上。当下,创建一个临时值来使用。

不要忘了把相机添加到场景。没添加相机的情况下,每样东西都能运行,但是以后可能会报错。

//尺寸

const sizes = {

    width:800,

    height:600

}

//创建相机

const camera = new THREE.PerspectiveCamera(75,sizes.width/sizes.height)

scene.add(camera)

渲染器

渲染器的用处就是渲染。我们向渲染器发送简单的从相机视角渲染场景的指令,然后渲染结果就会被绘制到画布上。画布可以由自己创建,或者让渲染器自动生成并添加到页面上。这次,我们自己创建画布,并把它发送到渲染器。

先创建<canvas>元素并赋予一个类名称,然后再载入脚本

<canvas class = "webgl"></canvas>

我们可以使用带一个参数的WebGLRenderer类来创建渲染器:参数为一个包含所有选项的对象{}。这里只需要canvas属性,来对应到刚刚添加到页面上的<canvas>标签。

在代码的开头,创建一个canvas变量,然后使用document.querySelector()来获取并存储它。

把画布分配到一个变量的好处,我们稍后进行讨论。

还可以通过setSize()的方法来更新渲染器的大小,传入的参数就是前面创建的sizes。

setSize()方法会据此自动调整<canvas>的大小。

//分配<canvas>到变量

// Canvasconst canvas = document.querySelector('canvas.webgl')

// ...

// 创建渲染器

const renderer = new THREE.WebGLRenderer({

    canvas: canvas

})

renderer.setSize(sizes.width, sizes.height)

此时刷新页面,会看到一个大小为800x600的黑色画布。

第一次渲染

调用渲染器的render()方法,并将scene和camera作为参数传入

renderer.render(scene,camera)

此时画面有变化吗?

问题出在这:现在既未定义对象的位置,也未定义相机的位置。两者都在默认位置,即在场景的中心,而且,在物体的内部是无法看到物体的。

这就需要挪动它们。

移动它们,就需要访问每个对象的多个属性,比如position位置、rotation旋转和scale缩放。当下,使用position位置属性,将相机向后移动。

position位置属性是一个具有三个相关属性的对象:x、y、z。其中z负责向前和向后的轴向移动。

要将相机向后移动,需要给这个属性一个正值。这个操作可以放在代码的任意位置,但是要放在创建camera变量后,实施渲染之前

const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)

camera.position.z = 3

scene.add(camera)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容