【发布时间】:2019-01-15 12:23:03
【问题描述】:
所以,我会尽力解释。我正在 React.js 中开发一个应用程序,我在开发此应用程序时正在学习该应用程序。我现在需要一个 3D 元素,它是一张沙发,在我的页面中,应该允许用户使用鼠标移动和旋转对象。
我开始使用 Three.js 这似乎是我需要的最佳选择,因为 3D 来自请求的 JSON 文件到通过令牌访问的 API。因此,我使用 Three.js 中的 JSONloader 来加载 JSON 文件并将其输出到渲染函数中。
这是它现在在控制台上的错误:
[![在此处输入图片描述][1]][1]
我将在下面留下代码:
import React from 'react';
import * as THREE from 'three';
import { ArrowSofa } from './ArrowSofa';
const line = (<Line />);
const mod = <Modulos />;
var loader = new THREE.JSONLoader();
var scene = new THREE.Scene();
export class Sofa extends React.Component {
constructor(props) {
super(props);
this.state = {
token: {},
isLoaded: false,
model: {}
};
}
componentDidMount() {
/* here are the fetches to have an API response with authentication token */
fetch(url + '/couch-model/' + this.props.match.params.id + '/', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'JWT ' + (JSON.parse(localStorage.getItem('token')).token)
}
}).then(res => {
if (res.ok) {
return res.json();
} else {
throw Error(res.statusText);
}
}).then(json => {
this.setState({
model: json,
isLoaded: true
}, () => { });
})
}
render() {
const { model, isLoaded } = this.state;
if (isLoaded) {
let json_3d = model.layout_set[0].json_3d;
loader.load('url' + json_3d,
function (geometry, materials) {
var mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
scene.add(mesh);
});
}
if (!isLoaded) {
return (
<div id="LoadText">
Loading...
</div>
)
} else {
return (
<div id="Sofa">
<h2>{model.area_set.map(area => area.name)}</h2>
<h1>{model.name}</h1>
<p>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...</p>
{/* I want to show the 3D model here */}
<ArrowSofa
handleAddOne={this.handleAddOne}
handleLessOne={this.handleLessOne} />
</div>
);
}
}
}
JSON 文件: [jsonblob.com/87e6971a-9a2a-11e8-804a-6546f7c36ad8][2]
所以我现在真的不知道该怎么做,或者如果我将代码放在正确的位置,有人可以帮忙吗?
有任何疑问,如果我不够清楚,我会在这里回答。抱歉打扰了。
更新 - 现在没有错误,但仍然不知道我是否有任何对象可以渲染
【问题讨论】:
-
'谢谢'删除之前的问题和答案 - 很抱歉你仍然不明白提示 - 你可以要求以后的解释。如果您遇到问题 - 将其分解 - 一个要获取的组件,一个要显示 3d 的子组件(传递道具)。您仍然应该在渲染之外的生命周期中创建场景。
-
对不起,这个问题已经过时了,所以没有意义......然后我如何在渲染中显示对象? @xadm
-
有一个提示 - 创建场景(在生命周期中启动 [chain of] 函数)并使用 ref 附加到节点 - 我做到了,它有效 - 你是否尝试显示任何,未加载,甚至使用反应组件的空场景?从那开始?稍后传递加载的数据。检查数据,它看起来不包含模型,我之前也写过 - 你需要多少人声称错误?
-
不,对不起,我昨天刚开始使用three.js,如果我的怀疑看起来有点愚蠢,我只是想了解事情的运作逻辑。如果你不想帮忙,我理解。
-
我的每个答案/cmets 都包含提示 - 如果你不阅读/分析/学习 - 你没有帮助自己。解决这个烂摊子对你没有帮助 - 开始分解问题。
标签: javascript reactjs three.js 3d