WebGL是一项利用JavaScript API呈现3D计算机图形的技术,其原生API灵活且高性能,但是这些优点的代价就是入门困难,在后续文章我会慢慢和大家分享我学习WebGL的感悟和心得。three.js是一个封装了WebGL API的轻量级库,官方称是其为傻瓜而生的(难道我连傻瓜都不如么……,学习起来略吃力丫)。本文将通过介绍使用three.js在浏览器里渲染一只旋转的九尾妖狐模型引导大家入门three.js。

目标读者

熟悉javascript,无图形编程经验的开发人员。

示例下载

示例的源代码,模型,纹理都可以在这里下载(访问密码58a5)。

效果预览

gif录制设置为10帧/s,实际效果更流畅。

获取模型和纹理文件

本小节可跳过,如果你的电脑上没有安装英雄联盟,maya,photoshop的话……
如果你天生爱折腾,那么我们一步一步来获取英雄联盟游戏里英雄的模型和纹理吧。
  1. 打开英雄联盟安装目录,比如C:/Program Files/腾讯游戏/英雄联盟体验服,打开目录下的Game文件夹,里面你会发现很多压缩包,所有英雄的模型和纹理就在这些压缩包里。比如本文使用的是九尾妖狐模型是CharacterSkins.zip解压后的DATA/Characters/Ahri/Skins/Skin04/Ahri_Skin04.skn文件,而纹理是CharacterTextures.zip解压后的DATA/Characters/ahri/skins/skin04/Ahri_Skin04_TX_CM.dds。如果你想提取其他英雄的,可以到其他相似的路径里寻找。好,现在你已经找到了skn和dds文件,把它们拷贝到你喜欢的文件夹里去。
  2. 点击这个链接下载maya插件riotfiletranslator。这个插件允许你将skn格式文件导入到maya中去。如果你安装的是maya2014,或许你应该使用这个链接来下载插件。
  3. 如果你安装的是maya2011~2013,解压压缩包,将MayaFolder里的icons和scripts文件夹复制到maya安装目录下。将plugin文件夹里和你版本相符的mll文件复制到maya安装目录下的bin/plug-ins里。打开maya,点击菜单栏里的窗口——设置/首选项——插件管理器,将riotfiletranslator.mll和objExport.mll的已加载和自动加载勾选起来。
  4. maya菜单栏点击文件——导入,导入你喜欢英雄的skn文件。将状态栏上的模块选择器修改为多边形模块。选中你的模型,菜单栏点击法线——反向。OK,现在可以导出你的模型了。选中你的模型,菜单栏点击文件——导出当前选择,文件名随意,文件格式改为OBJexport,可以保存了。
  5. 点击这个链接(32位)或这个链接(64位)下载并安装photoshop插件NVIDIA Texture Tools。这个插件允许你将dds格式文件导入到ps中去。用ps打开你喜欢英雄的dds文件,将图像大小修改为2048px*2048px。最后将图像导出为jpg格式。

如果你坚持完成了以上步骤,恭喜你,你获得了你喜欢英雄的obj模型文件和jpg图像纹理。如果你懒的动手,示例下载里已经包含了九尾妖狐的模型和纹理。

three.js伪入门

为了能显示出物体,three.js需要三种东西:场景(scene),摄像机(camera)和渲染器(renderer)(或许这就是three.js名称的由来,谁知道呢)。创建了场景后你就可以往场景里添加物品,比如在场景里放一个白炽灯(点光源),放一个箱子(由六面网格构成),然后由摄像机实时记录,最后渲染器渲染出摄像机拍下的画面。
下面我们来看看怎么让九尾妖狐显现在我们的浏览器里。
        //在形成完整的DOM树后触发函数addEventListener("DOMContentLoaded", function () {//创建场景var scene = new THREE.Scene(),//创建透视摄像机,参数分别代表视场角,屏幕宽高比,视锥近截面,视锥远截面camera = new THREE.PerspectiveCamera(45, innerWidth / innerHeight, 1, 2000),//创建渲染器renderer = new THREE.WebGLRenderer(),//创建纹理texture = new THREE.Texture(),//创建环境光,参数为十六进制的颜色ambientLight = new THREE.AmbientLight(0xaaaaaa),//创建定向光源,参数为十六进制的颜色directionalLight = new THREE.DirectionalLight(0xffeedd),imgURL = "ahri.jpg",objURL = "ahri.obj",obj = null;//将摄像机向z轴(屏幕外)移动260camera.position.z = 260;//设置视口大小renderer.setSize(innerWidth, innerHeight);//指定定向光源由z正半轴射向原点(平行光从屏幕外射向屏幕中心)directionalLight.position.set(0, 0, 1);//承诺在图片纹理和模型加载完后调用函数,values[0]为图片对象,values[1]为模型对象Promise.all([loadImage(), loadObject()]).then(function (values) {//指定纹理使用的图片texture.image = values[0];//纹理在创建后发生了改变(由上一语句引发),必须设置needsUpdate属性为truetexture.needsUpdate = true;obj = values[1];//遍历模型对象的属性,指定纹理obj.traverse(function (child) {if (child instanceof THREE.Mesh) {child.material.map = texture;}});//将模型下移一些,使其能居中obj.position.y = -70;//将模型,环境光,定向光源添加入场景scene.add(obj);scene.add(ambientLight);scene.add(directionalLight);document.body.appendChild(renderer.domElement);//开始渲染render();function render() {//高性能循环渲染requestAnimationFrame(render);//每次渲染前将模型沿Y轴旋转0.05obj.rotation.y += 0.05;//渲染renderer.render(scene, camera);}});//图片加载函数function loadImage() {//承诺加载完成后返回图片对象return new Promise(function (resolve) {new THREE.ImageLoader().load(imgURL, resolve);});}//模型加载函数function loadObject() {//承诺加载完成后返回模型对象return new Promise(function (resolve) {new THREE.OBJLoader().load(objURL, resolve);});}});
