PHP加载3D模型【WebGL】

news2024/11/25 1:07:35

这是另一篇关于如何使用 PHP加载 3D 模型的文章。 在这里,我使用 Laravel 作为后端及其存储。 我在前端使用 Three.Js 库来渲染和显示 3D 模型。 我将向您展示如何上传 3D 模型以及如何从 Laravel 存储加载 3D 模型。 请仔细完成以下步骤。 大家可以在评论区提出任何问题。 在这里,我展示了一条主要路径,然后你可以根据自己的喜好对其进行自定义。

在这里插入图片描述

推荐:使用 NSDT场景设计器 快速搭建 3D场景。

1、创建 Laravel 项目

创建一个新的 Laravel 项目并创建新的模型、视图和控制器。 然后使用下面的命令链接存储。

php artisan storage:link

2、上传 3D 模型

你可以使用 HTML 和 Javascript 创建一个简单的表单。 我使用 Laravel blade文件来构建前端。

<form action="{{ route('model.store') }}" method="POST" id="file-upload" enctype="multipart/form-data">
          @csrf
          <div class="form-group row">
              <label for="name" class="col-md-4 col-form-label text-md-right">Model Name</label>
              <div class="col-md-6">
              <div class="row">
                  <input id="name" type="name" class="form-control" name="name" required>
              </div>
              </div>
          </div>
        <div class="form-group row">
              <label for="file_type" class="col-md-4 col-form-label text-md-right">File Type</label>
              <div class="col-md-6">
              <div class="row">
                <select class="form-select" aria-label="Default select example" name="file_type" id="file_type">
                    <option value="gltf">GLTF</option>
                    <option value="obj">OBJ</option>
                    <option value="fbx">FBX</option>
                </select>
              </div>
              </div>
          </div>
          <div class="form-group row">
              <label for="file" class="col-md-4 col-form-label text-md-right">Upload Main File</label>
              <div class="col-md-6">
              <div class="row">
                  <input type="file" id="main"  class="form-control" name="main"  required>
              </div>
              </div>
          </div>
          <div class="form-group row">
              <label for="file" class="col-md-4 col-form-label text-md-right">Upload Other Files</label>
              <div class="col-md-6">
              <div class="row">
                  <input type="file" id="files"  class="form-control" name="files[]"  required multiple>
              </div>
              </div>
          </div>
          <div class="form-group row">
              <label for="preview" class="col-md-4 col-form-label text-md-right">Upload Preview Image</label>
              <div class="col-md-6">
              <div class="row">
                  <input type="file" id="preview"  class="form-control" name="preview"  required>
              </div>
              </div>
          </div>
          <div class="form-group row mb-0">
              <div class="col-md-6 offset-md-4">
                  <button type="button" class="btn btn-secondary" onclick="window.history.back()">Close</button>
                  <button type="submit" class="btn btn-primary" id="product_save_btn">
                      Upload Model
                  </button>
              </div>
          </div>
      </form>

使用 Ajax 调用提交表单:

$(document).ready(function() {
        $('#file-upload').submit(function(e) {
            e.preventDefault();
            let formData = new FormData(this);

            $.ajax({
                type:'POST',
                url: "{{ route('model.store') }}",
                data: formData,
                contentType: false,
                processData: false,
                success: (response) => {
                    console.log(response);
                    if (response.success) {
                        window.location.href = response.url;
                    }
                },
                error: function(response){
                    alert('Prescription has not been created successfully');
                }
          });
        });
    });

在后端,可以按如下方式实现 store() 方法:

  /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'files' => 'required',
            'file_type' => 'required',
            'main' => 'required',
            'preview' => 'required',
        ]);
        
        if ($validator->fails())
        {
            return response()->json(['errors'=>$validator->errors()->all()]);
        }

        $date = date('Y-m-d');
        $folder = $date.time();
        $files = $request->file('files');
        foreach ($files as $file) {
            $file_name = $file->getClientOriginalName();
            $fileName = pathinfo($file_name, PATHINFO_FILENAME);
         
            try {
                $path = Storage::disk('public')->PutFileAs($folder , $file, $file->getClientOriginalName());
            } catch (\Exception $e) {
                return false;
            }
        }

        if ($request->hasFile('preview')) {
            $file = $request->file('preview');
            $file_name = $file->getClientOriginalName();
            $imageName = time().'.'.$file->extension();  
            $preview_path = Storage::disk('public')->PutFileAs($folder, $file, $file->getClientOriginalName());
        
        }

        if ($request->hasFile('main')) {
            $file = $request->file('main');
            $file_name = $file->getClientOriginalName();
            $imageName = time().'.'.$file->extension();  
            $path = Storage::disk('public')->PutFileAs($folder,$file,$file->getClientOriginalName());
        
        }

        return response()->json(['success'=> true, 'msg'=>'Record is successfully added', 'url'=> '/home']);
    
    }

