Похоже, что предоставленный код создает класс ThreeStage, который импортируется, но никогда не используется классом, содержащим Expo GraphicsView.
В примерах, представленных в репозитории для выставки-3, используется немного эзотерикиструктура, поскольку каждый из них предназначен для обслуживания через реагирующее навигационное приложение с централизованной библиотекой ресурсов и абстрактными компонентами.Это очень много для простого приложения, которое просто пытается отобразить модель на экране.
import React from 'react';
import ExpoTHREE, { THREE } from 'expo-three';
import { GraphicsView } from 'expo-graphics';
export default class App extends React.Component {
componentDidMount() {
THREE.suppressExpoWarnings();
}
render() {
return (
<GraphicsView
onContextCreate={this.onContextCreate}
onRender={this.onRender}
onResize={this.onResize}
/>
);
}
// When our context is built we can start coding 3D things.
onContextCreate = async ({ gl, pixelRatio, width, height }) => {
// Create a 3D renderer
this.renderer = new ExpoTHREE.Renderer({
gl,
pixelRatio,
width,
height,
});
// We will add all of our meshes to this scene.
this.scene = new THREE.Scene();
this.scene.background = new THREE.Color(0xbebebe)
this.camera = new THREE.PerspectiveCamera(45, width/height, 1, 1000)
this.camera.position.set(3, 3, 3);
this.camera.lookAt(0, 0, 0);
this.scene.add(new THREE.AmbientLight(0xffffff));
await this.loadModel();
};
loadModel = async () => {
const obj = {
"museu.obj": require('../Conteudos_AV/museu1.obj')
}
const model = await ExpoTHREE.loadAsync(
obj['museu.obj'],
null,
obj
);
// this ensures the model will be small enough to be viewed properly
ExpoTHREE.utils.scaleLongestSideToSize(model, 1);
this.scene.add(model)
};
// When the phone rotates, or the view changes size, this method will be called.
onResize = ({ x, y, scale, width, height }) => {
// Let's stop the function if we haven't setup our scene yet
if (!this.renderer) {
return;
}
this.camera.aspect = width / height;
this.camera.updateProjectionMatrix();
this.renderer.setPixelRatio(scale);
this.renderer.setSize(width, height);
};
// Called every frame.
onRender = delta => {
// Finally render the scene with the Camera
this.renderer.render(this.scene, this.camera);
};
}
Я адаптировал этот код из одного из примеров легких закусок Эвана, за которым немного легче следить, так каку них нет больших накладных расходов всего примера приложения.Вы можете найти больше на его странице с закусками: https://expo.io/snacks/@bacon.
Этот код должен отображать ваш объектный файл, но может столкнуться с проблемами, если ваш .obj использует дополнительные файлы материалов или текстур.Если это так, вам нужно добавить их в функцию loadModel следующим образом:
const obj = {
"museu.obj": require('../Conteudos_AV/museu1.obj'),
"museu.mtl": require('../Conteudos_AV/museu1.mtl'),
"museu.png": require('../Conteudos_AV/museu1.png'),
}
const model = await ExpoTHREE.loadAsync(
[obj['museu.obj'], obj['museu.mtl']],
null,
obj
);
Я бы порекомендовал взглянуть на закуски экспо, которые используют экспо-три, а не пример приложения, когдаВы начинаете, поскольку может быть немного затруднительно работать со всеми тонкостями примера.
У меня нет устройства, пригодного в данный момент для тестирования, но дайте мне знать, еслиу вас есть какие-либо проблемы с приведенным выше кодом, и я могу устранить неполадки, когда я снова рядом с телефоном и ноутбуком.