VR 效果 前端使用 three.js 加载 Obj,drc文件(三维模型文件)

48 篇文章 2 订阅
22 篇文章 0 订阅

VR 效果 前端使用 three.js 加载 Obj(三维模型文件)

前言:我对 three.js 并不熟!只是朋友有这个需求,写了几个 demo 运行,能看~。如果想深入学习,还需要多看看官方文档,这里只做个记录,学习难度:仅供入门学习

下面的 demo 其实都是网上大神的代码,我只是收集,拼凑显示了出来 ~代码我已经全部放在码云了。想要源文件的可以到码云下载 ~ demoVR-three-demo 。文件夹里面准备了有 3 个模型,都可以自己改着路径玩玩~

在线预览地址

obj 文件类型

drc 文件类型

three.js 显示 obj 文件

  • 引入需要的 JS 资源。都是 three 的文件
<script src="js/three.min.js"></script>
<script src="js/OrbitControls.js"></script>
<script src="js/OBJLoader.js"></script>
<script src="js/MTLLoader.js"></script>
<script src="js/jQuery-2.1.4.min.js"></script>
  • 然后下面这段 JS。就是初始化一些插件(three)

  • MTLLoader 这个是用来渲染 3D 模型的材质的,就像 demo1 中的车模型,如果不用材质的话,整台车都是白色的

  • OBJLoader 这个就是主角了。用于渲染.obj 文件的

  • Scene,PerspectiveCamera,AmbientLight,WebGLRenderer 这些把,原谅我也只是个入门新手,不懂,哈哈哈哈 😃 不过大概的意思就是说创建光源,创建视角的角度,感兴趣的可以看下文档~

  • loadModel 这个方法就是开始渲染的了,前面的代码都相当于在搭建环境,在这个方法里面先加载了模型的皮肤(材质太难听了,就称之为皮肤把)。然后在加载 obj 文件,把皮肤附在 obj(原型上) 注意这里是 2 个文件 一个是 humvee.obj原型文件,另一个是 humvee.mtl(皮肤)

  • 这段代码是没有 html 标签的,因为用的 canvas 渲染,canvas 都是用 document.body…动态插入的可以看下代码库中的 demo-1-objfile文件就懂了

<script>
  var mtlLoader = new THREE.MTLLoader()
  var objLoader = new THREE.OBJLoader()

  var scene = new THREE.Scene()
  var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 10000)
  camera.position.set(0, 500, 500)

  var renderer = new THREE.WebGLRenderer({ antialias: true })
  renderer.setSize(window.innerWidth, window.innerHeight)
  renderer.setClearColor(0x177fb3, 1)
  document.body.appendChild(renderer.domElement)

  var lightAm = new THREE.AmbientLight('#DFDFDF', 1)
  scene.add(lightAm)

  var lightDirect = new THREE.DirectionalLight(0xffffff, 0.6)
  lightDirect.position.set(50, 200, -50)
  scene.add(lightDirect)

  var controls = new THREE.OrbitControls(camera, renderer.domElement)

  loadModel('obj/humvee/', 'humvee', { x: 0, y: 0, z: 0 })
  render()

  function render() {
    requestAnimationFrame(render)
    renderer.render(scene, camera)
  }
  function loadModel(folder, name, position) {
    mtlLoader.setBaseUrl(folder)
    mtlLoader.setPath(folder)
    mtlLoader.load(name + '.mtl', function (materials) {
      objLoader.setMaterials(materials)
      objLoader.load(folder + name + '.obj', function (object) {
        object.position.set(position.x, position.y, position.z)
        object.rotateX(-Math.PI / 2)
        scene.add(object)
      })
    })
  }
</script>

drc 文件的渲染

前面讲到了 obj 文件。可以看到我第一个 demo 的文件还算比较小(5MB 左右)。可是稍微大点的模型加载就非常久了!

于是我们用到了谷歌爸爸的的开源插件 draco 来进行压缩,压缩完成后便是 drc文件了! 对于 draco 下面会讲到

先说渲染:

