webGPU orillusion(一)

关于架构的理解与认识

  Orillusion 核心借鉴了 ECS 结构,遵循 组合优于继承 的开发设计原则,实现了自己的组件系统。我们将传统复杂的逻辑划分为独立的、可重复利用的部分,每个部分可以单独封装运行逻辑。然后通过灵活组合的形式,将多个简单组件合并在一起运行从而表现复杂的功能和逻辑。

       也就是说,他会声明一个物体容器或者场景容器,而这个物体不会有任何属性。所有的属性诸如threejs等中的摄像机、几何体、控制器等,都只是该物体容器的一个属性。也就是说,摄像机不再是引擎内部的一个预设对象,他只是有摄像属性的物体。从性质上讲,他与开发者创造的其他物体并无区别,这是很不同于threejs等的一方面。这是对于各类物体更底层的抽象,道家所谓缘起性空,性空缘起,大抵如此。一个物体之所以有他的意义,是在于他有不同的属性,除过不同的属性,他只是一个空的容器。比如:

  • 相机 = Position + Rotation + Camera3D
  • 灯泡 = Position + Rotation + PointLight + Shadow
  • 盒子 = Position + Rotation + Scale + BoxGeometry + Material

       其中,所有组件都是独立且平等的,且各自只负责一个单独的功能,这样的拆分使得 Position 和 Rotation 模块可以重复利用,在使用时按需要组合即可,大大提高代码的利用效率,也能有效降低各个模块间的耦合性。

基础用法

//创建一个实体
let obj = new Object3D();
//将实体添加到场景中
scene.addChild(obj);

 添加组件

let obj = new Object3D();
let light = obj.addComponent(DirectLight)

 删除组件

let obj = new Object3D();
let light = obj.removeComponent(DirectLight)

 停用组件

let obj = new Object3D();
let light = obj.getComponent(DirectLight)
light.enable = false

 

启用组件

let obj = new Object3D();
let light = obj.getComponent(DirectLight)
light.enable = true

 LookAt()与控制器setCamera()

setCamrea的优先级高于LookAT(),即使你对LookAT()函数进行了设置,也会优先使用setCamera的默认值,也就是说,挂载了控制器就会使用控制器对摄像机的位置属性。(如图)

1  camera.lookAt(
2         new Vector3(10, 0, 0),
3         new Vector3(0, 0, 0),
4         new Vector3(0, 1, 0)
5       );
6 
7       controller.setCamera(new Vector3(10, 10, 10), new Vector3(0, 0, 0));
8       scene.addChild(CameraObj);

运行截图:

 

posted @ 2023-06-03 18:49  gis_BlackCaat  阅读(92)  评论(0编辑  收藏  举报