Stream gltf from HttpServlet to <web-viewer> element



我有一个Tomcat在里面运行JavaWebApplication。我想使用<model-viewer>元素(此处为信息(来显示具有"可更改"纹理的3D模型。因此,我想从Servlet获得必要的gltf文件,这样我就可以对它产生影响,而不仅仅是访问一个文件。我知道,两者(gltf结构和我的webapp中的模型查看器(都可以工作,因为如果我这样引用src,它可以完美地工作:

<model-viewer
poster-color="black"
poster="<%=
"ressource?type=coloredmodelpic&key=" +
model +
"&ptype=" +
type +
"&color=" +
color
%>"
camera-controls
auto-rotate
alt="<%= "A 3D model of " + model + "-" + type %>"
src="data/RON-AA/RON-AA.gltf">

而RON-AA.gltf显然持有json结构。对poster属性的调用也可以完美地工作,但当我想使用同一个servlet("ressource"所指的servlet(来流式传输数据时,它不会显示模型。

<model-viewer
poster-color="black"
poster="<%=
"ressource?type=coloredmodelpic&key=" +
model +
"&ptype=" +
type +
"&color=" +
color
%>"
camera-controls
auto-rotate
alt="<%= "A 3D model of " + model + "-" + type %>"
src="<%=
"ressource?type=gltf&key=" +
model +
"&ptype=" +
type +
"&color=" +
color
%>"
>

我知道调用本身是有效的,因为当我在任何浏览器中直接调用url时,我都会下载正确的gltf。它也提供了正确的数据,因为当我在vim中查看下载时,它似乎没问题。在servlet中,我提供的数据如下(并不像在一些方法上传播的那样,但总体上是这样(:

...
case "gltf":
key = request.getParameter("key");
ptype = request.getParameter("ptype");
colorString = request.getParameter("color");
response.setContentType("model/gltf+json");
response.setHeader("Content-Type", "model/gltf+json");
InputStream is;
OutputStream os = response.getOutputStream();
is = new FileInputStream(new File("...path to the same gltf... .gltf"));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) 
os.write(buffer, 0, bytesRead);

os.flush();
os.close();
is.close();

因此,我确实设置了正确的(?(mimetype,并访问了正确的"模板"来测试流,因为vim中的结果是正确的数据。它甚至让我更加困惑,因为当我试图为相同的模型查看器元素设置流式传输二进制文件而不是gltf时,它是有效的。因此,以下操作很好:

...
case "glb":
key = request.getParameter("key");
ptype = request.getParameter("ptype");
colorString = request.getParameter("color");
response.setContentType("model/gltf-binary");
response.setHeader("Content-Type", "model/gltf-binary");
InputStream is;
OutputStream os = response.getOutputStream();
is = new FileInputStream(new File("...path to the glb... .glb"));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) 
os.write(buffer, 0, bytesRead);

os.flush();
os.close();
is.close();[info here][1]

有人能给我一个提示吗,出了什么问题,因为我现在真的没有主意。。。

JSON*.gltf文件本身可能包含也可能不包含模型的所有部分。它可以引用外部.bin文件,并将纹理作为外部.jpg.png文件。BIN文件尤其包含32位浮点顶点数据,因此如果没有该文件,您将看不到单个多边形。

您可以检查.gltf的内容,看看它是否在那里:搜索.bin.jpg.png.bin将被列在一个称为buffers的部分中,而图像则被列在名为images的部分中。

此外,检查DevTools Network选项卡,看看<model-viewer>是否真的请求了这些外部文件,以及每个文件的响应是什么。

对于网站托管,.glb通常是最好的形式,因为所有这些额外的部分都捆绑在一个下载中。GLB的目的是在网络上提供最好的性能,任何glTF的各种口味。

相关内容

  • 没有找到相关文章

最新更新