有个明显的缺陷:无法加载皮肤!(mtl)文件 反正我是折腾了很久,没找到

和 obj 文件不一样的是,他的加载需要用到

<script src="js/three.min.js"></script>
<!-- 不同的地方 -->
<script src="js/DRACOLoader.js"></script>
<script src="js/draco_decoder.js"></script>
<script src="js/OrbitControls.js"></script>
<!-- MTL我试过,没成功~成功的小伙伴可以分享给我 -->
<script src="js/MTLLoader.js"></script>

代码就不贴了。到码云下载把~


下载了码云的代码,打开 index.html 是空白啊!

由于 obj 文件的特殊性,反正各种原因,需要自己跑服务来查看。nginx 了解下?
对于前端来说,可能 nginx 有点陌生,不过 nginx 也算是开发的基础技能了。

nginx 劝退?不要急,那我们以前端的方式来打开!

  • 安装 http-server
  • 运行文件

node 命令应该懂了把,他是一个 node 库,用于实现基础的站点。打开本地的端口的

npm install -g http-server

# 在项目目录中,比如在 demoVR-three-demo/demo-1-objfile中运行这句命令
http-serve -p 8080 ./

# http-server 就是说运行一个本地服务
# -p 8080 指定 8080端口
# ./ 指定运行目录,因为运行后,他会自动找到 index.html 如果没找到那就是404了。如果没有 index.html 那么可以在服务跑起来后 127.0.0.1:8080/你的文件名这样也行

注意看我的示例链接:http://jioho.gitee.io/vr-three-demovr-three-demo/demo-2-drcfile/ 我是在 demoVR-three-demo 文件夹跑得服务,所以后面还得指定是 demo-2-drcfile

言传有点难懂,自己运行一次比听 100 次强

重头戏!draco 的使用

  • window 下,需要 vsstudio 来构建项目,我就没那环境了。不过我找到了一个已经构建好的~,不想折腾的可以直接下载

【window 环境】已经编译的 draco

把 obj 文件可拷贝进来,然后运行:

./draco_encoder -i testdata/360.obj -o testdata/360.obj.drc
  • -i 执行压缩命令
  • -o 指定输出的目录和文件名(默认可以不填,不填就是原文件名.obj.drc)

我的 2 个文件,一个 1.4G,压缩到了 500mb | 另外一个 5MB。压缩到了 130KB(就是车子的模型,可以看下 demo-1 和 demo-2 的区别。在码云上都有)


  • Linux 下,之前在 window 装 wsl。可算是派上用场,想在 window 下不用虚拟机直接体验 linux 的可以看我 win10 安装 Ubuntu 和 Windows Terminal 一系列文章。毕竟生命在于折腾 😃

github - draco 谷歌爸爸出品,必属精品啊

draco 的依赖:
draco 需要 cmark 编译
cmark 需要 OpenSSL
我忘记了哪里,还需要 gcc+ 毕竟编译器都要用嘛

# 基础的gcc+先装
apt-get install gcc+

如果是要下载的话,直接下载 https://github.com/google/draco/archive/1.3.6.tar.gz 这个链接的把

#个人建议 先建一个 draco 目录(我是在 /usr/local/software/  software是自创目录了)
mkdir draco

cd draco

# 注意是在linux环境下载,下载到你们自己放软件的目录去
wget https://github.com/google/draco/archive/1.3.6.tar.gz

# 解压。解压后就可以看到 draco-1.3.6 文件夹了
tar zxvf 1.3.6.tar.gz

# 在创建一个编译后的文件夹,和 draco-1.3.6 同级
mkdir draco-build

我的文件目录一开始不懂事,改了名字,影响不大哈,你们正常应该是 draco-1.3.6draco-build

开始编译源码(这个需要 CMark 环境才能编译)
安装 CMark 因为我的是 ubuntu。所以可以直接用 apt 下载

sudo apt -y install cmake

可以看到的是,下载失败,😦 因为这个包需要科学上网!。那我们就手动编译 cmark

打开 CMark 官网

复制链接,回到我的 software 目录

# 等待下载完成
wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1.tar.gz

