这是关于javascript和three.js编码样式约定的问题。我更喜欢使用最新的ES协议。
我想知道是否不是像往常一样:
var scene = new THREE.Scene();
var cube = new THREE.Mesh(new THREE.BoxGeometry(1,1,1), new THREE.MeshBasicMaterial(0xffffff))
scene.add(cube)
可以将网格对象(以及其他对象,可能是灯光甚至是相机)存储为场景对象的属性:
const scene = new THREE.Scene(); // or var, but that's not my question
scene.cube = THREE.Mesh(new THREE.BoxGeometry(1,1,1), new THREE.MeshBasicMaterial(0xffffff))
scene.add(scene.cube)
我喜欢在scene
名称空间下引用所有Three.js对象的想法,这使我以后更容易访问它们。我知道我可以将它与.name和.getObjectByName一起使用,但这需要更多代码,而且对我来说似乎更麻烦。
答案 0 :(得分:2)
就关注点分离而言,您不想使用Three的对象作为数据持有者。这似乎是一个简单的解决方法,但会大大降低代码的可维护性。但是,没有什么可以阻止您今天这样做。考虑一下,您将拥有
scene.cube
scene.children[0] //same cube
scene.getObjectById(... cube id ...) //same cube
//... byName, ...byProperty etc. all pointing to the same cube
请记住,Scene
扩展了Object3D
的所有方法和属性,因此,在下面的示例场景中,所有对象都是Object3D,每个对象都具有children[]
属性。
[scene]
+----^-----------------------------+
[chairGroup] [light]
+--^--+-----+-----+-----+------+
[leg] [leg] [leg] [leg] [back] [seat]
上面的每个节点看起来都不像DOM的Element吗?
我鼓励您将您的场景想象成一棵树。实际上,任何UI都是元素的n树:web,移动,X11等,每个UI框架都是操纵此类树的工具。您用来操纵DOM树的所有方法在这里都有效。
因此,以下是从简单到复杂的各种组织代码的方法:
scene
,camera
和renderer
移到一些上下文对象中,您可以在各个图层之间传递它们。在浏览器中将其视为document
的等效项。 我希望,这个答案将帮助人们围绕Three.js进行一些最适合其项目的战术架构。