fastadmin使用three.js,导入xyz的txt文件,展示3D模型

1.安装three.js

bower install three --save  

2.在require-backend.js引入three.js

我是在后台展示所以在require-backend中引入
在这里插入图片描述

3.在需要展示的模块的js文件使用three.js

我是写的接口 使用ajax调用,也可以在控制器中操作文件转为数组,js读取

define(['jquery', 'bootstrap', 'backend', 'addtabs', 'three', 'echarts', 'echarts-theme', 'template'], function ($, undefined, Backend, Datatable, THREE, Echarts, undefined, Template) {
    var Controller = {
        index: function () {
	         $.ajax({
		         //请求方式
		          type: 'POST',
		          //服务器返回的数据类型
		          dataType: 'json',
		          url: 'IP地址/index.php/api/loader/xyz',
		          data: {
		              url: 'IP地址/assets/data/result1.txt',
		          },
		          success: function (data) {
		              var array = data.data.array;
		              var numArray = [];
		              for (let i = 0; i < array.length; i++) {
		                  numArray.push(parseFloat(array[i]))
		
		              }
		              let scene = new THREE.Scene();
		              // 2.第二步:将数组转换成类型化数组
		              const vertices = new Float32Array(numArray)
		              // 3.第三步
		              const geometry = new THREE.BufferGeometry() // 声明一个缓冲几何体对象
		              const pos = new THREE.BufferAttribute(vertices, 3)
		              geometry.attributes.position = pos
		              var material = new THREE.PointsMaterial({
		                  color: 0xff1133,
		                  size: 1.0 //点对象像素尺寸
		              });
		              //点模型对象
		              var points = new THREE.Points(geometry.center(), material);
		              scene.add(points);
		              var onwheelNum = 1
		              const ambientLight = new THREE.AmbientLight(0xffffff, 0.1); // 创建环境光
		              scene.add(ambientLight); // 将环境光添加到场景
		              const spotLight = new THREE.SpotLight(0xffffff); // 创建聚光灯
		              spotLight.position.set(50, 50, 50);
		              spotLight.castShadow = true;
		              scene.add(spotLight);
		              const element = document.getElementById("3dpanel");
		              const width = element.clientWidth; // 窗口宽度
		              const height = element.clientHeight; // 窗口高度
		              const k = width / height; // 窗口宽高比
		              let camera = new THREE.PerspectiveCamera(45, k, 0.1, 1000);
		              camera.position.set(20, 20, 400); // 设置相机位置
		              camera.lookAt(new THREE.Vector3(10, 40, 0)); // 设置相机方向
		              scene.add(camera);
		              let renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
		              renderer.setSize(width, height); // 设置渲染区域尺寸
		              renderer.shadowMap.enabled = true; // 显示阴影
		              renderer.shadowMap.type = THREE.PCFSoftShadowMap;
		              renderer.setClearColor(0x000000, 1); // 设置背景颜色
		              element.appendChild(renderer.domElement);
		              function render() {
		                  renderer.render(scene, camera);
		              }
		              render();
		              element.onwheel = (e) => {
		                  let delta = (e.wheelDelta && (e.wheelDelta > 0 ? 1 : -1))
		                  if (delta > 0) {//放大
		                      onwheelNum += 0.1
		                      points.scale.set(onwheelNum, onwheelNum, onwheelNum);
		                      render();
		                  } else if (delta < 0) {//缩小
		                      onwheelNum -= 0.1
		                      points.scale.set(onwheelNum, onwheelNum, onwheelNum);
		                      render();
		                  }
		              }
		              element.addEventListener('mousedown', onMouseDown, false);
		              element.addEventListener('mouseup', onMouseup, false);
		              var rotateStart;
		              rotateStart = new THREE.Vector2();
		              function onMouseDown(event) {
		                  event.preventDefault();
		                  mouseDown = true;
		                  mouseX = event.clientX;//出发事件时的鼠标指针的水平坐标
		                  mouseY = event.clientY;//出发事件时的鼠标指针的水平坐标
		                  rotateStart.set(event.clientX, event.clientY);
		                  document.addEventListener('mousemove', onMouseMove2, false);
		              }
		              function onMouseup(event) {
		                  mouseDown = false;
		                  document.removeEventListener("mousemove", onMouseMove2);
		              }
		
		              function onMouseMove2(event) {
		                  if (!mouseDown) {
		                      return;
		                  }
		                  var deltaX = event.clientX - mouseX;
		                  var deltaY = event.clientY - mouseY;
		                  mouseX = event.clientX;
		                  mouseY = event.clientY;
		                  rotateScene(deltaX, deltaY);
		              }
		              //设置模型旋转速度,可以根据自己的需要调整
		              function rotateScene(deltaX, deltaY) {
		                  //设置旋转方向和移动方向相反,所以加了个负号
		                  var ydeg = deltaX / 279;
		                  var xdeg = deltaY / 279;
		                  //deg 设置模型旋转的弧度
		                  points.rotation.y += ydeg;
		                  points.rotation.x += xdeg;
		                  render();
		              }
		          },
                  error: function (jqXHR) {
                      //请求失败函数内容
                  }
              })
           }
      	}
      return Controller
});

