【发布时间】:2018-10-15 19:56:48
【问题描述】:
主要目标:将从 Maya 导出的动画模型加载到 React Native 应用程序中 导出的文件: obj、mtl 和 png 文件
我在我的 React Native 项目中设置了https://github.com/react-community/react-native-webgl,它工作正常。
现在,当我尝试使用 MTLLoader 加载 MTL 文件时,出现以下错误:
Can't find variable: document
显然,MTLLoader 正在调用 TextureLoader,它在内部调用了一些具有“文档”引用的加载函数。那么有什么办法可以解决这个问题呢?
这是我正在使用的两个文件:
三个.js
const THREE = require("three");
global.THREE = THREE;
if (!window.addEventListener)
window.addEventListener = () => { };
// require("three/examples/js/renderers/Projector");
require("three/examples/js/loaders/MTLLoader");
require("three/examples/js/loaders/OBJLoader");
export default THREE;
ThreeView.js
import React, { Component } from "react";
import { StyleSheet, View } from "react-native";
import { WebGLView } from "react-native-webgl";
import THREE from "./three";
import { image } from "src/res/image";
export default class ThreeView extends Component {
requestId: *;
componentWillUnmount() {
cancelAnimationFrame(this.requestId);
}
onContextCreate = (gl: WebGLRenderingContext) => {
const rngl = gl.getExtension("RN");
const { drawingBufferWidth: width, drawingBufferHeight: height } = gl;
const renderer = new THREE.WebGLRenderer({
canvas: {
width,
height,
style: {},
addEventListener: () => { },
removeEventListener: () => { },
clientHeight: height
},
context: gl
});
renderer.setSize(width, height);
renderer.setClearColor(0xffffff, 1);
let camera, scene;
let cube;
function init() {
camera = new THREE.PerspectiveCamera(75, width / height, 1, 1100);
camera.position.y = 150;
camera.position.z = 500;
scene = new THREE.Scene();
var mtlLoader = new THREE.MTLLoader();
mtlLoader.load('female-croupier-2013-03-26.mtl', function (materials) {
materials.preload();
var objLoader = new THREE.OBJLoader();
objLoader.setMaterials(materials);
objLoader.load('female-croupier-2013-03-26.obj', function (object) {
scene.add(object);
}, onLoading, onErrorLoading);
}, onLoading, onErrorLoading);
}
const onLoading = (xhr) => {
console.log((xhr.loaded / xhr.total * 100) + '% loaded');
};
const onErrorLoading = (error) => {
console.log('An error happened', error);
};
const animate = () => {
this.requestId = requestAnimationFrame(animate);
renderer.render(scene, camera);
// cube.rotation.y += 0.05;
gl.flush();
rngl.endFrame();
};
init();
animate();
};
render() {
return (
<View style={styles.container}>
<WebGLView
style={styles.webglView}
onContextCreate={this.onContextCreate}
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center"
},
webglView: {
width: 300,
height: 300
}
});
【问题讨论】:
-
您可以覆盖 ImageLoader 中的加载函数,并使用
var image = new Image()而不是document.createElementNS。 -
@2pha :“图像”是什么意思?反应原生图像组件?还是 Html 图片?我必须导入它吗?
-
我不知道如何导入正确的“图片”,所以现在我收到了
Can't find variable: Image -
Image 是用于创建 html 图像元素的构造函数,可替代调用
document.createElement。它不应该被导入。虽然我来自 html/web 的角度,但我不知道它是否可以在 React Native 中工作(我从未使用过它)。这只是一个尝试的建议。 -
我不认为它会像这样工作。 HTML 元素在 React Native 应用程序中不可用。
标签: react-native three.js