首页 > 其他分享 >three.js学习 -- 在three.js中引入obj文件

three.js学习 -- 在three.js中引入obj文件

时间:2022-09-01 21:34:06浏览次数:56  
标签:const three js obj new import OBJLoader

在引入obj文件前确保自己已经完成three.js的初始化(初始化scene,camera,renderer)

接着将所需要展示的obj文件放在项目中

根据官方文档中的描述

const loader = new OBJLoader();
loader.load(
     './obj/file.obj',
     function(object){
         scene.add(object);
     },
    //显示模型加载进度
     function(xhr){
         console.log((xhr.loaded / xhr.total*100)+'%loaded');
     },
     function(error){
         console.log('happend');
     }
 )

官方文档的前提是他已经正确引入了所有依赖,因此我们这里引入依赖

<script src="./node_modules/three/build/three.js"></script>
<script type="module">
    import {OBJLoader}  from "./node_modules/three/examples/jsm/loaders/OBJLoader.js"
    ....
</script>

引入依赖后运行可能会有报错,以下是我遇到的报错问题:

1、

Uncaught SyntaxError: ambiguous indirect export: default

//语法问题,es6的import导出要使用 {}进行包含
import {OBJLoader}  from "./node_modules/three/examples/jsm/loaders/OBJLoader.js"

2、

Uncaught SyntaxError: import declarations may only appear at top level of a module

静态的 import 语句用于导入由另一个模块导出的绑定。导入的模块时刻执行在严格模式下。在浏览器中/html文件中,import语句 只能在type=“module”的script标签中使用,因此要在script标签中添加type

<script type="module">
	....
</script>

动态import不依赖type=“module” 的script标签

3、

Uncaught TypeError: 解析模块说明符“three”时出错。相对模块说明符必须以“./”、 “../”或 “/”开头

正常引入时出现错误,发现是three.js用到的OBJLoader.js文件中的import问题,如下,我这里直接修改了官方的源码引用部分

import {
	EventDispatcher,
	MOUSE,
	Quaternion,
	Spherical,
	TOUCH,
	Vector2,
	Vector3
} from 'three';
//这里three有问题,更改成three.module.js的路径
from '/node_modules/three/build/three.module.js'

4、

已拦截跨源请求:同源策略禁止读取位于 file:///D:/%E9%A1%B9%E7%9B%AE/three/node_modules/three/examples/jsm/loaders/OBJLoader.js 的远程资源。

当在vscode中不经意右键使用 open in default brower 时,vscode将在浏览器中使用文件协议直接打开我们的html文件,可是cors不支持此协议,因此报错。

跨源请求只支持: http, data, chrome, chrome-extension, https.

在vscode中安装插件后使用右键 open with live server即可

5、

THREE.OrbitControls is not a constructor

three.js更新飞快,官方文档中的代码有时候跟不上,这里错误使用了THREE.OrbitControls,应该改为OrbitControls

const controls = new THREE.OrbitControls(camera,renderer.domElement);
//同理还有
const loader = new THREE.OBJLoader();

--去除THREE即可
 const controls = new OrbitControls(camera,renderer.domElement);
const loader = new OBJLoader();

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            margin: 0;
        }
    </style>
</head>
<body>
    <script src="./node_modules/three/build/three.js"></script>
   <script type="module">
import {OBJLoader}  from "./node_modules/three/examples/jsm/loaders/OBJLoader.js"
import  {OrbitControls}  from "./node_modules/three/examples/jsm/controls/OrbitControls.js";
import {MTLLoader} from "./node_modules/three/examples/jsm/loaders/MTLLoader.js"
 const scene = new THREE.Scene();
 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

 const renderer = new THREE.WebGLRenderer();
 renderer.setSize( window.innerWidth, window.innerHeight );
 //domElement canvas对象
 document.body.appendChild( renderer.domElement );
 const loader = new OBJLoader();
 const mtlLoader = new MTLLoader();
  mtlLoader.load('./obj/test1.mtl',(mtl)=>{
    mtl.preload();
 loader.setMaterials(mtl);
   loader.load('./obj/textured_output.obj', (root) => {
      scene.add(root);
  });
 })
 camera.position.z = 5;//因此移动相机

 const point = new THREE.PointLight(0xffffff);
 point.position.set(400,400,400);
 scene.add(point)

 const ambient = new THREE.AmbientLight(0x444444);
 scene.add(ambient)
 renderer.setClearColor(0xb9d3ff,1);

 function animate(){
     requestAnimationFrame(animate);  //向浏览器发起一个执行某函数的请求, 什么时候会执行由浏览器决定,一般默认保持60FPS的频率
     renderer.render(scene,camera); //每次渲染出一幅图像
 }
 animate();

 const controls = new OrbitControls(camera,renderer.domElement);
// controls.addEventListener('change',render); //当使用requestAnimationFrame时,没必要在通过controls.addEventListener('change', render)监听鼠标事件调用渲染函数

   </script>
</body>
</html>

标签:const,three,js,obj,new,import,OBJLoader
From: https://www.cnblogs.com/ioname/p/16647898.html

相关文章

  • 【js】for 循环中使用 setTimeout 的问题
    问题:下面代码的输出结果不是间隔3秒依次输出1,2,3,4,5。而是隔了3秒连续输出6。这是为什么呢?for(vari=1;i<=5;i++){setTimeout(functiontimer(){......
  • native <-互相调用-> js
    WebViewWebView提供了这些方法-提供了这些方法```addJavascriptInterfacecanGoBackcanGoBackOrForwardcanGoForwardcapturePictureclearCacheclearFormData......
  • 2022-8-31 jsp el表达式
    jsp<%--JSP脚本片段:用于在JSP页面写java代码--%>注意:1、JSP脚本片段中只能出现java代码,不能出现HTML元素。在 访问JSP时,JSP引擎翻译JSP页面中的......
  • 【js与native通信】1 通信协议制定
    通过native<-互相调用->js知道WebView有一个方法setWebChromeClient,可以设置WebChromeClient对象。而WebChromeClient对象中有三个方法,分别是onJsAlert......
  • js 实现冒泡排序及优化方案
    //冒泡排序//原理就是每一轮循环,将一个最大的值放冒泡到最后//1.每一趟都是比较相邻两个元素,如果后一个元素大于前一个,则交换两个元素//2.第一趟从第一个元素开始......
  • 人均瑞数系列,瑞数 5 代 JS 逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切......
  • JS 事件盘点
    1.鼠标事件鼠标在元素上移动mousemove鼠标从该元素上移出mouseout鼠标移动到该元素mouseover鼠标点击(单击)click鼠标双击dbclick鼠标右击contextmenu可以配......
  • 生成二维码并以图片格式下载-qrcodejs2
    1、安装qrcodejs2npminstallqrcodejs2--save2、在需要的页面引入importQRCodefrom"qrcodejs2";3、页面中使用<divid="qrcode"ref="qrcode"></div>4......
  • 使用 kubectl patch 修改 Kubernetes objects
    为了能够修改Kubernetes对象,我们可以使用kubectledit以交互方式进行修改。如果我们需要测试值,它可以派上用场,但它使自动化变得更加困难。如果我们需要一种使用非交互式命......
  • Flask 学习-31.flask_jwt_extended 验证token四种方headers/cookies/json/query_stri
    前言用户携带授权token访问时,其jwt的所处位置列表,默认是在请求头部headers中验证。可以通过JWT_TOKEN_LOCATION进行全局配置,设置token是在请求头部,还是cookies,还是json,......