tar zxvf  cmake-3.17.1.tar.gz

# 解压完成,看到 cmake-3.17.1(根据你们版本号来)
cd cmake-3.17.1

# 执行 ./bootstrap
./bootstrap

上面有说到。cmake 依赖OpenSSL。如果没装的话,会看到。
一定要注意报错信息,看下有没有出现 error 之内的字眼,然后看下缺什么库,毕竟每个人的环境都不一样,可能我有的库你们也没装~
我的很明显可以看到 Could Not find OpenSSl 找不到 OpenSSl

# 安装 OpenSSl
apt-get install OpenSSl

# 重新执行 bootstrap
./bootstrap

# 如果一切正常后,执行。因为 make的时候要创建文件的,不想该权限了,直接给sudo执行
sudo make

# 完成后在执行一个 make install
sudo make install

通常 make 报错是因为权限不足,无法创建目录,这个自己稍微留意下

折腾那么久。cmark 可算是装上,开始编译 draco

回到 software 目录。进入到 draco 的 draco-build 目录(这是一开始自己手动创建的目录了)

# 我这里执行 draco 是因为我文件夹改过名字
# 没改名字的还是执行 draco-1.3.6
# 而且这是在 build 目录, build和 draco同级才行!
sudo cmake ../draco

# 执行make命令
make

如果一切顺利,draco-build 目录下是这样的,红色圈住的就是我们要的文件了!

draco_encoder 可以将.obj 压缩成.drc
draco_decoder 是可以把 drc 转回 obj 的

我创建了一个 testdata 文件夹
然后把我们的 obj 文件放了进去,运行

./draco_encoder -i testdata/360.obj -o testdata/360.obj.drc
  • -i 执行压缩命令
  • -o 指定输出的目录和文件名(默认可以不填,不填就是原文件名.obj.drc)

可以看到压缩比例非常的高!! 1.4G 压缩成了 500MB

你们看 demo-1 和 demo-2 的模型文件也可以看到,车的模型原大小是 5M。压缩后才 130 多 KB


three 和 draco 折腾到此结束了,看到自己的作品,虽然都是很简单的 demo,可是还是特别有成就感,毕竟这种平时见的不多(是我见得不多,哈哈哈哈)。最起码也是可以运行小 demo,作为一个基础入门学习了~

对于我自己来说,学习一个新技术,让我直接看文档我会崩溃的,我还是比较喜欢做出来一点小东西后在去研究文档

如果想要更加完整,炫酷的效果,的确要多看文档才知道

如果文章有用,可以到下载区下载相关资源,赞助我一些 C 币,最后附上全部的下载链接
VR-three-demo csdn 资源

【window 环境】已经编译的 draco

使用three.js加载.obj和.mtl文件可以通过以下步骤完成: 1. 首先,你需要引入three.js文件,通过在HTML页面中添加如下代码来导入库文件: ``` <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script> ``` 2. 创建一个用于显示3D模型的容器,可以是一个div元素或者canvas元素。例如: ``` <div id="canvas"></div> ``` 3. 在Javascript代码中,创建一个场景(scene)、摄像机(camera)和渲染器(renderer): ``` var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.getElementById("canvas").appendChild(renderer.domElement); ``` 4. 使用OBJLoader加载.obj文件和MTLLoader加载.mtl文件。确保将路径指定为正确的模型文件路径。例如: ``` var objLoader = new THREE.OBJLoader(); var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('model.mtl', function (materials) { materials.preload(); objLoader.setMaterials(materials); objLoader.load('model.obj', function (object) { scene.add(object); }); }); ``` 5. 设置摄像机的位置以及添加光源: ``` camera.position.z = 5; var light = new THREE.PointLight(0xFFFFFF, 1, 100); light.position.set(10, 10, 10); scene.add(light); ``` 6. 创建一个渲染函数,以及在每帧更新场景的方法: ``` function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); ``` 以上代码可以让你使用three.js加载.obj和.mtl文件,并在页面上显示出3D模型。尽量准备好正确路径下的.obj和.mtl文件以及相关的纹理文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值