#typescript #aframe
Вопрос:
Я работаю над веб-проектом angular с aframe.
У меня есть модель данных, которая содержит прямоугольные кнопки с URL-адресами для их изображений (jpg, png, gif). Однако при попытке загрузить эти текстуры я получаю следующие предупреждения:
компоненты:текстура:предупреждение
$s
не является допустимым видео https://s3.eu-central-1.amazonaws.com/…-bed3-06ba2a75717c.png
(url сокращен, обратите внимание, как это png
)
Кнопки также кажутся черными без текстуры.
Вот как я создаю свои кнопки:
buttons.forEach((b: ButtonV4) => {
const button: Entity = document.createElement("a-plane");
const url: string = this.envService.buildURL(b.image);
button.setAttribute("src",url);
button.setAttribute("position",new THREE.Vector3(b.x,b.y,b.z));
button.setAttribute("rotation",new THREE.Vector3(0,0,b.rotation));
button.setAttribute("width",b.width);
button.setAttribute("height",b.height);
button.setAttribute("material", "transparent: true;");
sceneRoot.appendChild(button);
});
Есть ли способ это исправить?
Редактировать:
Я заметил, что он отлично воспроизводит URL-адреса видео. Т. е. предоставление файла mp4 позволяет воспроизводить видео в виде текстуры.
Комментарии:
1. Без ссылки для воспроизведения будет трудно помочь, исследовать и предложить конкретные решения. glitch.com/~рамка очень удобна. ФУ-У-У. согласно документам синтаксис встроенного URL-адреса таков
material="src: url(url/to/texture.png)
Ответ №1:
Проблема в моем сервере данных. Установлен тип контента application/octet-stream
, который я не могу изменить (вне моей досягаемости). aframe, похоже, автоматически интерпретирует это как файл mp4/видео.
png
Однако, поскольку мои файлы заканчиваются jpg
, mp4
я проверяю окончание файла и создаю URL-адрес данных с правильным типом mime.
return this.http.get<File>(url,{responseType: "blob" as "json",headers}).pipe(
switchMap((blob: File) => {
return new Observable<Texture>(
(obs: Observer<Texture>) => {
const fr: FileReader = new FileReader();
fr.onload = (e: ProgressEvent<FileReader>) => {
let dataUrl: string = e.target.result as string;
const mime: string = this.getMimeTypeFromURL(url);
dataUrl = dataUrl.replace("application/octet-stream",mime);
obs.next(new Texture(url,dataUrl));
};
fr.onloadend = () => obs.complete();
fr.onabort = (e: ProgressEvent<FileReader>) => obs.error(e.target.error);
fr.onerror = (e: ProgressEvent<FileReader>) => obs.error(e.target.error);
fr.readAsDataURL(blob);
}
);
})
);
private getMimeTypeFromURL(url: string): string {
if(url.endsWith("jpg")) {
return "image/jpg";
}
if(url.endsWith("jpeg")) {
return "image/jpg";
}
if(url.endsWith("png")) {
return "image/png";
}
if(url.endsWith("gif")) {
return "image/gif";
}
return "application/octet-stream";
}