推荐:将NSDT场景编辑器加入你3D工具链
其他工具系列:https://nsdt.cloud/
下面的代码完整展示了通过three.js引擎创建的一个三维场景,在场景中绘制并渲染了一个立方体的效果,为了大家更好的宏观了解three.js引擎, 尽量使用了一段短小但完整的代码实现一个实际的三维效果图。
刚一开始学习,不需要完全看懂下面的代码,能够修改增删部分代码就可以,随着时间的推移就能够很好的使用三维引擎three.js。
本课程风格和大多数课程风格不同,注意一定要结合案例代码学习,在案例代码的基础上调试体验总结,就像做化学实验一样,不要仅仅阅读文字。
(相关资料图)
在.html文件中引入three.js就像前端经常使用的jquery.js一样引入即可。
<script src="./three.js"></script>我已经把three.js文件上传到了我的博客服务器, 可以通过下面的URL地址去加载。
<script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script>第一个Three.js案例,麻雀虽小,五脏俱全,整体展示了Three.js的整套渲染系统。
第一个three.js文件_WebGL三维场景 <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.js"></script> <script> /** * 创建场景对象Scene */ var scene = new THREE.Scene(); /** * 创建网格模型 */ // var geometry = new THREE.SphereGeometry(60, 40, 40); //创建一个球体几何对象 var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry var material = new THREE.MeshLambertMaterial({ color: 0x0000ff }); //材质对象Material var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh scene.add(mesh); //网格模型添加到场景中 /** * 光源设置 */ //点光源 var point = new THREE.PointLight(0xffffff); point.position.set(400, 200, 300); //点光源位置 scene.add(point); //点光源添加到场景中 //环境光 var ambient = new THREE.AmbientLight(0x444444); scene.add(ambient); // console.log(scene) // console.log(scene.children) /** * 相机设置 */ var width = window.innerWidth; //窗口宽度 var height = window.innerHeight; //窗口高度 var k = width / height; //窗口宽高比 var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 //创建相机对象 var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); camera.position.set(200, 300, 200); //设置相机位置 camera.lookAt(scene.position); //设置相机方向(指向的场景对象) /** * 创建渲染器对象 */ var renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height);//设置渲染区域尺寸 renderer.setClearColor(0xb9d3ff, 1); //设置背景颜色 document.body.appendChild(renderer.domElement); //body元素中插入canvas对象 //执行渲染操作 指定场景、相机作为参数 renderer.render(scene, camera); </script>直接看上面的代码大家可能不太理解,如果是第一次接触会比较陌生,可以尝试更改代码的参数看看有什么效果,代码的功能都有注释, 看着注释也能大概猜出一个参数的含义。通过修改代码,同时刷新浏览器查看效果形成一个互动来提高自己学习的驱动力。
//创建一个立方体几何对象Geometryvar geometry = new THREE.BoxGeometry(100, 100, 100);代码var box=new THREE.BoxGeometry(100,100,100);通过构造函数THREE.BoxGeometry()创建了一个长宽高都是100的立方体,通过构造函数名字BoxGeometry也能猜出这个构造函数的意义,利用new关键字操作构造函数可以创建一个对象, 这都是Javascript语言的基本知识,至于THREE.BoxGeometry()构造函数具体是什么可以不用关心, 就像你使用前端使用JQuery库一样查找官方文档就可以,你可以把代码THREE.BoxGeometry(100,100,100)中的第一个参数更改为为50,刷新浏览器查看数据更改后长方体的效果图,可以看到已经不是长宽高一样的立方体, 而是普通的长方体。
你也可以用下面一段代码代替上面的长方体代码,你会发现会渲染出来一个球体效果。
//创建一个球体几何对象var geometry = new THREE.SphereGeometry(60, 40, 40);代码var material=new THREE.MeshLambertMaterial({color:0x0000ff});通过构造函数THREE.MeshLambertMaterial()创建了一个可以用于立方体的材质对象, 构造函数的参数是一个对象,对象包含了颜色、透明度等属性,本案例中只定义了颜色color,颜色属性值0x0000ff表示蓝色,可以把颜色值改为0x00ff00,可以看到是绿色的立方体效果, 这里使用的颜色值表示方法是16进制RGB三原色模型。使用过渲染类软件、设计过网页或者学习过图形学应该能知道RGB三原色模型,这里就不再详述。
代码var point=new THREE.PointLight(0xffffff);通过构造函数THREE.PointLight()创建了一个点光源对象,参数0xffffff定义的是光照强度, 你可以尝试把参数更改为为0x444444,刷新浏览器你会看到立方体的表面颜色变暗,这很好理解,实际生活中灯光强度变低了,周围的景物自然暗淡,three.js引擎对WebGL光照模型算法都进行了封装,不需要你了解计算机图形学, 可以直接使用调用three.js光源相关API直接创建一个光源对象,就像你使用普通的三维建模渲染软件一样,只是这里多了一个Javascript编程语言而已。
代码var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000);通过构造函数THREE.OrthographicCamera()创建了一个正射投影相机对象, 什么是“正射投影”,什么是“相机对象”,每个人的基础不一样,或许你不太理解,或许你非常理解,如果不清楚还是那句话,刚一开始不用深究,改个参数测试一下看看视觉效果你就会有一定的感性认识。 比如把该构造函数参数中用到的参数s,也就是代码var s = 200;中定义的一个系数,可以把200更改为300,你会发现立方体显示效果变小,这很好理解,相机构造函数的的前四个参数定义的是拍照窗口大小, 就像平时拍照一样,取景范围为大,被拍的人相对背景自然变小了。camera.position.set(200, 300, 200);和camera.lookAt(scene.position);定义的是相机的位置和拍照方向,可以更改camera.position.set(200,300,200);参数重新定义的相机位置,把第一个参数也就是x坐标从200更改为250, 你会发现立方的在屏幕上呈现的角度变了,这就像你生活中拍照人是同一个人,但是你拍照的位置角度不同,显示的效果肯定不同。这些具体的参数细节可以不用管, 至少你知道相机可以缩放显示三维场景、对三维场景的不同角度进行取景显示。
从实际生活中拍照角度或是使用三维渲染软件角度理解本节课的案例代码,立方体网格模型和光照组成了一个虚拟的三维场景,相机对象就像你生活中使用的相机一样可以拍照,只不过一个是拍摄真实的景物,一个是拍摄虚拟的景物,拍摄一个物体的时候相机的位置和角度需要设置,虚拟的相机还需要设置投影方式,当你创建好一个三维场景,相机也设置好,就差一个动作“咔”,通过渲染器就可以执行拍照动作。
从面向对象编程的角度理解上面的程序,使用three.js和使用其它传统前端Javascript库或框架一样,通过框架提供的构造函数可以创建对象,对象拥有方法和属性,只不过three.js是一款3D引擎, 如果你对HTML、Javascript语言、三维建模渲染软件都能够理解应用,即使你不懂计算机图形学和WebGL,也能够学习three.js引擎,创建可以在线预览的三维场景。
案例源码分别使用构造函数THREE.Scene()、THREE.OrthographicCamera()、THREE.WebGLRenderer()创建了场景、相机、渲染器三个最顶层的总对象,然后通过总对象的子对象、方法和属性进行设置, 相机对象和渲染对象相对简单,最复杂的是场景对象,new THREE.Mesh(box,material);使用构造函数Mesh()创建了一个网格模型对象,该对象把上面两行含有顶点位置信息的几何体对象和含有颜色信息的材质对象作为参数,网格模型创建好之后, 需要使用场景对象的方法.add()把三维场景的子对象添加到场景中,new THREE.PointLight(0xffffff);、new THREE.AmbientLight(0x444444);定义了两个点光源、环境光对象,然后作为场景的子对象插入场景中。 场景、相机、渲染器设置完成后,设置代码renderer.render(scene,camera)把场景、相机对象作为渲染器对象方法render()的参数,这句代码的意义相当于告诉浏览器根据相机的放置方式拍摄已经创建好的三维场景对象。
如果你有WebGL基础,可以通过下面介绍了解Three.js对WebGL的封装,如果不了解WebGL或计算机图形学,随便阅读一下或者直接跳过。
从WebGL的角度来看,three.js提供的构造函数基本是对原生WebGL的封装,如果你有了WebGL的基础,在学习three.js的很多对象、方法和属性是很容易理解的。在three.js入门教程中不会去过多讲解WebGL的基础知识, 但是为了大家更好的理解three.js的很多命令,与three.js相关的WebGL API知识、GPU渲染管线的知识。图形学可能很多人会觉得比较难,其实主要是算法部分,大家先可以学习一些基本的WebGL知识,初学的时候尽量不关注算法,主要了解顶点数据处理的过程,GPU渲染管线的基本功能单元。实际的工作中如果不是开发3D引擎可能不会使用原生WebGL API,但是学习了这些之后,对于three.js的深度开发学习很有好处,如果你了解你WebGL知识,可以联系绘制函数drawArrays()来理解渲染器的渲染操作方法render()。
下一篇:Three.js教程:旋转动画、requestAnimationFrame周期性渲染 (mvrlink.com)
Three.js教程:第一个3D场景
推荐:将NSDT场景编辑器加入你3D工具链其他工具系列:https: nsdt cloud 下面的代码完整展示了通过three js引擎创建的一个三维场景,在场景中
今日热文:宝塔实业:中标铁路货车滚动轴承联合采购项目
【宝塔实业:中标铁路货车滚动轴承联合采购项目】宝塔实业(000595)4月12日晚间公告,公司收到国铁物资有限公司发来的中标通知书,确认公司中标
【环球新视野】一年级下册第14课要下雨了生字
一年级下册第14课要下雨了生字
世界热消息:中国石油大庆石化以市场为导向增产石蜡提质增效
中新网黑龙江新闻4月12日电(谢文艳孙立华王继颖)4月11日,一排排洁白整洁的石蜡产品,从大庆石化制蜡联合车间石蜡成
天天快播:通讯:巴西人眼中的中国“绿色能量”——记中国企业助力巴西可持续发展
新华社圣保罗4月11日电 通讯:巴西人眼中的中国“绿色能量”——记中国企业助力巴西可持续发展近年来,来自中国的投资和技术
世界视点!知名女星与网友打官司,一个细节值得关注!
4月11日记者从北京星权律师事务所获悉知名演员张凯丽诉劳某网络侵权责任纠纷案迎来一审判决
Three.js教程:第一个3D场景
推荐:将NSDT场景编辑器加入你3D工具链其他工具系列:https: nsdt cloud 下面的代码完整展示了通过three js引擎创建的一个三维场景,在场景中
【环球聚看点】网传明年上海绿牌蓝牌要合并?上海市经信委主任回应
近日,有自媒体发帖称“明年中旬上海绿牌蓝牌要合并了,后续不再新发绿牌”,还有模有样地提到“相关政策有6个月过渡期,绿牌用户补交牌...
讯息:在火星待一年是啥体验?美建立模拟训练基地
美国航天局4月11日揭幕了位于得克萨斯州休斯敦市的模拟火星训练基地——“火星沙丘阿尔法”。今年夏天,有4名宇航员志愿者将进入这里,...
世界速看:中疾控:流感是2月份报告病例最多的传染病
4月12日,《中国疾控中心周报》发布了我国2月份法定传染病报告病例数和死亡人数。其中,流感是所有法定传染病中病例数最多的,共有240,687例,
天天速读:预计到2023年欧盟猪肉消费量将再降5.9%,达历史新低
受非洲猪瘟和能繁母猪存栏较少影响,2023年欧盟猪肉产量将进一步下降。欧盟对中国猪肉出口的进一步减少,使其总出口量也相应减少。2022年,欧
今日热文:宝塔实业:中标铁路货车滚动轴承联合采购项目
【宝塔实业:中标铁路货车滚动轴承联合采购项目】宝塔实业(000595)4月12日晚间公告,公司收到国铁物资有限公司发来的中标通知书,确认公司中标
焦点讯息:机器狗入职纽约警方 好莱坞电影场景终成现实?
美国纽约市政府与警方4月11日展示多个高科技安全设备,包括Digidog机器狗以及K5自主安保机器人。纽约警方表示,这些设备将用于打击犯罪、维护
新动态:外交部介绍德国外长访华有关情况和期待
4月12日,中国外交部发言人汪文斌主持例行记者会。有记者提问,中方刚发布德国外长贝尔伯克访华消息。中方如何评价当前中德关系?中方对...
短讯!13日起新一轮沙尘来袭 影响15省区市
中央气象台预计,13日至14日,受新一股冷空气影响,北方地区又将自西向东出现一次沙尘天气过程。13日白天,新疆东部和南疆盆地、青海中北部、
今日讯!外交部答Knews:美所谓价值观是谋取私利的幌子
4月12日,中国外交部发言人汪文斌主持例行记者会。东方卫视、看看新闻Knews记者提问,近日有美国媒体报道,在多家社交媒体出现了一批疑似来自
天天热消息:外交部回应美菲发布联合声明:严正关切强烈不满
4月12日,中国外交部发言人汪文斌主持例行记者会。有记者提问,美国国务卿布林肯11日表示,美国和菲律宾将共同应对所谓“胁迫和恫吓”,...
全球信息:国家能源局:预计今年全国最大电力负荷可能超过13.6亿千瓦 较去年有较大增长
国家能源局综合司司长、新闻发言人梁昌新今日在新闻发布会上表示,预计今年全国最大电力负荷可能超过13 6亿千瓦,较去年有较大的增长。据研判
【环球新视野】一年级下册第14课要下雨了生字
一年级下册第14课要下雨了生字
东方甄选派发7.75亿元“红包”,董宇辉或拿到千万
4月11日晚间,东方甄选公告向154名合格参与者(承授人)授出股份奖励3045 9万股。按照东方甄选当天收盘价29港元计算,本次股份奖励总价值约8 8
镑美走势关注美国数据和美联储政策,警惕跌破50日均线风险!
英镑兑美元在漫长的复活节周末从九个月高位回落,但如果美国通胀数据或其他数据令人们对美联储利率周期已接
世界热消息:中国石油大庆石化以市场为导向增产石蜡提质增效
中新网黑龙江新闻4月12日电(谢文艳孙立华王继颖)4月11日,一排排洁白整洁的石蜡产品,从大庆石化制蜡联合车间石蜡成
IMF下调全球经济增长预测至30年来最低
当地时间周二,国际货币基金组织(IMF)下调了2023年全球经济预测,并归因于近期金融市场的波动加剧。从长期五年来看,全球经济增长预计将稳定
世界快消息!俄罗斯希韦卢奇火山喷发 全球气温短期或降0.1℃
俄罗斯远东堪察加半岛海拔3283米的希韦卢奇火山,当地时间11日凌晨发生强烈喷发。火山灰柱高达18千米到20千米。俄罗斯科学院远东分院火山和地
世界今头条!特朗普出庭后首次受访:法院官员哭着向我道歉
据美国福克斯新闻网4月11日报道,美国前总统特朗普在纽约庭审后首次接受了媒体专访,并称法院官员为他登记时,哭着向他说“对不起”。特...
天天速看:美爆10年最大泄密案 白宫敦促记者们"小心报道"
这么巧?美国新“泄密门”被爆监控盟友,传韩国也被美国监控,问题是:就剩十几天,韩国总统尹锡悦就要对美国进行国事访问…但是,这状...
天天简讯:IMF经济增速预测:中国够提气!G20中,英国垫底
国际货币基金组织(IMF)4月11日发布最新《世界经济展望报告》,预计2023年全球经济将增长2 8%,较此前预测下调0 1个百分点;预测2023...
焦点讯息:大相径庭!爱德华兹常规赛最后4场场均可砍29.8分 今日17中3仅9分
今日NBA附加赛,森林狼加时102-108不敌湖人。此役,爱德华兹状态极差,他全场17投仅3中,三分9投全铁,罚球4中3,仅得9分8篮板5助攻1抢断3封盖
环球要闻:IMF:下调今年全球经济增长预测至2.8%
周二,国际货币基金组织(IMF)下调了对全球经济的预期。同时,该组织还预测,尽管存在经济和地缘政治方
天天快播:通讯:巴西人眼中的中国“绿色能量”——记中国企业助力巴西可持续发展
新华社圣保罗4月11日电 通讯:巴西人眼中的中国“绿色能量”——记中国企业助力巴西可持续发展近年来,来自中国的投资和技术
天天最新:纨绔子弟2小说_纨绔子弟2
1、还没呢?早都没更新了还没有的吧!。本文到此分享完毕,希望对大家有所帮助。
世界视点!知名女星与网友打官司,一个细节值得关注!
4月11日记者从北京星权律师事务所获悉知名演员张凯丽诉劳某网络侵权责任纠纷案迎来一审判决
国台办:环台岛演习针对“台独”分裂活动和外部势力干涉,绝非针对台湾同胞
国台办今天(12日)举行例行新闻发布会。对于近日东部战区组织三天环台岛演习,国台办发言人朱凤莲表示,中国人民解放军近期在台海及附...
埃及计划秘密向俄供应4万枚火箭弹?克宫:谣言
据俄罗斯卫星社4月11日报道,俄罗斯总统新闻秘书佩斯科夫表示,有关埃及计划秘密向俄罗斯供应上万火箭弹的报道是谣言。报道称,美国《华...
马斯克将公司Twitter标志"w"涂白,改名"傻笑"?
4月10日,社交媒体平台推特公司CEO埃隆・马斯克发布了一张美国旧金山推特公司招牌的照片,照片中推特(Twitter)一词中的“w”被涂白,...
加息也伤了自己?纽约联储:缩表料持续数年 未来几年亏钱难免
财联社4月12日讯(编辑卞纯)纽约联储周二发布的一份报告称,美联储未来几年将继续缩表过程,即缩减其
【环球聚看点】网传明年上海绿牌蓝牌要合并?上海市经信委主任回应
近日,有自媒体发帖称“明年中旬上...
讯息:在火星待一年是啥体验?美建立模拟训练基地
美国航天局4月11日揭幕了位于得克...
世界速看:中疾控:流感是2月份报告病例最多的传染病
4月12日,《中国疾控中心周报》发...
焦点讯息:机器狗入职纽约警方 好莱坞电影场景终成现实?
美国纽约市政府与警方4月11日展示...
62%受访者对新能源汽车基本了解 汽车“里程焦虑”较为突出
近日,重庆市万州区、开州区、城口...
聚焦!2022年全国“绿色产品认证与标识宣传周”正式启动
9月26日,由市场监管总局主办的202...
昆明市体育中心足球锦标赛落幕 组委会已经在为新赛季做准备
9月18日,全民健身·2021昆明市体...
中安街道种植了100亩万寿菊 每亩产值是种植包谷的两倍多
时下,正是万寿菊收获的季节。走进...