或许你可以这么想象,在一个漆黑的夜里,阿狸在山上冷得在不停的转圈,月亮刚爬上山头,月光从正前方照亮阿狸……
好吧,以上都是我无聊的想象。你可以下载示例然后在chrome浏览器里观看。如果你有任何疑问或发现错误请在下面留言评论。如果你从中受益请期待博主的webgl系列,下个webgl系列文章将不使用three.js,从webgl基础说起……

three.js伪入门教程之旋转的九尾妖狐相关推荐

  1. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集

    点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 嘿,大家好,截止今天咸鱼零零散散分享爬虫.数据分析基础和 Web 的内容已 ...

  2. 在DX12中使用imgui 入门教程 立方体旋转+改变背景颜色

    入门imgui第一天,把遇到的问题和参考两位大佬写的教程,总结了一下,写了下来,若有错误欢迎指正 参考文章: [记录]DirectX12 添加ImGui组件 - 知乎 (zhihu.com) Dire ...

  3. 没编程基础学习JS的入门教程

     JavaScript教程网为没有编程基础的人员写一个适合他们的教程,JS入门基本教程(适合没编程基础新手). 将JavaScript 插入网页的方法 使用 <script>标签在网页 ...

  4. doodoo.js快速入门教程

    快速入门 我们通过3步演示如何快速创建一个doodoo项目 第一步 # 创建doodoo-demo目录 mkdir doodoo-demo && cd doodoo-demo# 初始化 ...

  5. doodoo.js快速入门教程 1

    快速入门 我们通过3步演示如何快速创建一个doodoo项目 第一步 # 创建doodoo-demo目录 mkdir doodoo-demo && cd doodoo-demo# 初始化 ...

  6. JS详细入门教程(上)

    首先,我们看一下DOM级别和兼容性: 之前好像在某本上看到说DOM有0级,实际上,DOM0级标准是不存在的.DOM有1.2.3三个级别.DOM1级由两个模块组成(DOM Core和DOM HTML), ...

  7. java swt 菜鸟教程_编程基础学习JS的入门教程

    将JavaScript 插入网页的方法 使用 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的...就是代码的内容.Jav ...

  8. 【全开源+免费更新】doodoo.js快速入门教程

    简介 ​ Doodoo.js -- 中文最佳实践Node.js快速开发框架.支持Koa.js, Express.js中间件,支持模块机制,插件机制,钩子机制,让开发 Node.js 项目更加简单.高效 ...

  9. 【全开源+免费更新】doodoo.js快速入门教程 1

    简介 ​ Doodoo.js -- 中文最佳实践Node.js快速开发框架.支持Koa.js, Express.js中间件,支持模块机制,插件机制,钩子机制,让开发 Node.js 项目更加简单.高效 ...

最新文章

  1. Linux 工具进阶
  2. python 怎么将数组转为列表_图片转换成pdf格式怎么操作?什么软件能将图片转为pdf?...
  3. ResultSet转List
  4. php命名空间规则解析及高级功能,PHP命名空间解析规则
  5. 由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析
  6. iview table后端分页 多选 翻页选中回显
  7. eclispe修改project Explorer字体大小
  8. 柱状图中xy轴怎么出现_如果制砂机设备在工作中出现堵料现象该怎么办?
  9. 初学C语言没有项目练手怎么行,这17个小项目收下不谢
  10. fatal error C1083: Cannot open include file: 'iostream.h': No such file or dire
  11. security工作笔记009---spring security BCryptPasswordEncoder加密解密,不错的随机盐,不错的加密解密方法
  12. 开源 微软 语音识别_能用嘴,绝不动手!支持跨屏的语音输入法,它来了!
  13. 'tensorflow' has no attribute 'sub'
  14. mysql连接外部数据库名字错误_数据库连接出错! 可能出错原因:数据库位置或名称不对、数据库损坏!...
  15. Matlab2018破解方法
  16. 启动程序时提示缺少mfc.dll
  17. 传智播客大型人才招聘会成功举行
  18. 个人电脑php网站搭建,如何在本地电脑搭建自己网站的流程(图文教程)
  19. yarn : 无法加载文件 ...Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本
  20. 6月最新兼容15.0系统ipa重签名工具(win+mac)免费

热门文章

  1. 违章查询源码 php,php车辆违章查询数据详解
  2. Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图
  3. 第十届数学建模新生杯比赛(A题)
  4. dnf搬砖无盘服务器有什么要求,作为DNF资深搬砖党,这些搬砖常识你应该清楚
  5. 双核心校园网规划与设计
  6. 985女程序员,京东工作半年薪资9k却离职,网友:缺男票不?
  7. 支付宝支付成功异步回调验签以及注意事项(附源码)
  8. 动画效果(一)-渐变动画
  9. use of undefined constant php assumed php,php程序语言中出现:Use of undefined constant H - assumed 'H'...
  10. Springboot旅游社交平台9k9sq计算机毕业设计-课程设计-期末作业-毕设程序代做