然后就可以在存储中看到上传的文件了。 它们被组织为单独的文件夹。 要显示 3D 模型,你需要路径 URL。
在这里插入图片描述

3、加载 3D 模型

在下面的示例中,我向你展示如何从 laravel 存储加载 fbx 模型。 同样,你可以轻松加载其他文件类型。 请理解并尝试首先针对一种文件类型实施它。

 if(myData['file_type'] == 'fbx'){
          init1();
        }else if(myData['file_type'] == 'obj'){
          init2();
        }
      
      
      function init1() {
            scene = new THREE.Scene();
            scene.background = new THREE.Color(0xdddddd);

            camera = new THREE.PerspectiveCamera(5, window.innerWidth/window.innerHeight, 1, 5000);
            camera.position.z = 1000;

            light = new THREE.HemisphereLight(0xffffff, 0x444444, 1.0);
            light.position.set(0, 1, 0);
            scene.add(light);

            light = new THREE.DirectionalLight(0xffffff, 1.0);
            light.position.set(0, 1, 0);
            scene.add(light);

            renderer = new THREE.WebGLRenderer({antialias:true});
            renderer.setSize(window.innerWidth, window.innerHeight);

            container = document.getElementById( 'canvas' );
            renderer.setSize(container.offsetWidth, 400);
            
            container.appendChild( renderer.domElement );

            controls = new THREE.OrbitControls(camera,  renderer.domElement);
            controls.addEventListener('change', renderer);
            const fbxLoader = new THREE.FBXLoader();
                let text1 = "storage/";
                let result = text1.concat(myData['url']);
                console.log(result);
                fbxLoader.load('{{ asset('storage/') }}'+'/'+myData['url']+'.fbx', (object) => {
                scene.add(object);
                animate();
            });
        }
        function animate(){
            renderer.render(scene,camera);
            requestAnimationFrame(animate);
        }

这里的方法根据3D模型文件类型而改变。


原文链接:PHP加载3D模型 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8Manage PPM项目管理系统独特的功能:项目完整性保护

项目有其内在复杂性&#xff08;项目管理的科学部分&#xff09;&#xff0c;这种复杂性可以进行划分和克服。项目也有人为的或偶然的复杂性&#xff08;项目管理的艺术部分&#xff09;&#xff0c;这种复杂性无法进行划分和克服。偶然的高复杂性会影响并使内在复杂性难以管理…

【系统架构设计师】计算机组成与体系结构 ① ( 计算机组成 | CPU | 存储器 | 总线 | IO 外设 | CPU 组成 | 运算器 | 控制器 )

文章目录一、计算机组成与体系结构二、计算机组成结构三、CPU 组成1、运算器2、控制器一、计算机组成与体系结构 计算机组成与体系结构 对应 大学的 计算机组成原理 课程 , 主要分为 : 计算机组成体系结构划分 两大知识板块 ; 在架构师考试时 , 平均分值是 3 分 ; 计算机组成…

三相可控全桥整流与DC Buck变换电路设计仿真问题汇总

目 录 问题 一、开关管没有打开的情况下&#xff0c;DC Buck输出负电压&#xff1f; 二、问题分析 1.输出端存在与母线电压反相的电压&#xff0c;因此可以确定为差模感应电压&#xff0c;如果输出端与母线端产生的是大小相等&#xff0c;方向相同的同相电压&#xff0c;则为共…

大数据框架之Hadoop:HDFS(六)DataNode(面试开发重点)

6.1DataNode工作机制 DataNode工作机制&#xff0c;如下图所示。 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳…

ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现

发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息&#xff0c;流程如图 步骤一 创建功能包&#xff08;工作空间为~/catkin_ws/src&#xff09; $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…

FLStudio水果最新版本V21支持中文语言

FL Studio简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio习惯叫它水果。软件现有版本是FLStudio21&#xff0c;已全面升级支持简体中文语言界面 。FL Studio 能让你的计算机就像是全功能的录音室一样&#xff0c;完成编曲、剪辑、录音、混音等工作&#xff0c;帮助爱好…

2023大厂高频软件测试面试真题(附答案)

一、接口测试面试题&#xff1a;1.接口测试是怎么做的&#xff0c;如何分析数据&#xff1f;接口测试实际跟一般测试不同就是测试用例的设计部分。获取接口规范。设计接口测试功能用例&#xff08;主要从用户角度出发看接口能否实现业务需求&#xff0c;用例设计就是黑盒用例那…

2022财年净新增1159家门店,百胜中国门店高速扩张背后有何阳谋?

