从 DB 加载 3d 模型并在 Three.js 中使用它

Posted

技术标签:

【中文标题】从 DB 加载 3d 模型并在 Three.js 中使用它【英文标题】:Loading a 3d model from DB and using it in Three.js 【发布时间】:2017-02-02 18:17:18 【问题描述】:

现在我的任务是从 mysql 数据库加载 3d 模型并在 Three.js 中使用它。

这是我所做的,

我创建了一个这样的数据库

modelsmodel_id int(4), model mediumblob;

我可以成功地将 JSON 格式的 3d 模型加载到数据库中。

我知道如何从数据库中检索数据。

但我的问题是 - '如何使从数据库加载的 JSON 文件供 Three.js 使用?'

我通常像这样加载 Json 文件

// instantiate a loader
var loader = new THREE.JSONLoader();

    // load a resource
    loader.load(
    // resource URL
    'models/animated/monster/monster.js',
    // Function when resource is loaded
    function ( geometry, materials ) 
        var material = new THREE.MultiMaterial( materials );
        var object = new THREE.Mesh( geometry, material );
        scene.add( object );
    
);

这是 Three.js 文档中的示例代码。

资源 URL 似乎是物理上位于根目录中的文件。 但我无法在脑海中弄清楚“如何将从数据库获得的模型加载到 Three.js?”

我不要求任何代码。

只是指导我在 Three.js 中加载文件

我熟悉加载简单图像。但这是面向 html 的。这是面向 Three.js 的。

【问题讨论】:

monster.js 文件路径相对于正在运行的 demo.html 文件。因此,如果您熟悉加载图像文件,您只需使用相同的路径结构。即好像您正在将图像文件加载到加载器中,但生成的路径指向 3d 模型 json。 我不使用路径来加载图像。它来自数据库。实际上我会查询图像数据。但是你能给我举个例子来用 JSONLoader 加载 json 吗? Three.JS 文档中示例代码的中间行。 'models/animated/monster/monster.js', 只需将此路径替换为 3d 模型的完整路径即可。路径长度和结构应该与加载图像文件时相同。 感谢您的回复 function load() $sql = "SELECT model FROM ovf_items_cycles"; if(!$res = $_ENV['db']->query($sql)) echo '操作失败'; while($row = $res->fetch_assoc() ) echo $row['pid'] 。 ' ' 。 $row['pname']; 【参考方案1】:

看看 Three.js 加载器是否有你使用的解析函数而不是加载函数。

【讨论】:

【参考方案2】:

看着I need my php page to show my BLOB image from mysql database 我会尝试服用 : <img src="image.php?id=<?php echo $image_id; ?>" /> 行并为 js 加载器使用 src 属性,因此在 js 中(我假设它通过 html 在网页上工作)类似于:

js:

// set up a path variable
var filed = 'model.php?id=<?php echo $sql_id; ?>'

// instantiate a loader

var loader = new THREE.JSONLoader();
// load a resource
loader.load(
// resource URL location
filed,
// Function when resource is loaded
function ( geometry, materials ) 
    var material = new THREE.MultiMaterial( materials );
    var object = new THREE.Mesh( geometry, material );
    scene.add( object );

);

然后是php:

<?php
function load()  $sql = "SELECT model FROM ovf_items_cycles"; if(!$res = $_ENV['db']->query($sql))  echo ' failed to operate';  while($row = $res->fetch_assoc() )  echo $row['pid'] . ' ' . $row['modeldata'];   
?>

这是一个草图,因为我的 php 不太好。但最终,如果您还可以将 blob 文件的路径存储在 sql 中并为 loader 变量访问该路径,那么最终会容易得多。

【讨论】:

我想我明白了..让我弄脏我的手..我明天会发布我的进度..所以和我在一起吧,伙计..谢谢.. file_id是否应该包含Json对象?? 我的 php 不太好,但也许你可以将file_id 更改为你的modeldata,但实际上你应该查找模型的路径位置。否则,我认为您会将模型数据加倍(一次在页面空间中,然后在 Three 加载它时再一次),这将导致问题。使用filed 变量来显示文件三的位置,而不是保存文件的内容。

以上是关于从 DB 加载 3d 模型并在 Three.js 中使用它的主要内容,如果未能解决你的问题,请参考以下文章

在web端,three.js如何操作3d模型obj对象的子构件

three.js如何加载带材质的obj外部模型

用three.js在网页实现3D模型

将模型导入three.js - 性能

THREE.JS 的首选 3d 模型格式 [关闭]

Three.js基础入门系列--导入3D模型