1# SceneNode
2本模块提供3D图形中场景资源结点的的类型及操作方法。
3
4> **说明:**
5> - 本模块首批接口从API version 12开始支持,后续版本的新增接口,采用上角标标记接口的起始版本。
6
7## 导入模块
8```ts
9import { LayerMask, NodeType, Container, Node, Geometry, LightType, Light, SpotLight, DirectionalLight,
10  Camera } from '@kit.ArkGraphics3D';
11```
12## LayerMask
13用于定义结点的图层掩码。
14
15### getEnabled
16getEnabled(index: number): boolean
17
18获取指定图层下标图层掩码的使能状态。
19
20**系统能力:** SystemCapability.ArkUi.Graphics3D
21
22**参数:**
23| 参数名 | 类型 | 必填 | 说明 |
24| ---- | ---- | ---- | ---- |
25| index | number | 是 | 要使能图层的下标,值域为大于等于0的整数。 |
26
27**返回值:**
28| 类型 | 说明 |
29| ---- | ---- |
30| boolean | 返回特定下标的图层是否使能,true表示使用图层掩码,false表示不使用。 |
31
32**示例:**
33```ts
34import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
35  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
36
37function layerMask() : void {
38  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
39  scene.then(async (result: Scene) => {
40    if (result) {
41      let node : Node | null = result.getNodeByPath("rootNode_");
42      if (node) {
43          // 获取掩码的使能状态
44          let enabled: Boolean = node.layerMask.getEnabled(1);
45      }
46    }
47  });
48}
49```
50
51### setEnabled
52
53setEnabled(index: number, enabled: boolean): void
54
55将特定下标的图层掩码使能。
56
57**系统能力:** SystemCapability.ArkUi.Graphics3D
58
59**参数:**
60| 参数名 | 类型 | 必填 | 说明 |
61| ---- | ---- | ---- | ---- |
62| index | number | 是 | 要使能图层的下标,值域为大于等于0的整数。 |
63| enabled | boolean | 是 | 要设置的使能状态,true表示使用图层掩码,false表示不使用。 |
64
65**示例:**
66```ts
67import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
68  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
69
70function layerMask() : void {
71  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
72  scene.then(async (result: Scene) => {
73    if (result) {
74      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
75      if (node) {
76          // 设置掩码状态
77          node.layerMask.setEnabled(1, true);
78      }
79    }
80  });
81}
82```
83
84## NodeType
85结点类型枚举。
86
87**系统能力:** SystemCapability.ArkUi.Graphics3D
88| 名称 | 值 | 说明 |
89| ---- | ---- | ---- |
90| NODE | 1 | 结点是空结点。 |
91| GEOMETRY | 2 | 几何类型结点。 |
92| CAMERA | 3 | 相机类型结点。 |
93| LIGHT | 4 | 灯光类型结点。 |
94
95## Container\<T>
96定义场景对象的容器。容器提供了一种将场景对象分组到层次结构中的方法。
97
98### append
99append(item: T): void
100
101追加一个对象到容器。
102
103**系统能力:** SystemCapability.ArkUi.Graphics3D
104
105**参数:**
106| 参数名 | 类型 | 必填 | 说明 |
107| ---- | ---- | ---- | ---- |
108| item | T | 是 | T类型对象。 |
109
110**示例:**
111```ts
112import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
113  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
114
115function append() : void {
116  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
117  scene.then(async (result: Scene) => {
118    if (result) {
119      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
120      // append 节点
121      result.root?.children.get(0)?.children.append(node);
122    }
123  });
124}
125```
126
127
128### insertAfter
129insertAfter(item: T, sibling: T | null): void
130
131在兄弟结点后面插入对象。
132
133**系统能力:** SystemCapability.ArkUi.Graphics3D
134
135**参数:**
136| 参数名 | 类型 | 必填 | 说明 |
137| ---- | ---- | ---- | ---- |
138| item | T | 是 | 要插入结点。 |
139| sibling | T \| null | 是 | 兄弟结点。 |
140
141**示例:**
142```ts
143import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
144  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
145
146function insertAfter() : void {
147  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
148  scene.then(async (result: Scene) => {
149    if (result) {
150      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
151      // insertAfter 节点
152      result.root?.children.get(0)?.children.insertAfter(node, null);
153    }
154  });
155}
156```
157
158### remove
159remove(item: T): void
160
161移除指定对象。
162
163**系统能力:** SystemCapability.ArkUi.Graphics3D
164
165**参数:**
166| 参数名 | 类型 | 必填 | 说明 |
167| ---- | ---- | ---- | ---- |
168| item | T | 是 | 要移除的对象。 |
169
170**示例:**
171```ts
172import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
173  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
174
175function remove() : void {
176  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
177  scene.then(async (result: Scene) => {
178    if (result) {
179      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
180      // remove 节点
181      result.root?.children.remove(node);
182    }
183  });
184}
185```
186
187### get
188get(index: number): T | null
189
190获取特定下标对象,获取不到则返回空。
191
192**系统能力:** SystemCapability.ArkUi.Graphics3D
193
194**参数:**
195| 参数名 | 类型 | 必填 | 说明 |
196| ---- | ---- | ---- | ---- |
197| index | number | 是 | 要获取对象的下标,取值范围是大于等于0的整数。 |
198
199**返回值:**
200| 类型 | 说明 |
201| ---- | ---- |
202| T \| null | 返回获取到的对象,获取不到则返回空值。 |
203
204**示例:**
205```ts
206import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
207  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
208
209function get() : void {
210  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
211  scene.then(async (result: Scene) => {
212    if (result) {
213      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
214      // 从children中get 0号节点
215      result.root?.children.get(0)?.children.insertAfter(node, null);
216    }
217  });
218}
219```
220
221### clear
222clear(): void
223
224清空容器内的所有对象。
225
226**系统能力:** SystemCapability.ArkUi.Graphics3D
227
228**示例:**
229```ts
230import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
231  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
232
233function clear() : void {
234  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
235  scene.then(async (result: Scene) => {
236    if (result) {
237      let node : Node | null = result.getNodeByPath("rootNode/Scene/");
238      // 清空children节点
239      result.root?.children.clear();
240    }
241  });
242}
243```
244
245### count
246count(): number
247
248获取容器中对象的数量。
249
250**系统能力:** SystemCapability.ArkUi.Graphics3D
251
252**返回值:**
253| 类型 | 说明 |
254| ---- | ---- |
255| number | 返回容器中对象个数。 |
256
257**示例:**
258```ts
259import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
260  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
261
262function count() : void {
263  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
264  scene.then(async (result: Scene) => {
265    if (result) {
266      let node : Node | null = result.getNodeByPath("rootNode_");
267      if (node) {
268        let container: Container<Node> = node.children;
269        // 获取children中的节点数
270        let count: number = container.count();
271      }
272    }
273  });
274}
275```
276
277## Node
2783D场景由树状层次结构的结点组成,其中每个结点都实现了Node接口。继承自[SceneResource](js-apis-inner-scene-resources.md#sceneresource)。
279
280### 属性
281
282**系统能力:** SystemCapability.ArkUi.Graphics3D
283
284| 名称 | 类型 | 只读 | 可选 | 说明 |
285| ---- | ---- | ---- | ---- | ---- |
286| position | [Position3](js-apis-inner-scene-types.md#position3) | 否 | 否 | 结点位置。 |
287| rotation | [Quaternion](js-apis-inner-scene-types.md#quaternion) | 否 | 否 | 结点旋转角度。 |
288| scale | [Scale3](js-apis-inner-scene-types.md#scale3) | 否 | 否 | 结点缩放。 |
289| visible | boolean | 否 | 否 | 结点是否可见,true表示该节点可见,false表示不可见。 |
290| nodeType | [NodeType](#nodetype) | 是 | 否 | 结点类型。 |
291| layerMask | [LayerMask](#layermask) | 是 | 否 | 结点的图层掩码。 |
292| path | string | 是 | 否 | 结点路径。 |
293| parent | [Node](#node) \| null | 是 | 否 | 结点的父结点,不存在则为空值。 |
294| children | [Container](js-apis-inner-scene-nodes.md#containert)\<[Node](#node)> | 是 | 否 | 结点的结点,不存在则为空值。 |
295
296### getNodeByPath
297getNodeByPath(path: string): Node | null
298
299根据路径获取结点,如果获取不到则返回空。
300
301**系统能力:** SystemCapability.ArkUi.Graphics3D
302
303**参数:**
304| 参数名 | 类型 | 必填 | 说明 |
305| ---- | ---- | ---- | ---- |
306| path | string | 是 | 场景结点层次中的路径。每层之间使用'/'符号进行分割。|
307
308**返回值:**
309| 类型 | 说明 |
310| ---- | ---- |
311| [Node](#node) \| null | 返回结点对象。 |
312
313**示例:**
314```ts
315import { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
316  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
317
318function getNode() : void {
319  let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
320  scene.then(async (result: Scene) => {
321    if (result && result.root) {
322      // 查找节点
323      let geo : Node | null = result.root.getNodeByPath("scene/node");
324    }
325  });
326}
327```
328
329## Geometry
330几何类型,继承自[Node](#node)。
331
332### 属性
333
334**系统能力:** SystemCapability.ArkUi.Graphics3D
335
336| 名称 | 类型 | 只读 | 可选 | 说明 |
337| ---- | ---- | ---- | ---- | ---- |
338| mesh | [Mesh](js-apis-inner-scene-resources.md#mesh) | 是 | 否 | 网格属性。 |
339
340
341## LightType
342光源类型枚举。
343
344**系统能力:** SystemCapability.ArkUi.Graphics3D
345
346| 名称 | 值 | 说明 |
347| ---- | ---- | ---- |
348| DIRECTIONAL | 1 | 平行光类型。 |
349| SPOT | 2 | 点光源类型。 |
350
351## Light
352光源,继承自[Node](#node)。
353
354### 属性
355
356**系统能力:** SystemCapability.ArkUi.Graphics3D
357
358| 名称 | 类型 | 只读 | 可选 | 说明 |
359| ---- | ---- | ---- | ---- | ---- |
360| lightType | [LightType](#lighttype) | 是 | 否 | 光源类型。 |
361| color | [Color](js-apis-inner-scene-types.md#color) | 否 | 否 | 颜色。 |
362| intensity | number | 否 | 否 | 光照密度,取值范围是大于0的实数。 |
363| shadowEnabled | boolean | 否 | 否 | 是否使能阴影,true表示添加阴影,false表示没有阴影效果。 |
364| enabled | boolean | 否 | 否 | 是否使能光源,true表示使用光源,false表示不使用。 |
365
366## SpotLight
367点光源类型,继承自[Light](#light)。
368
369**系统能力:** SystemCapability.ArkUi.Graphics3D
370
371## DirectionalLight
372平行光类型,继承自[Light](#light)。
373
374**系统能力:** SystemCapability.ArkUi.Graphics3D
375
376
377## Camera
378相机类型,Camera继承自[Node](#node)。
379
380### 属性
381
382**系统能力:** SystemCapability.ArkUi.Graphics3D
383
384| 名称 | 类型 | 只读 | 可选 | 说明 |
385| ---- | ---- | ---- | ---- | ---- |
386| fov | number | 否 | 否 | 视场,取值在0到π弧度之间。 |
387| nearPlane | number | 否 | 否 | 近平面,取值大于0。 |
388| farPlane | number | 否 | 否 | 远平面,取值大于nearPlane。 |
389| enabled | boolean | 否 | 否 | 是否使能相机,true表示使用相机,false表示不使用相机。 |
390| postProcess | [PostProcessSettings](js-apis-inner-scene-post-process-settings.md#postprocesssettings) \| null | 否 | 否 | 后处理设置。 |
391| clearColor | [Color](js-apis-inner-scene-types.md#color) \| null | 否 | 否 | 将渲染目标(render target)清空后的特定颜色。 |
392