中国最大餐饮企业百胜中国控股有限公司&#xff08;下称“百胜中国”&#xff09;&#xff0c;2月8日发布了2022年度第四季度及全年未经审核的财务业绩。 从财报数据来看&#xff0c;这家拥有肯德基、必胜客、黄记煌等诸多餐饮品牌的巨头&#xff0c;已经顺利渡过了疫情笼罩下…

计算机网络(第7版)第五章(物理层)知识点整理

计算机网络 参考书目&#xff1a;《计算机网络&#xff08;第7版&#xff09;》&#xff1a;谢希仁——电子工业出版社 《精通Windows Sockets网络开发--基于Visual C实现》&#xff1a;孙海民——人民邮电出版社 第五章&#xff1a;物理层计算机网络一、基本概念二、传输媒体…

和数集团打造《神念无界:源起山海》,诠释链游领域创新与责任

首先&#xff0c;根据网上资料显示&#xff0c;一部《传奇》&#xff0c;二十年热血依旧。 《传奇》所缔造的成绩&#xff0c;承载的是多少人的青春回忆&#xff0c;《传奇》无疑已经在游戏史上写下了浓墨重彩的一笔。 相比《传奇》及背后的研发运营公司娱美德名声大噪&#x…

uniapp上高德(百度)地图API的使用(APP安卓)

前言由于在app中没有document,window等对象&#xff0c;所以使用在pc端传统方法引入的方式&#xff0c;将会发现无法引用成功&#xff0c;会出现白屏现象。目前有两种解决方式&#xff1a;使用uniapp的web-view方式&#xff08;百度地图&#xff09;使用renderjs来调用document…

【51媒体网】媒体邀约行业诞生及其前景预测

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。一&#xff0c;媒体邀约行业的诞生媒体邀约行业是随着现代社会媒体的普及而逐渐形成的。随着互联网和社交媒体的快速发展&#xff0c;媒体作为信息传播的重要渠道之一&#xff0c;越来越成…

PPP协议实验及配置

PPP协议实验拓扑图PPP认证配置PAP认证CHAP认证接口地址不在一个网段&#xff1f;地址自动协商通过IPCP方式获取到默认路由拓扑图 首先在设备上增添两个Serial接口&#xff1a; PPP认证配置 PAP认证 AR1作为认证方&#xff0c;AR2作为被认证方&#xff1a; AR1&#xff1a…

Flask-SQLAlchemy的安装使用 一对多 多对多join查询

Flask-SQLAlchemy安装及设置 SQLALchemy 实际上是对数据库的抽象&#xff0c;让开发者不用直接和 SQL 语句打交道&#xff0c;而是通过 Python 对象来操作数据库&#xff0c;在舍弃一些性能开销的同时&#xff0c;换来的是开发效率的较大提升SQLAlchemy是一个关系型数据库框架…

yaml配置文件

最近在写代码&#xff0c;发现随着网络的增加&#xff0c;代码变得越来越冗余&#xff0c;所以就想着写一个网络的配置文件&#xff0c;把网络的配置放到一个文件中&#xff0c;而不再主函数中&#xff0c;这样代码开起来就好看了&#xff0c;调试的时候也方便了。之前写过一篇…

rollback-only异常令我对事务有了新的认识

背景 环境 相关环境配置&#xff1a; SpringBootPostGreSQL Spring Data JPA 问题 两个使用 Transaction 注解的 ServiceA 和 ServiceB&#xff0c;在 A 中引入了 B 的方法用于更新数据 &#xff0c;当 A 中捕捉到 B 中有异常时&#xff0c;回滚动作正常执行&#xff0c;但…

大数据01-Hadoop3.3.1伪分布式安装

目录Hadoop简介特性先决环境配置下载地址安装VMware创建虚拟机安装VMware Tools共享文件夹安装JavaSSH登录权限设置Hadoop伪分布式安装安装单机版HadoopHadoop伪分布式安装Hadoop WebUI管理界面测试HDFS集群以及MapReduce任务程序学习参考Hadoop 简介 Hadoop是Apache软件基金会…

【软件测试】资深8年测试,总结的测试经验。职场如战场......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 精力有限&#xff0…

[CVPR‘22] EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks

paper: https://nvlabs.github.io/eg3d/media/eg3d.pdfproject: EG3D: Efficient Geometry-aware 3D GANscode: GitHub - NVlabs/eg3d总结&#xff1a; 本文提出一种hybrid explicit-implicit 3D representation: tri-plane hybrid 3D representation&#xff0c;该方法不仅有…

GDI+绘图轻松入门[6]-路径变形和表盘的绘制

有了前面的坐标相关知识的了解&#xff0c;我们这次来实战一把&#xff0c;绘制一个表盘。当然&#xff0c;绘制表盘我们要学会GDI绘图中的路径绘图与两个必要的Transform变形函数&#xff0c;RotateTransform&#xff08;旋转变形&#xff09;、TranslateTransform&#xff08…