4.在api下的控制器中创建Loader.php

在这里插入图片描述

5.Loader控制器编写如下

<?php

namespace app\api\controller;
use app\common\controller\Api;

class Loader extends Api
{

    //如果$noNeedLogin为空表示所有接口都需要登录才能请求
    //如果$noNeedRight为空表示所有接口都需要验证权限才能请求
    //如果接口已经设置无需登录,那也就无需鉴权了
    //
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['*'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];

    /**
     * 测试方法
     *
     * @ApiTitle    (接口名字)
     * @ApiSummary  (描述信息)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/loader/xyz/)
     */
    public function xyz()
    {
        $file = $this->request->post("url");

        $content = file_get_contents($file);    //文件内容读入字符串
        if (empty($content)) {
            $this->error('文件内容为空');
        } else {
            $content = mb_convert_encoding($content, 'UTF-8', 'ASCII,UTF-8,GB2312,GBK,BIG5'); //转换字符编码为utf-8
            $content = str_replace("\r\n",",",$content);
            $content = str_replace("\t",",",$content);
            $array = explode(",", $content); //转换成数组
            $this->success('返回成功',['array' => $array]);
        }
    }
}

6.txt文件中的格式

		X          Y          Z
		↓		   ↓		  ↓

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用three.js导入3D动画模型可以通过以下几个步骤完成: 1. 准备模型文件:首先需要准备一个包含有动画模型文件。常见的模型文件格式包括.obj,.fbx,.dae等。可以使用3D建模软件(如Blender、3ds Max等)创建模型并导出为合适的格式。 2. 创建场景:使用three.js创建一个场景,用于显示导入模型。创建一个渲染器,指定渲染目标(可以是画布或者HTML元素),并设置渲染器的尺寸和像素密度。 3. 导入模型使用three.js的加载器来导入模型文件three.js中提供了多种加载器,例如OBJLoader用于.obj格式,FBXLoader用于.fbx格式,ColladaLoader用于.dae格式等。选择合适的加载器并使用它来加载模型文件。 4. 添加动画:当模型文件加载完成后,可以将动画添加到场景中。如果模型文件中包含动画数据,可以使用three.js提供的动画系统来播放动画。根据模型文件的格式和结构,可以使用不同的方式来控制和处理动画。 5. 渲染场景:在动画播放之前,需要在每一帧更新场景和模型的状态,并调用渲染器的渲染方法来显示场景。可以使用requestAnimationFrame函数来创建一个循环,以便在每一帧更新场景状态并渲染。 通过以上步骤,就能够使用three.js导入3D动画模型,并在浏览器中展示和播放模型的动画效果。着重注意导入模型文件格式和对应的加载器,同时根据模型文件的结构来控制和处理动画,以实现预期的效果。 ### 回答2: 要在Three.js导入3D动画模型,我们可以按照以下步骤进行: 首先,我们需要准备一个3D动画模型文件,通常使用的格式是Collada(.dae)、FBX(.fbx)或者glTF(.gltf/.glb)。这些格式可以由3D建模软件(如Blender、Maya)导出。 接下来,我们需要在网页中引入Three.js库,可以通过CDN或者本地引入。在HTML文档的头部添加以下代码: ```html <script src="https://threejs.org/build/three.js"></script> ``` 然后,我们创建一个场景(Scene)对象,一个相机(Camera)对象和一个渲染器(Renderer)对象。 ```javascript var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); ``` 接着,我们使用Three.js提供的加载器(Loader)来加载3D模型文件。以Collada为例,我们可以使用ColladaLoader: ```javascript var loader = new THREE.ColladaLoader(); loader.load('model.dae', function (collada) { var model = collada.scene; // 对模型进行一些调整 model.scale.set(0.1, 0.1, 0.1); scene.add(model); }); ``` 最后,我们需要编写动画循环的逻辑,即在每一帧中更新场景和渲染。 ```javascript function animate() { requestAnimationFrame(animate); // 更新动画 renderer.render(scene, camera); } animate(); ``` 通过以上步骤,我们就可以在网页中成功导入展示3D动画模型了。需要注意的是,具体的加载方式和调整可能因使用3D模型文件格式而有所不同,但基本的原理是相似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值