「和我一起学 XXX」是我 2023 年的一个新企划,目的是向读者(也包括未来的自己)介绍我正在学习的某项新技术。文章会通过长期反复迭代的方式保持其内容的新鲜度。文章有较大内容更新时,会在文章开头进行更新时间说明(由于时间精力有限,更新的内容只能保障少数几个平台的同步,请见谅)。
Three.js 是一个基于 WebGL 的 3D JavaScript 开源库(遵循 MIT 协议),它使 JavaScript 开发者能够更方便地在 Web 应用中创建 3D 场景。
请注意该定义的如下部分:
您可以在 Three.js 官网发现丰富的案例,它们从不同方面展示了 Three.js 的魅力和强大!
在了解 Three.js 是什么后,若选择继续学习,想必您有自己的理由。对于我而言,学习 Three.js 的主要动机是「好玩」(Just for fun!)。
我觉得能够在显示器上渲染 3D 场景是件很酷的事情,特别是它还可以通过 VR 头显设备让人们身临其境体验到一个由我创造的虚拟世界!
无论您学习的动机是否与我相同,都欢迎您和我一起持续探索 Web 3D 世界。我有信心带您一起踏入 3D 世界的大门!
在 Three.js 的官方文档中,您可以看到一个简单的 Three.js 应用包含了哪些模块:
您可以看到,图中包含了「渲染器(Renderer)」,「场景(Scene)」,「摄影机(Camera)」,「网状物(Mesh)」,「3D 对象(Object3D)」,「灯光(Light)」,「几何体
(Geometry)」,「材质(Material)」和「纹理(Texture)」等元素,如果您从未接触过 Web 3D 世界,您可能有点摸不着头脑。
但是别担心,通过阅读本系列文章,您将能够掌握绝对大多数内容,并了解它们之间的关系。在往后的篇幅中,我将一一介绍这些名词并介绍它们对于构建 Web 3D 场景的意义所在,以及您应该如何正确地使用它们。通过完全掌握这些概念,您应该能够自己实现任意简单的 3D 场景。
我发现很多文章专注于介绍某种 3D 场景具体如何搭建,在本系列文章中,我不会这么做,我倾向于采用一种「自顶向下」的方法,让您理解到 Web 3D 世界的每个构成要素,然后您便能通过自由组合这些要素,搭建任意您感兴趣的 3D 场景。
因此接下来,本系列文章将会分为如下几个部分向您介绍 Three.js 技术的基本元素:
⚠️ 文章具体内容可能会根据实际情况有所增减。
本章将介绍搭建 Web 3D 场景的必备要素(包含场景,物体与动画)和基本原理,通过本章的学习,您应该有能力开发出一个基本的 3D 场景,它类似于 Web 3D 世界的 Hello World,标志您正式踏入 Web 3D 世界。
本章将介绍 Three.js 提供的多个几何体元素以及它们的特性。它们将是未来您构建的各类 3D 场景中的主角。
摄影机的种类和位置不仅决定了我们观察 3D 世界的方式,也决定了物体的光影和色彩该如何被 GPU 渲染,本章我们将了解 Three.js 提供的摄影机种类以及如何操作它们。
本章将介绍「纹理」这个概念,您可以将他理解为「贴图」,通过恰当地使用纹理,您可以让您的几何体成为具象的现实物体。
本章将介绍「材质」,即讨论物体的每个可见像素应该被如何着色的问题,通过掌握物体材质的设置方法,您的 3D 物体将会配合光影产生更加逼真的效果。
通过掌握「纹理」和「材质」,您能将您抽象的几何体具象化为具体的,我们所熟悉的对象。但是要让这些对象更加符合人的认知,更加「真实」和「立体」,实际上需要模拟现实的光照环境以及物体对光线的反应,这是本章将要讨论的主题。
? 本章内容将根据其他已发布文章的阅读情况决定是否更新。当前不保证出现在系列中。
物体对光照的反应表现为物体的「阴影」和「投影」,Three.js 提供了简单但并不完美的方法让开发者能够让物体的阴影和投影尽可能贴近现实,本章中我们将深入了解其中的内容。
? 本章内容将根据其他已发布文章的阅读情况决定是否更新。当前不保证出现在系列中。
以上,是「和我一起学【Three.js】『初级篇』」这一企划中计划包含的内容,除后续两章外,除非我有更有意思的内容想要发表,我会尽量维持一周一篇的更新频率。希望得到各位读者的监督和关注。
您可能会好奇标题中「初级篇」的含义,没错,无论是对于 Web 3D 世界还是 Three.js 而言,掌握初级篇的内容仅仅算是入门,如果您选择继续探索,前方还为您保留了更广阔的天地,例如:
不过这些都是后话了,万丈高楼平地起,请先跟随我一同完成本阶段的学习吧,这将是一段漫长的旅程,希望您旅途愉快 ?。
想要通过本系列文章入门 Three.js 技术,您需要确保您熟悉 JavaScript 语言,并能够理解例如 Babel,Vite,Webpack 之类的打包工具如何使用。
文章会包含「基础概念讲解」和「代码示例」两个部分,希望您不仅阅读文章,还能够积极地动手实践。
我十分鼓励您通过各类平台展示您的学习成果,分享您的学习经验。如果本系列文章为您提供了切实的帮助,我也希望您愿意积极附上文章链接,让更多的人受益。
如何检验您是否真正入门 Three.js 呢?通过阅读完本系列文章,您应该能够独立搭建一个如下的 3D 场景(这个例子引用了 Bruno Simon 在 three.js journey 课堂中的一个示例,因为我觉得它能够让您充分利用之前所学)
⚠️ 注意:未来该案例有可能会被替换。
欢迎您在评论区与大家交流讨论。
在本篇文章中,我向您介绍了什么是 Three.js 以及本系列文章将如何带您步入 Web 3D 世界的大门。不知道您是否对此旅途充满期待?希望您保持关注,欢迎您在评论区与我交流。
您有很多方式可以表达您喜欢这篇文章,并愿意支持我持续创作,例如:
无论您选择哪一项,我都会因为您的欣赏而感到愉悦。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
让我们计算MRI范围内的类别:defcount_classesObjectSpace.count_objects[:T_CLASS]endk=count_classes用类方法定义类:classAdefself.foonilendend然后运行:putscount_classes-k#=>3请解释一下,为什么是三个? 最佳答案 查看MRI代码,每次你创建一个Class时,在Ruby中它是Class类型的对象,ruby会自动为这个新类创建“元类”类,这是另一个单例类型的Class对象。C函数调用(class.c)是:rb_define
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
我有一个Rails应用程序,我正在尝试使用acts_as_list插件设置可排序列表。数据库中的位置字段正在更新,但是在呈现页面时,不考虑顺序。我想我是在寻求帮助。这是我的模型...classQuestionMembership:question_membershipsendclassQuestion:question_membershipsacts_as_listend还有给我列表的草率View代码...>true)%>拖放用于重新排序。数据库中QuestionMembership对象的位置值更新,页面实际上正确显示重新排序。问题是在页面重新加载时,它默认返回到它感觉的任何顺序。我认
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每